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