Ich habe einige ähnliche Fragen (wie Wie setze ich eine Variable auf die Ausgabe von einem Befehl in Bash? ), aber die akzeptierten Antworten scheinen für mich nicht zu funktionieren. Ich war mir nicht sicher, ob ich die Frage eines anderen entgleisen oder mein eigenes Duplikat veröffentlichen sollte, also entschuldige mich, wenn ich hier falsch gewählt habe.
Ich möchte den Ausgabe- und Exit-Status einiger Befehle in einem Skript erhalten, das ich zusammenstelle. Hier ist ein Beispiel von dem, was ich benutzt habe:
%Vor%Die Protokoll- und Fehlerfunktionen sind:
%Vor%Im obigen Beispiel verwende ich das $ (cmd) -Format, aber ich habe auch versucht, Backticks zu verwenden.
In meiner Protokolldatei sehe ich nur Folgendes:
FATAL ERROR: Fehler beim Entfernen des Originals, die Ausgabe war: \ n
Auch die Ausgabe der fehlgeschlagenen Befehle endet wie üblich auf dem Bildschirm. Gibt es einen allgemeinen Grund, dass meine cmd_output-Variablen leer bleiben würden?
Sie müssen die Ausgabe des speziellen Standardfehlerausgabe-Streams einschließen:
%Vor%Es gibt drei Standard-Streams für jedes Programm (nummerierte Dateideskriptoren):
%Vor% Um die Fehlermeldungen zu erfassen, müssen wir die Standardfehlerausgabe (stderr) in die normale Standardausgabe (stdout) umleiten, die dann vom $(...)
-Ausdruck erfasst wird.
Die Syntax für die Umleitung ist über den >
"Operator". Unmittelbar davor sagen Sie, welcher Dateideskriptor umgeleitet werden soll (der Standardwert ist 1, also stdout). Und Sie können es angeben, um in eine Datei umzuleiten. Wenn Sie danach ein kaufmännisches Und-Zeichen ( &
) schreiben, erzwingen Sie, dass es in einen anderen Dateideskriptor umgeleitet wird. Daher leiten wir in diesem Beispiel den Dateideskriptor 2 (stderr) in den Dateideskriptor 1 (stdout) um.
Sie können die Eingabe auch mit <
"operator" umleiten, aber in diesem Fall ist der Standard-Dateideskriptor 0 (stdin).
Eine weitere Beobachtung ist, dass es wahrscheinlich eine gute Übung ist, die Variable $file
in doppelte Anführungszeichen zu setzen, falls sie Leerzeichen enthält.
Hoffe das hilft ein wenig =)
* nix-Befehl hat im Allgemeinen zwei Ausgabeformen: Standardausgabe ( stdout
) und Standardfehler ( stderr
).
FOO=$(...)
erfasst nur stdout
und lässt stderr
ungehindert.
Wenn Sie den Inhalt von stderr
mit dieser Syntax haben wollen, müssen Sie Ihren Befehl mit 2>&1
postfixieren, damit stderr
in stdout
zusammengeführt wird. (z.B. so: rm $file 2>&1
)
Da Ihre fail
-Funktion gerade beendet wird, wäre es viel einfacher zu tun:
Der einzige Unterschied zwischen diesem und dem ursprünglichen Code besteht darin, dass dies nicht der Fall ist
Drucke den Text FATAL ERROR:
. Da Kürze eine Tugend ist, würde es wahrscheinlich
besser ist es, die Funktion log
vollständig zu überspringen. Fehler laut melden; gelingen
leise.
Tags und Links command-line bash shell ubuntu