Wie unterdrücke ich die dd-Ausgabe?


35

Ich habe ein Bash-Skript, mit dem eine Datei erstellt wird dd. Das Problem ist, dass dd eine große Menge an Ausgaben ausgibt, die sich negativ auf die Ausgabe meines Skripts auswirken. Beim Durchsuchen habe ich eine Lösung gefunden:

dd if=boot1h of="/dev/r$temp1" >& /dev/null

Gibt es eine Alternative oder wird auf /dev/nullden einzigen Weg umgeleitet ?


3
Ich verliere mich bei Ihrem letzten Satz: "Das Skript sollte nicht nach Berechtigungen fragen". Das hat anscheinend nichts mit der Weiterleitung zu zu tun /dev/null- Sie arbeiten an Sudo, weil Sie Schreibzugriff ddbenötigen /dev/r$temp1(nehme ich an). Sie müssen dies unabhängig davon tun, wie Sie die ddAusgabe unterdrücken . Umleiten der Ausgabe auf /dev/nullerfordert keine Root
Michael Mrozek

Ich bin ein Idiot. Es gab eine Operation, die wegen der Verwendung von / dev / r $ temp1 / nicht erlaubt war. Es tut mir wirklich leid. Ich bearbeite ein Skript, das nicht von mir stammt und es nicht bemerkt hat. Wirklich leid.
Dierre

so dass das Problem ist normaler Benutzer nicht schreiben kann / dev / r $ temp1 oder dev / null
jet

Mach dir keine Sorgen; Ich habe es ein wenig bearbeitet, um den verwirrenden Teil zu entfernen
Michael Mrozek

1
Wenn Sie keine der erweiterten Funktionen von dd verwenden cat, verwenden Sie headoder tail.
Gilles 'SO - hör auf böse zu sein'

Antworten:


16

Von der dd(1)Manpage:

   status=noxfer
          suppress transfer statistics

somit:

dd if=boot1h of="/dev/r$temp1" status=noxfer

Dies gibt immer noch die

0+1 records in
0+1 records out

Müll beim ddBeenden, so dass die Umleitung zu einer Datensenke wirklich Ihre einzige Option ist.


Ich hatte Angst davor.
Dierre

Ich glaube, status = noxfer, könnte mit dem SIGUSR1-Signal zusammenhängen, das normalerweise die Übertragungsstatistik anzeigt. Ich bin jedoch nicht bereit zu testen, ob es stimmt, was ich sage.
Maxadamo

54

Hinzufügen status=none:

dd if=boot1h of="/dev/r$temp1" status=none

Aus den dd (coreutils) 8.21-Dokumenten :

'status=LEVEL'
     Transfer information is normally output to stderr upon receipt of
     the 'INFO' signal or when 'dd' exits.  Specifying LEVEL will adjust
     the amount of information printed, with the last LEVEL specified
     taking precedence.

     'none'
          Do not print any informational or warning messages to stderr.
          Error messages are output as normal.

     'noxfer'
          Do not print the final transfer rate and volume statistics
          that normally make up the last status line.

     'progress'
          Print the transfer rate and volume statistics on stderr, when
          processing each input block.  Statistics are output on a
          single line at most once every second, but updates can be
          delayed when waiting on I/O.

@roaima - nur neugierig, warum ein Zitat aus der Manpage bearbeiten?
don_crissti

@don_crissti Ich hatte das Gefühl, dass der (fehlende) Kontext beim Extrahieren des Zitats aus der Manpage dazu führte, dass eine etwas andere Form von Wörtern erforderlich war. Wie es in der Manpage steht, ist es in Ordnung; hier sah es komisch aus.
Roaima

@roaima - alles in Ordnung - Neugierde zufrieden :) - aber beachten Sie, dass Sie auf den Link info page; Die ursprüngliche Antwort hier hatte das genaue Zitat aus der man page. Ich hätte direkt von der infoSeite kopiert / eingefügt, wenn die manSeite nicht eindeutig wäre, aber es liegt an Ihnen ... Übrigens, vielen Dank für Ihren weiteren Kommentar zu meiner Antwort zum Sortieren nach Wochentag.
don_crissti

@don_crissti Ich konnte keine Online-Manpage finden, die das Zitat enthielt. danke dafür (die.net hat die älteren ddohne status=)
Roaima

3
Scheint nicht in dd (coreutils) verfügbar zu sein 8.13: dd: invalid status flag: `none' Try `dd --help' for more information.
Per Lundberg

5

Zum späteren Nachschlagen:

Um die Ausgabe von dd vollständig zu unterdrücken, leiten Sie stderr wie folgt nach / dev / null um:

dd if=/dev/urandom of=sample.txt bs=5MB count=1 2> /dev/null

Dies funktioniert sehr gut, wenn Sie zum Beispiel den Prozess mit dem Befehl time in bash zeitlich festlegen und das Ergebnis einer Variablen zuweisen möchten, ohne die Ausgabe zu erhalten, die dd erzeugt.

Referenz: http://www.unix.com/shell-programming-and-scripting/131624-how-suppress-dd-output.html


2

So etwas sollte auch für Sie mit den neuesten Versionen von BASH und ZSH funktionieren:

dd if=/path/to/file of=/path/to/another_file bs=1M count=1 &> /dev/null

PS Dies ist nur ein Beispiel, das ich lief ...


2

Mit jeder Unix-Anwendung oder jedem Befehl können Sie alle Ausgaben mit unterdrücken

cmd >/dev/null 2>&1

Das erste Bit leitet die Standardausgabe (Einheitennummer 1) nach / dev / null um. Sie benötigen jedoch den zweiten Teil, um die Fehlerausgabe (Einheitennummer 2) AUCH an dieselbe Stelle wie Nummer 1 umzuleiten.

In UNIX ist STDIN = 0, STDOUT = 1 und STDERR = 2



1
Eigentlich stderrhat der Dateideskriptor 2 . (Ich nehme an, "STDERR = 3" ist nur ein Tippfehler.)
21.

1
Es ist unerwünscht, alle Ausgaben zu unterdrücken. Wenn ein Fehler auftritt, möchten wir die Fehlermeldung sehen.
Sam Watkins

cmd 2>logfile.txtscheint mehr angepasst
TheSola10

0

Wenn ich richtig verstehe, was Sie versuchen, setzen Sie diesen sudoBefehl in das Skript ein und erwarten, dass das Skript zur Eingabe Ihres Kennworts auffordert, wenn es dort ausgeführt wird? In diesem Fall tun Sie die Dinge nur auf komplizierte Weise.

Eine sauberere Lösung besteht darin, das Skript wie gewohnt zu schreiben (dh ohne sudo) und es als Superuser auszuführen . Der Grund dafür ist, wenn das Skript Superuser-Zugriff benötigt, geben Sie ihm einfach den Zugriff (warum bis zu einem bestimmten Befehl warten?). Um im Skript zu überprüfen, ob es als root ausgeführt wird, gehen Sie wie folgt vor:

if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

Nee. Genau das möchte ich nicht tun. Ich möchte nicht, dass das Skript nur als root ausgeführt wird, weil ich nicht möchte, dass dd die Ausgabe anzeigt. Ihre Prüfung würde korrigieren, wenn ich das Skript als Superuser ausführen möchte.
Dierre

@dierre Also warum brauchst du sudodas überhaupt? Normale Benutzer sollten in der Lage sein, Dinge in /dev/nullOrdnung umzuleiten .
Phunehehe

Ich benutze Ubuntu und es gibt mir Betrieb nicht erlaubt ... ähm ...
dierre

Es tut mir Leid. Ich habe nicht bemerkt, dass ich etwas unter / dev / erstellt habe. Das Skript gehört nicht mir, ich habe es bearbeitet. Es tut mir wirklich leid.
Dierre

0

Sie können die Ausgabe in eine reguläre Datei umleiten, dh:

 dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.