La réponse de Daniel est impeccable, mais il y a une complication intéressante évoquée par la réponse (largement incorrecte) de jokerdino concernant l'échappement du shell.
Tout d'abord, remarquez que la sortie non filtrée de ps
contiendra une ligne correspondant au processus grep
lancé par votre shell. Si vous exécutez grep firefox
au moment où vous lancez ps
, vous le verrez dans la sortie :
$ ps
thorsen 15820 28618 0 07:28 pts/1 00:00:00 grep firefox
thorsen 23983 1 1 Jun19 ? 00:12:34 some other process ....
Si vous prenez ensuite la sortie de ps
et la filtrez à travers ce processus grep
— en faisant un grep sur la sortie de ps
pour trouver des chaînes qui correspondent à l'expression régulière firefox
— alors, eh bien, cette ligne correspondra !
$ ps | grep firefox
thorsen 15820 28618 0 07:28 pts/1 00:00:00 grep firefox
^^^^^^^ Trouvé !
Mais si vous avez lancé grep
avec des arguments qui ne correspondent pas à l'expression régulière que vous recherchez, alors cette ligne de sortie de ps
ne correspondra pas à l'expression régulière.
$ ps | grep 'f[ij]refo*x'
La sortie non filtrée contiendra une ligne comme
thorsen 15820 28618 0 07:28 pts/1 00:00:00 grep f[ij]refo*x
mais la sortie filtrée ne le fera pas, car cette ligne ne contient pas de sous-chaînes correspondant à l'expression régulière f[ij]refo*x
. (Cette ligne ne contient pas firefx
, ni fjrefx
, ni firefox
, ni fjrefoox
, ou...)
Mais, comme l'a souligné jokerdino, il peut aussi se passer autre chose ici ! Parce que les caractères entre crochets sont aussi magiques pour la plupart des shells. Lorsque vous écrivez
ls foo*.[ch]
le shell Bash regarde en fait quels fichiers sont disponibles dans votre répertoire de travail actuel et développe ce glob en, par exemple,
ls foo.c foobar.c foobar.h
Si vous ne voulez pas que le globbing du shell se produise, alors vous devez échapper les caractères spéciaux magiques *
, [
, ]
ou les mettre entre guillemets simples :
$ ls foo*.[ch]
foo.c foobar.c foobar.h
$ ls 'foo*.[ch]'
ls: foo*.[ch]: Aucun fichier ou dossier de ce type
Le globbing devient également inopérant si Bash ne trouve aucun fichier correspondant dans le répertoire actuel :
$ rm foo*.[ch]
$ ls foo*.[ch]
ls: foo*.[ch]: Aucun fichier ou dossier de ce type
Donc, lorsque vous avez écrit
$ grep [f]irefox
sans guillemets simples, cela a fait que grep
recherche des lignes correspondant à l'expression régulière [f]irefox
précisément parce qu' il n'y avait pas de fichier correspondant au glob [f]irefox
dans votre répertoire de travail actuel ! Cela n'a aucun rapport avec vos observations réelles, mais il est intéressant de noter que vous auriez pu observer le comportement suivant :
$ cd /usr
$ ps -ef | grep [f]irefox
thorsen 16730 1 1 Jun19 ? 00:27:27 /usr/lib/firefox/firefox ....
$ cd /usr/lib
$ ps -ef | grep [f]irefox
thorsen 15820 28618 0 07:28 pts/1 00:00:00 grep --color=auto firefox
thorsen 16730 1 1 Jun19 ? 00:27:27 /usr/lib/firefox/firefox ....
Dans le deuxième cas ici, parce que le répertoire actuel contient une entrée nommée firefox
, l'argument non entre guillemets [f]irefox
est développé par Bash avant que grep
ne le voie, et vous vous retrouvez à faire un grep sur l'expression régulière firefox
au lieu de [f]irefox
. La solution serait d'ajouter des guillemets simples :
$ ps -ef | grep '[f]irefox'
thorsen 16730 1 1 Jun19 ? 00:27:27 /usr/lib/firefox/firefox ....
Je recommande d'ajouter des guillemets simples autour de chaque argument à tout moment, cela inclut les "métacaractères du shell" tels que *
, [
, (
, {
, =
, ,
, ;
, etc. — surtout les regex !