Der folgende Befehl druckt „0“ oder „1“ korrekt, je nachdem, ob ein Fehler auftritt oder nicht, weil ich $? in den „su“-Befehl eingefügt habe.
sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?"
Wenn ich jedoch Folgendes mache:
sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"; echo $?
Es wird immer „0“ ausgegeben, da das eigentliche „su“ immer erfolgreich ist, auch wenn der Befehlsteil fehlschlägt.
Irgendeine Idee, wie ich den Exitcode der Subshell abrufen kann?
Antwort1
Ich habe gerade fast genau dieselbe Situation behoben. Hoffe, es hilft Ihnen trotzdem, wenn nicht, dann vielleicht anderen. Ich habe mit su angefangen, nicht mit sudo, aber da sudo dazu gedacht ist, einen einzelnen anderen Befehl einzuschließen, sollte es eigentlich den Exit-Code von su weiterleiten. Wenn nicht, können Sie den folgenden Fix auch auf der Sudo-Ebene anwenden.
Wie Sie bemerkt haben, besteht das Hauptproblem darin, dass su seinen Befehl erfolgreich ausführt. Die Standardaktion besteht dann darin, zu melden, dass er ohne Probleme abgeschlossen wurde, und daher den Exit-Code 0 zurückzugeben. Es „weiß“ nicht, dass ein Exit-Code ungleich 0 von einem Befehl unerwartet war oder dass es etwas damit tun sollte. Daher besteht die Lösung ganz einfach darin, su dazu zu bringen, den Exit-Code seines letzten Befehls zurückzugeben. Das hat bei mir funktioniert.
su <user_x> -c '<bunch_of_commands>; exit $?'
Falls sudo nicht richtig funktioniert, sollte der gesamte Befehl ungefähr so aussehen (ich würde das für Sie überprüfen, aber ich habe sudo nicht installiert):
sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'
Achten Sie auf die Verschachtelung der Anführungszeichen und stellen Sie sicher, dass „$?“ nicht erweitert wird, also keine doppelten Anführungszeichen.
Antwort2
Geben Sie den Rückgabewert innerhalb des Befehls aus und greifen Sie von außerhalb darauf zu, indem Sie den gesamten Befehl einer Variablen zuweisen (mithilfe einer Subshell).
RETVAL=$(sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?")
echo $RETVAL
Antwort3
Sie können immer eine temporäre Datei verwenden:
$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null; echo \$? > /tmp/exit_code"; cat /tmp/exit_code
Antwort4
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 einer Einzeiler-Anweisung anfordern, er aber verfügbar ist, wenn Sie für die gleiche Aufgabe mehr als eine Zeile verwenden.