'set -e' e 'grep' idiom para impedir a saída prematura do shell script quando o padrão não for encontrado

14

Ajuda requerida - no contexto do shell script em um bash GNU / LINUX:

Eu sempre uso set -e . Frequentemente, eu gostaria de grep e nem sempre quero que o script termine a execução se grep tiver um status de saída de 1 indicando padrão não encontrado.

Algumas coisas que tentei resolver este problema são as seguintes:

(tente eu)
Se set +o pipefail e invocar o grep com algo como grep 'p' | wc -l , obtenho o comportamento desejado até que um futuro mantenedor habilite pipefail . Além disso, gosto de ativar pipefail , portanto, isso não funciona para mim.

(Try II)
Use um sed ou awk e apenas o padrão de correspondência de linhas de impressão e, em seguida, wc linhas correspondentes para testar o padrão correspondente. Não gosto dessa opção porque usar sed to grep parece uma solução alternativa para o meu verdadeiro problema.

(tente III)
Este é o meu menos favorito - algo como: set +e; grep 'p'; set-e

Qualquer insight / expressões idiomáticas seria muito apreciado - obrigado.

    
por Yeow_Meng 09.10.2015 / 15:13

1 resposta

17

Você pode colocar o grep em uma condição if , ou se você não se importa com o status de saída, adicione || true .

Exemplo: grep mata o shell

$ bash
$ set -e
$ echo $$
33913
$ grep foo /etc/motd
$ echo $$
9233

solução 1: descarte o status de saída diferente de zero

$ bash
$ set -e
$ echo $$
34074
$ grep foo /etc/motd || true
$ echo $$
34074

solução 2: teste explicitamente o status de saída

$ if ! grep foo /etc/motd; then echo not found; fi
not found
$ echo $$
34074

Da página man bash discutindo set -e :

The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or ││ list except the command following the final && or ││, any command in a pipeline but the last, or if the command’s return value is being inverted with !.

    
por 09.10.2015 / 15:25