Acceder a un código de salida fuera de su -m $ USER -c "<cmd>"

8

El siguiente comando imprime "0" o "1" correctamente dependiendo de la 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 falla la parte del comando.

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

Mella
fuente

Respuestas:

7

Acabo de arreglar casi exactamente la misma situación. Espero que todavía te ayude, si no, quizás a otros Empecé desde su, no sudo, pero dado que sudo está destinado a envolver un solo comando, realmente debería transmitir el código de salida de su. Si no, también puede aplicar la corrección a continuación en el nivel de sudo.

Como notó, el problema principal es que su ejecuta con éxito su comando. La acción predeterminada es informar que se completó sin problemas y, por lo tanto, devuelve el código de salida 0. No "sabe" que un código de salida que no sea 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 mi

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

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

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

Esté atento a la anidación de comillas y asegúrese de $? no se expande, por lo que no hay comillas dobles.

Capitán Codificador
fuente
2

Haga eco del valor de retorno dentro del comando y acceda al exterior asignando el comando completo a una variable (usando una subshell).

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

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
terdon
fuente
Sí, esto es lo que estoy haciendo en este momento, pero esperaba no confiar en un archivo tmp.
Nick
0

Esto funciona en Zsh / Bash / Bourne shells:

$ 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 de una sola línea, pero está disponible cuando usa más de una línea para hacer lo mismo.

zero2cx
fuente
Esto en realidad no es correcto. Esto siempre devolverá cero porque el "su -m $ USER -c <cmd>" siempre tendrá éxito incluso si el comando real no lo hace.
Nick
1
@ Nick - Funciona aquí. ¿Cuál es tu salida? Intente sudo su -m zero2cx -c "/bin/false &> /dev/null"pero con su nombre de usuario del sistema. $?debería ser '1'.
zero2cx
Sí, con mi propio nombre de usuario devuelve "1" como se esperaba. Pero estoy tratando de usar esto para ejecutar una aplicación a través de su propio usuario y no root o cualquier otro usuario.
Nick
@Nick: debería funcionar con el $ USER=appusernameconjunto que desees. No use un nombre de usuario real, insread use su intención appusername. Debería funcionar, lo hace para mí.
zero2cx