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?
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.
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