web-dev-qa-db-fra.com

Code de retour grep Linux

J'ai du mal à comprendre pourquoi ce qui suit renvoie un code de 1.

echo 'Total' | grep -c No
0

Donc, "Non" n'existe pas dans "Total". Mais en recherchant son code de retour, je le vois comme 1.

echo $?
1

Pourquoi le code de retour est-il 1? Y a-t-il un moyen de contourner ceci?

22
difurious

Selon man grep page, -c drapeau est pour

-c, --count Supprime la sortie normale; à la place, imprimez un nombre de lignes correspondantes pour chaque fichier d'entrée.

Donc, ce que vous voyez est le nombre de correspondances et ne pas confondre avec le code de sortie de la correspondance grep. Le code 1 est dû au fait qu’aucune ligne ne correspond à l’entrée.

Regardez l'autre cas,

echo 'No' | grep -c No
1

echo $?
0

A lire également sur EXIT CODES sur man grep page,

ÉTAT DE SORTIE Normalement, l'état de sortie est 0 si une ligne est sélectionnée, 1 si aucune ligne n'a été sélectionnée et 2 si une erreur est survenue.

27
Inian

Le code de sortie est 1 car rien n'a été trouvé par grep.

ÉTAT DE SORTIE Le statut de sortie est 0 si les lignes sélectionnées sont trouvées et 1 si non trouvé. Si une erreur survient, l'état de sortie est 2. (Remarque: le code de traitement d'erreur POSIX doit vérifier si "2" ou plus.)

La sortie est zéro parce que le nombre de 'Total' est zéro. Ceci à cause de l'option -c:

-c, --count Supprime la sortie normale; à la place, imprimez un nombre de lignes correspondantes pour chaque fichier d'entrée. Avec l'option -v, --invert-match (voir ci-dessous), comptez les lignes qui ne correspondent pas. (-c est spécifié par POSIX.)

Si vous souhaitez forcer un code de sortie de 0, vous pouvez simplement ajouter || true à votre commande:

echo 'Total' | grep -c No || true
18
rutgerm