Existem dois problemas aqui. Primeiro, quando você executa ps | grep ...
, o processo grep
também é mostrado na saída de ps
. A saída ps
padrão inclui os argumentos com os quais um processo foi iniciado e não apenas o nome do processo. Isso significa que, se você executar grep foo
e houver um processo em execução chamado foo
, haverá dois ps
de resultados correspondentes a foo
: o foo
process e o grep
em si, pois está pesquisando %código%. É por isso que você obtém duas linhas ao executar foo
.
Agora, o ps -f | grep thunderbird
é uma construção de expressão regular que define uma lista de caracteres, uma classe de caracteres. Por exemplo, [ ]
corresponderá a [abc]
ou a
ou b
. Quando você executa c
, essa classe contém apenas um único caractere, portanto, é equivalente a ps -f | grep [t]hunderbird
sem os colchetes. No entanto, o processo thunderbird
foi lançado com grep
como argumento desta vez, e não [t]hunderbird
. Portanto, sua linha na saída de thunderbird
conterá ps
. Será assim:
terdon 23101 10991 0 16:53 pts/3 00:00:00 grep --color [t]hunderbird
Isso significa que não é correspondido quando você executa [t]hunderbird
, pois contém ps -f | grep thunderbird
e não [t]hunderbird
.
Este é um truque comum para evitar a correspondência do processo thunderbird
ao executar grep
. Outra alternativa é executar ps | grep
para excluir o ps -f | grep foo | grep -v grep
. A melhor abordagem, no entanto, é usar um programa projetado especificamente para isso, grep
:
$ pgrep -l thunderbird
11330 thunderbird