Ich habe also ein Programm, das möglicherweise einen Segmentierungsfehler verursacht (./segf), das auch andere Daten in stderr schreibt. Wenn das Programm einen Segmentierungsfehler verursacht, ist sein Rückgabecode 139 (d. h. es echo $?
wird gedruckt 139
).
Ich würde stderr gerne umleiten /dev/null
, um die Ausgabe zu vermeiden. Dies ./segf 2>1
führt jedoch dazu, dass der Rückgabecode auf 1 gesetzt wird ( ). Jetzt ist es nicht mehr möglich zu unterscheiden, ob das Programm tatsächlich einen Segmentierungsfehler aufweist oder nur einen Fehler zurückgibt.
Ist es möglich, andere Fehler von stderr weiterzuleiten und gleichzeitig noch prüfen zu können, ob der Rückgabecode 139 wäre?
./segf >/dev/null; echo $?
Ergebnisse in 139
./segf >/dev/null 2>1; echo $?
ergibt 1
bash -c './segf'
Ergebnisse in 139
bash -c './segf' 2>1
ergibt 1
Antwort1
Keine der von Ihnen versuchten Maßnahmen sollte den Beendigungsstatus beeinflussen. Sie können mit diesem sehr einfachen Skript testen:
#!/bin/sh
echo out
echo err >&2
exit 139
Führen Sie es nun mit den verschiedenen Weiterleitungen aus:
$ foo.sh; echo $?
out
err
139
#redirect stdout to /dev/null and stderr to a file called '1'
$ foo.sh >/dev/null 2>1; echo $?
139
## Redirect stderr to /dev/null
$ foo.sh 2>/dev/null; echo $?
out
139
Die Umleitung des stderr eines Befehls erfolgt einfach durch command 2>/dev/null
, aber das sollte sich nie auf den Exit-Status des Befehls auswirken, es sei denn, die Umleitung schlägt fehl. Dies ist in Ihrem Fall wahrscheinlich tatsächlich passiert. Wenn Sie keine Schreibberechtigungen in dem Verzeichnis haben, in dem Sie sich befinden, und versucht haben, ./segf >/dev/null 2>1
(anstelle von ./segf >/dev/null 2>&1
) auszuführen, hätte dies versucht, einDateiaufgerufen 1
, um stderr umzuleiten. Wenn die Datei nicht erstellt werden kann, erhalten Sie den folgenden Exit-Status 1
:
$ foo.sh 2>1; echo $?
bash: 1: Permission denied
1