
Se eu usar grep -q
em combinação com -v
para retornar 0 se não houver correspondências ou 1 se houver correspondência, funcionará desde que a entrada seja uma única linha:
$ echo 'abc' | grep -q -v a; echo $?
1
$ echo 'abc' | grep -q -v x; echo $?
0
Mas se a entrada for multilinha, grep sempre retornará 0:
$ echo -e 'a\nb\nc' | grep -q -v a; echo $?
0
$ echo -e 'a\nb\nc' | grep -q -v x; echo $?
0
Qual é a razão para tal comportamento?
Sei que a forma correta nesse caso seria usar ! grep -q
em vez de grep -q -v
, mas ainda quero saber a resposta.
Responder1
Por manual do grep:
-v, --invert-match
Selected lines are those not matching any of the specified patterns.
Se você fornecer apenas uma linha abc
e solicitar grep
que selecione apenas as linhas que não correspondam, a
você obterá uma saída vazia e um código de retorno igual a 1.
Se você fornecer três linhas a
, b
e c
e informar grep
para selecionar apenas aquelas que não correspondem, a
você obterá b
and c
na saída e 0 como código de retorno.
$ echo -e 'a\nb\nc' | grep -v a; echo $?
b
c
0