Estou usando as seguintes opções
set -o pipefail
set -e
No script bash para interromper a execução por erro. Eu tenho ~ 100 linhas de script em execução e não quero verificar o código de retorno de todas as linhas do script.
Mas para um comando em particular, quero ignorar o erro. Como eu posso fazer isso?
-e
atributo está definido "se o comando que falhar fizer parte da lista de comandos imediatamente após uma palavrawhile
-until
chave ou , parte do teste em umaif
instrução, parte de qualquer comando executado em uma lista&&
ou,||
exceto o comando após o comando final&&
ou||
, qualquer comando em um pipeline, exceto o último, ou se o status de retorno do comando estiver sendo invertido!
. "(ldd $2/bin/* || true) | grep "not found" | wc -l
roteiro está sendo finalizado após esta linha quando a falha ldd retorno(ldd $2/bin/* || true) | grep "not found" | wc -l || true
set -o pipefail
. quandogrep
não encontra nada, ele retorna um código de saída diferente de zero e é suficiente para o shell pensar que todo o canal possui um código de saída diferente de zero.Basta adicionar
|| true
após o comando em que deseja ignorar o erro.fonte
set -e
e tentar capturar uma mensagem de erro: por exemploset -e; TEST=$(foo 2>&1 || true); echo $TEST
Não pare e também salve o status de saída
Caso você queira que seu script não pare, se um comando em particular falhar e também salvar o código de erro do comando com falha:
fonte
command
foi bem-sucedido e é necessário executar o que está depois||
. leia como: secommand
falhar, façaEXIT_CODE=$?
. Você provavelmente poderia apenas fazercommand || echo "$?"
ou usar "trap" para uma depuração mais detalhada. Veja isso -> stackoverflow.com/a/6110446/10737630Mais concisamente:
A partir da especificação POSIX referente a
set -e
(ênfase minha):fonte
-e
.!
isso impedirá que o shell saia, não importa o quê. Este script exibe a mensagemStill alive!
quando eu o executo, indicando que o script foi executado até a conclusão. Você está vendo um comportamento diferente?if
oração e resolvi o problema.Em vez de "retornar true", você também pode usar o utilitário "noop" ou nulo (conforme referido nas especificações do POSIX )
:
e apenas "não fazer nada". Você salvará algumas letras. :)fonte
Se você deseja impedir a falha do seu script e coletar o código de retorno:
returncode
é coletado, independentemente de o comando ter êxito ou falhar.fonte
Uso o snippet abaixo ao trabalhar com ferramentas CLI e quero saber se algum recurso existe ou não, mas não me importo com a saída.
fonte
if [ -r not_exist ]
Eu meio que gosto desta solução:
O comando / script entre os ticks anteriores é executado e sua saída é alimentada ao comando ":" (que é o equivalente a "true")
editar: Corrigido erro de digitação feio
fonte
enquanto
|| true
é o preferido, mas você também pode fazerfonte
Nenhuma solução funcionou para mim a partir daqui, então encontrei outra:
Isso é útil para CI e CD. Dessa forma, as mensagens de erro são impressas, mas o script inteiro continua sendo executado.
fonte
Exemplo de uso para criar um arquivo de log
fonte
Obrigado pela solução simples aqui de cima:
A construção a seguir pode ser usada para ações adicionais / solução de problemas de etapas de script e opções adicionais de controle de fluxo:
Podemos travar as ações adicionais e,
exit 1
se necessário.fonte