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.