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-sayExit-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 $?)
sudoBefehl erfolgreich ist (dh wenn er sudomit dem Status 0 beendet wird). Aber in Ihrem Code läuft das Skript weiter (wird nicht beendet), wenn sudoes erfolgreich ist
commandund ü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 sudoals Teil des Tests es ermöglicht, sudodie Rückkehr von commandan erster Stelle zu quetschen und so den Test zu verzerren .
if ! command -p sudo; then exit; fiwas für Ihr Beispiel die gleichen Ergebnisse hätte.