Pourquoi grep renvoie-t-il des résultats différents lorsque regex est utilisé?

> ps -ef | grep cron root 1052 1 0 04:35 ? 00:00:00 cron test 4071 4053 0 10:15 pts/0 00:00:00 grep --color=auto cron > ps -ef | grep cr[o]n root 1052 1 0 04:35 ? 00:00:00 cron 

Pourquoi ces deux commandes renvoient-elles des résultats différents lorsque le terme recherché est équivalent?

Parce que dans le second cas, les processus en cours d’exécution sont (bien que la seconde ne soit pas visible après l’application du filtre grep):

 root 1052 1 0 04:35 ? 00:00:00 cron test 4071 4053 0 10:15 pts/0 00:00:00 grep --color=auto cr[o]n 

Et cr[o]n ne correspond pas à cr[o]n car [o] spécifie la liste de caractères o , tandis que la chaîne réelle contient également [ et ] autour de o .

La commande

 > ps -ef | grep cron 

correspond à la chaîne “cron” dans la commande, vous donnant

 test 4071 4053 0 10:15 pts/0 00:00:00 grep --color=auto cron 

Cependant, la commande

 > ps -ef | grep cr[o]n 

ne correspond PAS à la chaîne “cr [o] n” dans la commande elle-même, en l’omettant du résultat.

Pas à tous, si vous répétez la commande plusieurs fois, la sortie sera différente pour les deux classes de commandes. La raison en est que la sortie dépend de l’exécution de la commande grep au moment où le ps obtient les informations. Bash shell lance simplement les deux commandes en séquence rapide, mais parfois la commande ps(1) obtient les informations lorsque bash(1) n’a pas encore eu le temps de lancer celui de grep(1) .

Les deux regexps sont totalement équivalentes car cr[o]n est exactement identique à cron .

Faites un test en lançant plusieurs fois ps -ef | grep grep ps -ef | grep grep et voyez que parfois la commande grep apparaît et parfois pas.