Eu tenho um script de shell Bash que chama uma série de comandos. Eu gostaria que o script shell saísse automaticamente com um valor de retorno 1 se algum dos comandos retornar um valor diferente de zero.
Isso é possível sem verificar explicitamente o resultado de cada comando?
por exemplo
dosomething1
if [[ $? -ne 0 ]]; then
exit 1
fi
dosomething2
if [[ $? -ne 0 ]]; then
exit 1
fi
set -e
, também façaset -u
(ouset -eu
).-u
põe fim ao comportamento idiota e oculto que você pode acessar qualquer variável inexistente e ter um valor em branco produzido sem diagnóstico.Respostas:
Adicione isso ao início do script:
Isso fará com que o shell saia imediatamente se um comando simples sair com um valor de saída diferente de zero. Um comando simples é qualquer comando que não faça parte de um if, while, ou até test, ou parte de um && ou || Lista.
Veja a página de manual bash (1) no comando interno "set" para mais detalhes.
Pessoalmente, inicio quase todos os scripts de shell com "set -e". É realmente irritante ter um script continuar teimosamente quando algo falha no meio e quebra suposições para o resto do script.
fonte
bash script.sh
.set -e; tf() { false; }; tf; echo 'still here'
. Mesmo semset -e
dentro do corpotf()
, a execução é abortada. Talvez você quisesse dizer queset -e
não é herdado por sub-conchas , o que é verdade.Para adicionar à resposta aceita:
Lembre-se de que
set -e
às vezes não basta, especialmente se você tiver cachimbos.Por exemplo, suponha que você tenha esse script
... que funciona como esperado: um erro
configure
interrompe a execução.Amanhã você faz uma mudança aparentemente trivial:
... e agora não funciona. Isso é explicado aqui e é fornecida uma solução alternativa (somente Bash):
fonte
pipefail
que concordarset -o
!As instruções if no seu exemplo são desnecessárias. Apenas faça assim:
Se você seguir o conselho de Ville Laurikari e usá-lo
set -e
, em alguns comandos, poderá ser necessário:O
|| true
fará com que o pipeline de comando tem umtrue
valor de retorno, mesmo se o comando falhar de modo que o da-e
opção não irá matar o script.fonte
set -e
não é centrado no bash - é suportado mesmo no Bourne Shell original.Se você precisar fazer uma limpeza na saída, também poderá usar 'trap' com o pseudo-sinal ERR. Isso funciona da mesma maneira que interceptar INT ou qualquer outro sinal; bash lança ERR se algum comando sair com um valor diferente de zero:
Ou, especialmente se você estiver usando "set -e", poderá capturar EXIT; sua armadilha será executada quando o script sair por qualquer motivo, incluindo um final normal, interrupções, uma saída causada pela opção -e etc.
fonte
A
$?
variável raramente é necessária. O pseudo-idiomacommand; if [ $? -eq 0 ]; then X; fi
deve sempre ser escrito comoif command; then X; fi
.Os casos em que
$?
é necessário é quando ele precisa ser verificado em relação a vários valores:ou quando
$?
precisar ser reutilizado ou manipulado:fonte
Execute-o com
-e
ouset -e
no topo.Veja também
set -u
.fonte
help set
:-u
trata as referências a variáveis não definidas como erros.set -u
ouset -e
não, ou ambos? @lumpynoseUma expressão como
interromperá o processamento quando um dos comandos retornar com um valor diferente de zero. Por exemplo, o seguinte comando nunca imprimirá "concluído":
fonte
deve ser suficiente.
fonte
apenas lançando outro para referência, pois houve uma pergunta adicional na entrada de Mark Edgars e aqui está um exemplo adicional e aborda o tópico geral:
que é o mesmo
cmd || exit errcode
que alguém mostrou.por exemplo. Quero garantir que uma partição seja desmontada se montada:
fonte
[[
cmd`]] `não é a mesma coisa. É falso se a saída do comando estiver vazia e verdadeira, caso contrário, independentemente do status de saída do comando.