Ist es möglich, den Status des letzten Befehlsausgangs ( $?
) nach einem Test unverändert zu lassen?
ZB möchte ich machen:
command -p sudo ...
[ $? -ne 1 ] && exit $?
Der letzte exit $?
sollte den sudo-Exit-Status zurückgeben, gibt jedoch immer zurück 0
(den Exit-Code des Tests).
Ist das ohne temporäre Variable möglich?
Ein weiteres Beispiel zur weiteren Verdeutlichung:
spd-say "$@"
[ $? -ne 127 ] && exit $?
In diesem Fall möchte ich nur beenden, wenn der erste Befehl gefunden wird (Exit-Code! = 127
). Und ich möchte mit dem eigentlichen spd-say
Exit-Code beenden (möglicherweise nicht
0
).
EDIT: Ich habe vergessen zu erwähnen, dass ich eine POSIX-Beschwerdelösung für eine bessere Portabilität bevorzuge.
Ich verwende dieses Konstrukt in Skripten, in denen ich Alternativen für denselben Befehl bereitstellen möchte. Siehe zum Beispiel mein crc32-Skript .
Das Problem mit temporären Variablen besteht darin, dass sie andere Variablen beschatten können. Um zu vermeiden, dass Sie lange Namen verwenden müssen, ist dies für die Lesbarkeit des Codes nicht gut.
[ $? -ne 127 ] && exit $?
)
sudo
Befehl erfolgreich ist (dh wenn er sudo
mit dem Status 0 beendet wird). Aber in Ihrem Code läuft das Skript weiter (wird nicht beendet), wenn sudo
es erfolgreich ist
command
und überhaupt nicht basieren sudo
. Das ist gemeint mit Ich möchte nur beenden, wenn der erste Befehl gefunden wird (Exit-Code! = 127) und ist eine angegebene Rückgabe,command
wenn der aufgerufene Befehl nicht gefunden wird. Ich denke, das Problem ist, dass das Aufrufen sudo
als Teil des Tests es ermöglicht, sudo
die Rückkehr von command
an erster Stelle zu quetschen und so den Test zu verzerren .
if ! command -p sudo; then exit; fi
was für Ihr Beispiel die gleichen Ergebnisse hätte.