Réponse courte
Écrire
ps -ef | grep bar | { grep -v grep || test $? = 1; }
si vous utilisez set -e
.
Si vous utilisez l'option pipefail
de bash (set -o pipefail
), n'oubliez pas d'appliquer la gestion des exceptions (||test
) à chaque grep
dans le pipeline:
ps -ef | { grep bar || test $? = 1; } | { grep -v grep || test $? = 1; }
Dans les scripts shell, je vous suggère d'utiliser la fonction utilitaire "catch-1-grep" (c1grep) :
c1grep() { grep "$@" || test $? = 1; }
Expliqué
Le statut de sortie de grep
est 0, 1 ou 2 : [1]
0
signifie qu'une ligne est sélectionnée
1
signifie aucune ligne sélectionnée
2
signifie qu'une erreur s'est produite
grep
peut également renvoyer d'autres codes s'il est interrompu par un signal (par exemple 130
pour SIGINT).
Puisque nous voulons ignorer uniquement le statut de sortie de 1
, nous utilisons test
pour supprimer ce statut de sortie spécifique.
- Si
grep
renvoie 0
, test
n'est pas exécuté.
- Si
grep
renvoie 1
, test
est exécuté et renvoie 0
.
- Si
grep
renvoie toute autre valeur, test
est exécuté et renvoie 1
.
Dans le dernier cas, le script se terminera immédiatement en raison de set -e
ou set -o pipefail
. Cependant, si vous ne vous souciez pas du tout des erreurs de grep
, vous pouvez bien sûr écrire
ps -ef | grep bar | { grep -v grep || true; }
comme suggéré par Sean.
Utilisation supplémentaire dans les scripts shell
Dans les scripts shell, si vous utilisez beaucoup le grep
, je vous suggère de définir une fonction utilitaire :
# Wrapper "catch exit status 1" de grep
c1grep() { grep "$@" || test $? = 1; }
De cette manière, votre pipeline redeviendra court et simple, sans perdre les fonctionnalités de set -e
et set -o pipefail
:
ps -ef | c1grep bar | c1grep -v grep
FYI :
- Je l'ai appelé
c1grep
pour souligner qu'il capture simplement le statut de sortie 1
, rien d'autre.
- J'aurais pu appeler la fonction
grep
à la place (grep() { env grep "$@" ...; }
), mais je préfère un nom moins confus et plus explicite, c1grep
.
Utilisation supplémentaire de ps
+ grep
Donc, si vous voulez savoir comment éviter grep -v grep
ou même la partie | grep
de ps|grep
tout en un, consultez certaines des autres réponses ; mais c'est quelque peu hors sujet à mon avis.
[1] Documentation de grep
(spécification POSIX, docs GNU grep, page de manuel FreeBSD)