Accesso a un codice di uscita esterno a su -m $ USER -c “<cmd>”


8

Il comando seguente stampa correttamente "0" o "1" a seconda dell'errore o meno perché ho messo $? all'interno del comando "su".

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

Tuttavia, se lo faccio:

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

stampa sempre "0" perché l'attuale "su" avrà sempre successo, anche se la parte del comando fallisce.

Qualche idea su come posso recuperare il codice di uscita della subshell?

Risposte:


7

Ho appena risolto quasi esattamente la stessa situazione. Spero che ti aiuti ancora, se non poi forse altri. Ho iniziato da su, non da sudo, ma poiché sudo ha lo scopo di racchiudere un singolo altro comando, dovrebbe davvero inoltrare il codice di uscita di su. In caso contrario, puoi applicare la correzione di seguito anche a livello di sudo.

Come hai notato, il problema principale è che su esegue correttamente il suo comando. L'azione predefinita è quindi quella di segnalare che è stata completata senza problemi e quindi restituisce il codice di uscita 0. Non "sa" che un codice di uscita diverso da 0 da un comando era inaspettato o che dovrebbe fare qualcosa con esso. Quindi la soluzione è semplicemente fare in modo che su restituisca il codice di uscita del suo ultimo comando. Questo è stato per me

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

Se sudo non suona bene, l'intero comando dovrebbe essere qualcosa del genere (controllerei questo per te ma non ho installato sudo)

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

Guarda per annidare le virgolette e assicurarti $? non si espande, quindi non ci sono doppie virgolette.


2

Eco il valore restituito all'interno del comando e accedervi all'esterno assegnando l'intero comando a una variabile (usando una subshell).

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

0

Puoi sempre usare un file tmp:

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

Sì, questo è quello che sto facendo in questo momento, ma speravo di non fare affidamento su un file tmp.
Nick,

0

Funziona con le shell Zsh / Bash / Bourne:

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

Non sono sicuro del motivo per cui il codice di ritorno non è disponibile quando lo si richiede in una riga, ma è disponibile quando si utilizza più di una riga per fare la stessa cosa.


Questo in realtà non è corretto. Questo restituirà sempre zero perché "su -m $ USER -c <cmd>" avrà sempre successo anche se il comando effettivo al suo interno non lo fa.
Nick,

1
@Nick - Funziona qui. Qual è il tuo risultato? Prova sudo su -m zero2cx -c "/bin/false &> /dev/null"ma con il tuo nome utente di sistema. $?dovrebbe essere "1".
zero2cx,

Sì, con il mio nome utente restituisce "1" come previsto. Ma sto provando a usarlo per eseguire un'app tramite il suo stesso utente e non root o qualsiasi altro utente.
Nick,

@Nick - Dovrebbe funzionare con $ USER=appusernameset come desideri. Non utilizzare un vero nome utente, insread usa il tuo previsto appusername. Dovrebbe funzionare, lo fa per me.
zero2cx,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.