Acessando um código de saída fora de um su -m $ USER -c “cmd”

8

O comando abaixo imprime "0" ou "1" corretamente, dependendo da falha ou não, porque eu 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 terá sucesso, mesmo se a parte do comando falhar.

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

    
por Nick 21.09.2012 / 00:57

4 respostas

7

Acabei de corrigir quase exatamente a mesma situação. Espero que ainda ajude você, se não, então talvez outros. Eu comecei a partir do su, não do sudo, mas como o sudo tem a intenção de envolver um único outro comando, ele realmente deveria retransmitir o código de saída do su. Se não, você pode aplicar a correção abaixo no nível de sudo também.

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

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

Caso o sudo não seja legal, o comando inteiro 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$?'

Cuidado com o aninhamento de cotações e certifique-se de que $? não é expandido, por isso não há aspas duplas.

    
por 19.10.2012 / 16:15
2

Eco o valor de retorno dentro do comando e acesse-o fora atribuindo o comando inteiro a uma variável (usando um subshell).

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

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
    
por 21.09.2012 / 01:07
0

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.

    
por 21.09.2012 / 12:24