Como executo um comando somente após o comando anterior não ter êxito no bash? [duplicado]

8

Usamos & & operador para executar um comando após o anterior terminar.

update-system-configuration && restart-service

mas como executo um comando apenas se o comando anterior não for bem-sucedido? Por exemplo Se eu tiver que atualizar a configuração do sistema e se ela falhar, eu preciso enviar um e-mail para o administrador do sistema?

Edit: Venha, esta não é uma questão duplicada de operadores de controle. Isso ajudará os usuários que estão procurando especificamente isso. Entendo que a resposta para controlar os operadores também responderá a essa pergunta, mas as pessoas que pesquisarem especificamente como lidar com comandos mal-sucedidos não chegarão lá diretamente; pergunta.

    
por Rahul Prasad 11.06.2015 / 04:04

2 respostas

9

&& executa o comando que segue somente se o comando que o precede for bem-sucedido. || faz o oposto:

update-system-configuration || echo "Update failed" | mail -s "Help Me" admin@host

Documentação

De man bash :

AND and OR lists are sequences of one of more pipelines separated by the && and || control operators, respectively. AND and OR lists are executed with left associativity. An AND list has the form

command1 && command2

command2 is executed if, and only if, command1 returns an exit status of zero.

An OR list has the form

command1 || command2

command2 is executed if and only if command1 returns a non-zero exit status. The return status of AND and OR lists is the exit status of the last command executed in the list.

    
por 11.06.2015 / 04:12
2

Quando "com sucesso", você quer dizer que devolve 0 , basta testar:

if ! <command>; then
    <ran if unsuccessful>
fi

A razão pela qual isso funciona é que, como padrão, os programas devem retornar diferentes de zero se algo der errado, e zero se forem bem-sucedidos.

Como alternativa, você pode testar a variável de retorno $? :

<command>
if [ $? -ne 0 ]; then
    <ran if unsuccessful>
fi

$? salva o código de retorno do último comando.

Agora, if geralmente é um comando interno do shell. Então, dependendo do shell que você está usando, você deve verificar a página man do seu shell para isso.

    
por 11.06.2015 / 04:17