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, weildd
Schreibzugriff auf/dev/r$temp1
(nehme ich an). Sie ‚ müssen dies tun, unabhängig davon, wie Siedd
‚ 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.
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 derman page
. Ich hätte direkt von der Seiteinfo
kopiert / eingefügt, wenn die Seiteman
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