Este script não ecoa "depois":
#!/bin/bash -e
echo "before"
echo "anything" | grep e # it would if I searched for 'y' instead
echo "after"
exit
Também removeria a -e
opção na linha shebang, mas desejo mantê-la para que meu script pare se houver um erro. Não considero grep encontrar nenhuma correspondência como um erro. Como posso impedir que ele saia tão abruptamente?
bash
grep
exit
error-handling
iago-lito
fonte
fonte
-e
pressupor que você se importe: tanto que qualquer problema é catastrófico.var=$(complex command | grep complex_pattern)
que pode ser nulo (nesse caso, meu programa não deve terminar). Este é apenas um script resumido que faz com que o problema ocorra. Nenhum buraco negro metafísico na lógica aqui, certo? ;)Respostas:
Explicação:
O "||" significa "ou". Se a primeira parte do comando "falhar" (significando "grep e" retorna um código de saída diferente de zero), a parte após o "||" é executado, obtém êxito e retorna zero como o código de saída (
true
sempre retorna zero).fonte
/bin/true
é:command || :
(no seu casoset -e; grep 'needle' haystack || :
).true
é um componente embutido em algumas conchas (pelo menosbash 4.3
no RHEL) #Uma maneira robusta de enviar mensagens de forma segura e opcional
grep
:De acordo com o manual do posix , o código de saída 1 significa que nenhuma linha foi selecionada e> 1 significa um erro.
fonte
Outra opção é adicionar outro comando ao pipeline - um que não falha:
echo "anything" | grep e | cat
Como
cat
agora é o último comando no pipeline, é o status de saídacat
, e não degrep
, que será usado para determinar se o pipeline falhou ou não.fonte
Outra opção:
fonte
Solução
Explicação
set -e
ouset -o errexit
Além disso,
:
é o comando sem efeito no Bash.fonte