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 ?

dierre
quelle
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.

Amphetamachine
quelle
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.
orgoj
quelle
@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

CSCH
quelle
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 ...

Schrägstrich
quelle
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


Michael Dillon
quelle
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
phunehehe
quelle
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
Jet
quelle