grep - sair com 1 - se corresponder

1

Eu tenho uma função bash assim:

run_mongo(){
  mongo foo bar baz 2>&1  # send stderr to stdout
}

infelizmente este comando mongo não sai com 1 se houver erro, então eu tenho que combinar com stdout / stderr

existe alguma maneira de sair com o código > 0 com grep se houver uma primeira correspondência? algo assim:

run_mongo | grep -e "if stdout/stderr matches this we exit with 1"

Eu assumo que a maneira de fazer isso seria assim:

run_mongo | grep -e "if stdout/stderr matches" | killer

onde killer é um programa que morre assim que recebe seu primeiro bit de stdin.

    
por Alexander Mills 27.03.2018 / 01:31

3 respostas

4

Sim, você pode fazê-lo com grep -vz , que diz grep para encontrar linhas que não correspondam ao padrão fornecido por você ( -v ) e para ler a taxa de entrada inteira de uma vez ( z ). de modo que uma correspondência significa que a coisa toda falha:

$ printf 'foo\nbar\n' | grep -zqv foo && echo no || echo yes
yes
$ printf 'foo\nbar\n' | grep -zq foo && echo no || echo yes
no

Então, no seu caso, algo como:

run_mongo(){
  mongo foo bar baz 2>&1 | grep -vzq "whatever means failure" 
}

if run_mongo; then
 echo "Worked!"
else
  echo "Failed!"
fi

Se você quiser evitar ler toda a saída, use outra ferramenta. Perl, por exemplo:

mongo foo bar baz 2>&1 | perl -ne 'exit 1 if /whatever means failure/' 
    
por 27.03.2018 / 01:44
1
echo 'if stdout/stderr matches this' |
    awk '$0 ~ "if stdout/stderr matches this" { exit 1; }' ; echo $?
    
por 27.03.2018 / 02:10
0

@ A solução de terdon parece boa, já que eu sou um fanboy do Node.js, eu acabei de escrever um programa como este:

#!/usr/bin/env node

process.stdin.resume().once('data', function () {
   process.exit(1);
});

então no meu script bash temos:

run_mongo(){
  mongo foo bar baz 2>&1
}

exit_if_match(){
    grep "$1" | "./node_modules/.bin/imminent_suicide"
}

run_mongo "foo" "bar" | exit_if_match "errmsg"
    
por 27.03.2018 / 01:52