Acessando um código de saída fora de su -m $USER -c ""

Acessando um código de saída fora de su -m $USER -c ""

O comando abaixo imprime "0" ou "1" corretamente dependendo da falha ou não porque coloquei $? dentro do comando "su".

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

No entanto, se eu fizer isso:

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

sempre imprimirá "0" porque o "su" real sempre será bem-sucedido, mesmo se a parte do comando falhar.

Alguma ideia de como posso recuperar o código de saída do subshell?

Responder1

Acabei de consertar quase exatamente a mesma situação. Espero que ainda ajude você, se não, talvez outros. Comecei com su, não com sudo, mas como o sudo se destina a agrupar um único outro comando, ele realmente deveria retransmitir o código de saída do su. Caso contrário, você também pode aplicar a correção abaixo no nível sudo.

Como você notou, o principal problema é que su executa seu comando com sucesso. A ação padrão é então relatar que foi concluído sem problemas e, portanto, retorna o código de saída 0. Ele não "sabe" que um código de saída diferente de 0 de um comando foi inesperado ou que deveria fazer algo com ele. Assim, a solução é simplesmente fazer su retornar o código de saída do seu último comando. Isso fez isso por mim

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

Caso o sudo não funcione bem, todo o comando deve ser algo assim (eu verificaria isso para você, mas não tenho o sudo instalado)

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

Observe o aninhamento das cotações e certifique-se de que $? não é expandido, portanto, não há aspas duplas.

Responder2

Faça eco do valor de retorno dentro do comando e acesse-o externamente, atribuindo todo o comando a uma variável (usando um subshell).

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

Responder3

Você sempre pode usar um arquivo tmp:

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

Responder4

Isso funciona em shells Zsh/Bash/Bourne:

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

Não sei por que o código de retorno não está disponível quando você o solicita em uma linha, mas está disponível quando você usa mais de uma linha para fazer a mesma coisa.

informação relacionada