Wie bekomme ich die Ausgabe eines Bash-Befehls in einer Variablen?

8

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?

    
Chris O'Kelly 05.10.2012, 01:52
quelle

3 Antworten

24

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 =)

    
Janito Vaqueiro Ferreira Filho 05.10.2012, 01:56
quelle
5

* 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 )

    
antak 05.10.2012 02:02
quelle
0

Da Ihre fail -Funktion gerade beendet wird, wäre es viel einfacher zu tun:

%Vor%

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.

    
William Pursell 05.10.2012 04:24
quelle

Tags und Links