Zugriff auf einen Exit-Code außerhalb eines su -m $ USER -c "<cmd>" </cmd>

5858
Nick

Der folgende Befehl gibt "0" oder "1" korrekt aus, je nach Fehler oder nicht, weil ich $? innerhalb des "su" -Befehls.

sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?" 

Wenn ich das jedoch mache:

sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"; echo $? 

es wird immer "0" ausgegeben, da das tatsächliche "su" immer erfolgreich ist, auch wenn der Befehlsteil fehlschlägt.

Irgendeine Idee, wie ich den Exit-Code der Subshell abrufen kann?

8

4 Antworten auf die Frage

7
Captain Coder

Ich habe fast genau dieselbe Situation behoben. Hoffe es hilft dir trotzdem, wenn nicht dann vielleicht anderen. Ich habe von su angefangen, nicht von sudo, aber da sudo einen einzigen anderen Befehl einwickeln soll, sollte es wirklich den Exit-Code von su weiterleiten. Wenn nicht, können Sie den folgenden Fix auch auf der Sudo-Ebene anwenden.

Wie Sie bemerkt haben, ist das Hauptproblem, dass su seinen Befehl erfolgreich ausführt. Die Standardaktion ist dann, zu melden, dass sie ohne Probleme abgeschlossen wurde, und gibt den Exit-Code 0 zurück. Sie "weiß" nicht, dass ein Exit-Code eines Befehls, der nicht 0 ist, unerwartet war oder dass er etwas damit tun sollte. Die Lösung besteht also ganz einfach darin, dass su den Exit-Code des letzten Befehls zurückgibt. Das hat es für mich getan

su <user_x> -c '<bunch_of_commands>; exit $?' 

Falls sudo nicht nett ist, sollte der gesamte Befehl so aussehen (ich würde das für Sie überprüfen, aber ich habe kein sudo installiert)

sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?' 

Achten Sie auf die Verschachtelung von Anführungszeichen und stellen Sie sicher, dass $? wird nicht erweitert, also keine Anführungszeichen.

2
Aaron Copley

Echo the return value inside the command and access it outside by assigning the whole command to a variable (using a subshell.)

RETVAL=$(sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?") echo $RETVAL 
0
terdon

You could always use a tmp file:

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null; echo \$? > /tmp/exit_code"; cat /tmp/exit_code 
Ja, das mache ich gerade, aber ich hatte gehofft, mich nicht auf eine tmp-Datei zu verlassen. Nick vor 11 Jahren 0
0
zero2cx

Dies funktioniert in Zsh / Bash / Bourne-Shells:

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null" $ echo $? 

Ich bin nicht sicher, warum der Rückgabecode nicht verfügbar ist, wenn Sie ihn in einem Einzeiler anfragen, aber er ist verfügbar, wenn Sie mehr als eine Zeile verwenden, um dasselbe zu tun.

Das ist eigentlich nicht richtig. Dies wird immer Null zurückgeben, da "su -m $ USER -c"wird immer erfolgreich sein, auch wenn der eigentliche Befehl darin nicht funktioniert. Nick vor 11 Jahren 0
@ Nick - Es funktioniert hier. Was ist deine Ausgabe? Versuchen Sie `sudo su -m zero2cx -c" / bin / false &> / dev / null "`, jedoch mit Ihrem System-Benutzernamen. "$?" sollte "1" sein. zero2cx vor 11 Jahren 1
Ja, mit meinem eigenen Benutzernamen wird wie erwartet "1" zurückgegeben. Aber ich versuche, dies zu verwenden, um eine App über ihren eigenen Benutzer und nicht über Root oder einen anderen Benutzer auszuführen. Nick vor 11 Jahren 0
@Nick - Es sollte funktionieren, wenn $ USER = Benutzername? Eingestellt ist, wie Sie möchten. Verwenden Sie keinen echten Benutzernamen, sondern verwenden Sie Ihren beabsichtigten "Benutzernamen". Es sollte funktionieren, für mich. zero2cx vor 11 Jahren 0