Wie man die Ausgabe von einem bash-Befehl in einer Variablen
Ich habe folgenden durch einige der ähnliche Fragen (wie So setzen Sie eine variable, um die Ausgabe von einem Befehl in der Bash?), aber die akzeptierten Antworten scheinen nicht für mich arbeiten. Ich war mir nicht sicher, ob ich sollte zu entgleisen jemand anderes die Frage oder mein eigenes doppelte, also entschuldige mich, wenn ich falsch gewählt hier.
Möchte ich die Ausgabe-und exit-status über eine Reihe von Befehlen in einem Skript bin ich der Zusammenstellung. Hier ist ein Beispiel, was ich habe mit:
cmd_output=$(rm $file)
exit_status=$?
if [ "${exit_status}" -eq 0 ]
then
log "Successfully removed the original" ${TAB_LEVEL}
else
fail "Failed to remove the original, the output was: \n ${cmd_output}"
fi
Log und fehl-Funktionen sind:
# Usage: fail "Failure message"
function fail {
echo "FATAL ERROR: $1" >> "${LOG_DIR}/${LOG_FILE}"
exit 1
}
# Usage: log "Log message" 3 Where the tab-level is 3.
function log {
if (("${2}" > 0))
then
eval "printf ' %.0s' {1..$2}" >> "${LOG_DIR}/${LOG_FILE}"
fi
echo "$1" >> "${LOG_DIR}/${LOG_FILE}"
return 0
}
In dem Beispiel oben habe ich die $(cmd) - format, aber ich habe auch versucht, mit backticks.
In meine log-Datei, alles, was ich sehe, wenn es ein Fehler ist:
SCHWERWIEGENDER FEHLER: Fehler beim entfernen der originalen, der Ausgang war: \n
Auch die Ausgabe von fehlgeschlagene Befehle landet auf dem Bildschirm wie gewohnt. Gibt es einen gemeinsamen Grund, dass meine cmd_output Variablen würde leer bleiben?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie die Ausgabe der spezielle standard-Fehler-Ausgabestrom:
Gibt es drei Standard-streams auf jedem Programm (das sind nummeriert Datei-Deskriptoren):
So erfassen Sie die Fehlermeldungen, wir müssen die Umleitung der standard-Fehlerausgabe (stderr) in normale standard-Ausgabe (stdout), die dann gefangen werden, indem die
$(...)
Ausdruck.Die syntax für die Umleitung ist über die
>
"operator". Unmittelbar bevor er Sie sagen, welche Datei-Deskriptor umleiten (die Standardeinstellung ist 1, das ist die Ausgabe auf stdout). Und Sie können angeben, die Umleitung in eine Datei. Wenn Sie schreiben Sie ein kaufmännisches und-Zeichen (&
), nachdem es, Sie zwingen, es zu Umleitung in eine Datei-Deskriptor. Also, in diesem Beispiel, wir leiten den file-Deskriptor 2 (stderr) in die Datei-Deskriptor 1 (stdout).Außerdem können Sie auch umleiten von Eingabe-mit
<
"Betreiber", aber in diesem Fall wird die Standard-Datei-Deskriptor 0 (Standardeingabe).Eine andere Beobachtung ist, dass es wahrscheinlich eine gute Praxis, um Ihre
$file
Variablen zwischen doppelten Anführungszeichen, falls Sie Leerzeichen.Hoffe, das hilft ein wenig =)
*nix-Befehl haben in der Regel zwei Formen der Ausgabe: standard-Ausgabe (
stdout
) und Standardfehler (stderr
).FOO=$(...)
erfasst nurstdout
und Blätterstderr
ungehindert.Wenn Sie möchten, dass der Inhalt
stderr
mit dieser syntax, müssen Sie postfix deinen Befehl mit2>&1
so dassstderr
zusammengeführtstdout
. (z.B. etwa so:rm $file 2>&1
)Seit Ihr
fail
Funktion einfach beenden, es wäre viel einfacher, einfach das zu tun:Der einzige Unterschied zwischen dieser und der original-code ist, dass es nicht
drucken Sie den text
FATAL ERROR:
. Da Bescheidenheit ist eine Tugend, wäre es wahrscheinlichbesser zu sein, zu überspringen
log
Funktion vollständig. Fehler laut; gelingtschweigend.