O problema aqui, como @Florian percebe descoberto , é que o shell está expandindo os caracteres glob na sua pesquisa string para um nome de arquivo correspondente antes de passar a string para grep
.
A execução de ps aux | grep foo
é problemática, pois o comando grep foo
corresponderá a foo
e aparecerá na saída. Há duas soluções comuns, se complicadas, para isso. Você pode adicionar um grep -v grep
no final do canal ou usar grep [f]oo
. Como grep
funciona com expressões regulares, ele tratará [f]
como "qualquer caractere na lista de caracteres dentro dos colchetes". Como o único caractere entre colchetes é f
, [f]oo
é equivalente a foo
. No entanto, o processo grep
exibido nos resultados ps
terá a string [f]oo
e, portanto, não será encontrado por grep
.
Isso se torna mais complicado se, como parece ser o caso para você, você tem um arquivo chamado foo
em seu diretório atual. Como você não citou a expressão que deu a grep
(porque usou [s]elenium
e não '[s]elenium'
ou "[s]elenium"
), o shell tratará como glob e expandi-lo para o nome do arquivo correspondente. Isso renderiza o [s]elenium
como inútil, já que o que é realmente passado para grep
é selenium
e não [s]elenium
, então o grep irá corresponder a si mesmo.
Tudo isso, no entanto, só acontece porque você não está usando a ferramenta certa para o trabalho. Como é frequentemente o caso, há um aplicativo para isso!
Não use grep
+ ps
. Em vez disso, use pgrep
, que é projetado para fazer exatamente o que você deseja:
NAME
pgrep, pkill - look up or signal processes based on name and other
attributes
SYNOPSIS
pgrep [options] pattern
pkill [options] pattern
DESCRIPTION
pgrep looks through the currently running processes and lists the
process IDs which match the selection criteria to stdout. All the cri‐
teria have to match. For example,
$ pgrep -u root sshd
Então, no seu caso, você pode apenas fazer
pgrep selenium
Ou, como você está usando o java
, use -f
, que pesquisa toda a linha de comando:
pgrep -f selenium