Ich möchte stderr oder stdout eines Befehls in eine Datei oder eine Variable umleiten, basierend auf Exit-Code des Befehls. Wenn der Exit-Code gleich null ist, würde ich stdout in die Datei umleiten, sonst würde ich nach stderr umleiten.umleiten Befehl auf eine Variable oder eine Datei basierend auf seinem Exit-Code Bash-Skript?
Antwort
Probieren Sie etwas wie folgt aus:
a) fangen die Ausgabe:
OUT=`grep -c test myfile.txt`
b) umleiten (ohne irgendetwas anderes in der Zwischenzeit zu tun) die Umgebungsvariable OUT
nach dem Exit-Status in der Lage spezielle Variable $?
:
if [ "$?" -eq 0 ];
then
echo "succes with output=$OUT";
else
echo "failure with output=$OUT";
fi
natürlich muss man genau nach dem ersten, um den zweiten Teil stellen ke ep der richtige Wert in $?
.
Wenn der Ausgang zu groß ist; leite es zuerst in eine temporäre Datei um und benenne dann die temporäre Datei entsprechend dem Exit-Code um.
Leider gibt es keine Möglichkeit, sowohl stdout und stderr zu erfassen und sie in verschiedenen Variablen zu speichern, ohne den Befehl zweimal auszuführen. Stattdessen müssen Sie die Ausgabe in andere temporäre Dateien umleiten und dann die gewünschte Ausgabe basierend auf dem Beendigungscode beibehalten. Zum Beispiel:
#Send the output to different files
dosomething >tempout 2>temperr
case $? in
0)
mv tempout outfile.txt
rm temperr;;
1)
mv temperr outfile.txt
rm tempout;;
2)
mv tempout outfile.txt
cat temperr >> outfile.txt
rm temperr;;
3)
var=$(cat tempout)
rm tempout temperr
#...etc
esac
sollte die Aufgabe erledigen. Vergessen Sie nicht, die case-Anweisung abzuschließen, wenn Sie stderr (oder beide) an eine Variable senden möchten.
kann ich/dev/null anstelle einer temporären Datei verwenden und später auf eine Variable umleiten? – Starc
Meinst du damit, die Ausgabe nach/dev/null umzuleiten und sie dann irgendwie zu finden? Es gibt keine Möglichkeit, das zu tun, sobald du etwas an/dev/null schickst, zerschmeißt du es für immer, daher die temporären Dateien. – Ocab19
Ich muss stderr und stdout separat speichern, damit ich tun kann, wie Sie in b) erwähnt haben, Gibt es eine Möglichkeit? – Starc
Sie können dies tun, indem Sie auf zwei verschiedene temporäre Dateien umleiten. –