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?

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.


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

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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.