Wie unterdrücke ich die dd-Ausgabe?

Ich habe ein Bash-Skript, das eine Datei mit dd erstellt. Das Problem ist, dass dd eine große Menge an Ausgabe auslöst, die mit der Ausgabe meines Skripts in Konflikt geraten wird. Beim Durchsuchen habe ich eine Lösung gefunden:

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

Gibt es eine Alternative oder wird zu /dev/null umgeleitet Nur so?

Kommentare

  • Ich ‚ bin in Ihrem letzten Satz “ Das Skript sollte keine Berechtigungen anfordern „. Das ‚ scheint nichts damit zu tun zu haben Umleiten zu /dev/null – Sie ‚ sudoing, weil dd Schreibzugriff auf /dev/r$temp1 (nehme ich an). Sie ‚ müssen dies tun, unabhängig davon, wie Sie dd ‚ s Ausgabe; Umleitung der Ausgabe zu /dev/null erfordert ‚ kein root
  • Ich ‚ bin ein Idiot. Es gab eine Operation, die wegen der Verwendung von / dev / r $ temp1 / nicht erlaubt war. I

Es tut mir wirklich leid. Ich ‚ bearbeite ein Skript, das ‚ nicht von mir stammt und ‚ es nicht bemerkt hat . Es tut mir wirklich leid.

  • Das Problem ist also, dass normale Benutzer nicht in / dev / r $ temp1 oder in dev / null schreiben können.
  • Don ‚ Mach dir darüber keine Sorgen; Ich habe es ein wenig bearbeitet, um den verwirrenden Teil zu entfernen.
  • Wenn Sie ‚ keine von dd ‚ verwenden Verwenden Sie für erweiterte Funktionen stattdessen cat, head oder tail.
  • Antwort

    Auf der Manpage dd(1):

     status=noxfer suppress transfer statistics 

    also:

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

    Dies gibt immer noch die

    0+1 records in 0+1 records out 

    Müll, wenn dd beendet wird, so dass die Umleitung zu einer Datensenke wirklich Ihre einzige Option ist.

    Kommentare

    • das war ich ‚ fürchte mich.
    • Ich glaube, status = noxfer könnte mit dem SIGUSR1-Signal zusammenhängen, das normalerweise die Übertragung anzeigt Statistik. Ich bin jedoch nicht bereit zu testen, ob ‚ wahr ist, was ich sage.

    Antwort

    Fügen Sie status=none hinzu:

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

    Aus dem dd (coreutils) 8.21 docs :

     "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.  

    Kommentare

    • @roaima – nur neugierig, Warum ein Zitat aus der Manpage bearbeiten?
    • @don_crissti Ich hatte das Gefühl, dass der (fehlende) Kontext beim Extrahieren des Zitats aus der Manpage bedeutet, dass eine etwas andere Form von Wörtern erforderlich ist. Wie es in der Manpage steht ist ‚ in Ordnung; hier sah es seltsam aus.
    • @roaima – in Ordnung – Neugier befriedigt 🙂 – aber beachten Sie, dass Sie auf die info page verlinken; Die erste Antwort hier hatte das genaue Zitat aus der man page . Ich hätte direkt von der Seite info kopiert / eingefügt, wenn die Seite man mehrdeutig ist, aber wirklich bis zu Ihnen … Oh, Übrigens, vielen Dank für Ihren anderen Kommentar zu meiner Antwort im Zusammenhang mit der Sortierung nach Wochentag.
    • Scheint ‚ nicht in dd (coreutils) 8.13 verfügbar zu sein: dd: invalid status flag: `none' Try `dd --help' for more information.
    • IMO Dies sollte die akzeptierte Antwort sein.

    Antwort

    Zum späteren Nachschlagen:

    Um die dd-Ausgabe 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 gut, wenn Sie beispielsweise den Prozess mit dem Befehl time in bash zeitlich festlegen und das Ergebnis einer Variablen zuweisen möchten, ohne die von dd erzeugte Ausgabe zu erhalten.

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

    Antwort

    So etwas sollte auch mit neueren Versionen von BASH und ZSH funktionieren:

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

    P.S. Dies ist nur ein Beispiel, das ich ausgeführt habe …

    Antwort

    Mit jeder Unix-Anwendung oder jedem Unix-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 AUCH die Fehlerausgabe (Einheit Nummer 2) an dieselbe Stelle wie Nummer 1 umzuleiten.

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


    Kommentare

    • Eigentlich stderr hat den Dateideskriptor 2 . (Ich gehe davon aus, dass “ STDERR = 3 “ nur ein Tippfehler ist.)
    • Es ist unerwünscht, alle Ausgaben zu unterdrücken . Wenn ein Fehler auftritt, möchten wir die Fehlermeldung sehen.
    • cmd 2>logfile.txt scheint besser angepasst zu sein

    Antwort

    Wenn ich richtig verstehe, was Sie versuchen, fügen Sie den Befehl sudo in das Skript ein und erwarten das Skript, das Sie zur Eingabe Ihres Kennworts auffordert, wenn es dort ausgeführt wird? In diesem Fall machen Sie die Dinge nur auf komplizierte Weise.

    Eine sauberere Lösung besteht darin, das Skript auf die übliche Weise zu schreiben (dh ohne sudo) und führen Sie es als Superuser aus . 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 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 

    Kommentare

    • nein. Das ‚ ist genau das, was ich ‚ nicht tun möchte. 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 korrigiert, wenn das Skript als Superuser ausgeführt werden soll.
    • @dierre Warum brauchten Sie also überhaupt sudo? Normale Benutzer sollten in der Lage sein, Dinge an /dev/null umzuleiten.
    • Ich ‚ verwende Ubuntu und es ‚ gibt mir den Betrieb nicht erlaubt … ähm …
    • 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 ‚ sehr leid.

    Antwort

    Sie können Leiten Sie die Ausgabe in eine reguläre Datei um, z. B.:

     dd if=boot1h of="/dev/r$temp1" >& /tmp/dd.log 

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.