Accediendo a un código de salida fuera de su -m $USER -c ""

Accediendo a un código de salida fuera de su -m $USER -c ""

El siguiente comando imprime "0" o "1" correctamente dependiendo de si falla o no porque puse $. dentro del comando "su".

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

Sin embargo, si hago esto:

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

siempre imprimirá "0" porque el "su" real siempre tendrá éxito, incluso si la parte del comando falla.

¿Alguna idea de cómo puedo recuperar el código de salida del subshell?

Respuesta1

Acabo de arreglar casi exactamente la misma situación. Espero que todavía te ayude, si no, quizás a otros. Comencé desde su, no desde sudo, pero dado que sudo está destinado a incluir un solo comando más, realmente debería transmitir el código de salida de su. De lo contrario, también puede aplicar la solución siguiente en el nivel sudo.

Como notó, el problema principal es que su ejecuta con éxito su comando. La acción predeterminada es informar que se completó sin ningún problema y, por lo tanto, devuelve el código de salida 0. No "sabe" que un código de salida distinto de 0 de un comando fue inesperado o que debería hacer algo con él. Por lo tanto, la solución es simplemente hacer que su devuelva el código de salida de su último comando. Esto lo hizo por mí

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

En caso de que sudo no funcione bien, todo el comando debería ser algo como esto (lo comprobaría por ti, pero no tengo sudo instalado)

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

Esté atento al anidamiento de cotizaciones y asegúrese de que $? no se expande, por lo que no hay comillas dobles.

Respuesta2

Haga eco del valor de retorno dentro del comando y acceda a él afuera asignando todo el comando a una variable (usando un subshell).

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

Respuesta3

Siempre puedes usar un archivo tmp:

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

Respuesta4

Esto funciona en shells Zsh/Bash/Bourne:

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

No estoy seguro de por qué el código de retorno no está disponible cuando lo solicita en una sola línea, pero está disponible cuando usa más de una línea para hacer lo mismo.

información relacionada