GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi quitter le code 141 avec grep -q ?

C'est parce que grep -q sort immédiatement avec un statut zéro dès qu'une correspondance est trouvée. Le zfs la commande écrit toujours dans le tube, mais il n'y a pas de lecteur (car grep est sorti), il reçoit donc un SIGPIPE signal du noyau et il se termine avec un statut de 141 .

Un autre endroit commun où vous voyez ce comportement est avec head . ex.

$ seq 1 10000 | head -1
1

$ echo ${PIPESTATUS[@]}
141 0

Dans ce cas, head lu la première ligne et terminé ce qui a généré un SIGPIPE signal et seq sorti avec 141 .

Voir "The Infamous SIGPIPE Signal" du Guide du programmeur Linux.


Une autre option serait de ne pas utiliser de tube, mais d'utiliser une substitution de processus :

grep -q tank <(liste zfs)

Mise à jour :je suppose que c'est la même chose, car le processus exécuté entre parenthèses recevra également sigpipe.


Je ne connais pas zfs list , mais je suppose qu'il se plaint de la fermeture de sa sortie standard - grep -q se ferme immédiatement lorsqu'une correspondance est trouvée, contrairement à grep .


Linux
  1. Répertorier toutes les adresses e-mail dans un fichier avec grep

  2. Grep avec des opérateurs logiques ?

  3. Pourquoi Bash ne stocke-t-il pas les commandes commençant par des espaces ?

  4. Capturer des groupes avec Awk ou Grep ?

  5. Pourquoi puis-je me connecter avec des mots de passe partiels ? ?

Manipuler du texte en ligne de commande avec grep

Code de sortie par défaut lorsque le processus est terminé ?

Pourquoi Rsync échoue-t-il avec un tuyau cassé (32), erreur dans le socket Io (code 10) à Io.c (820) ??

Commande Grep sous Linux (avec exemples)

10 exemples pratiques de regex avec grep

Pourquoi ce code plante-t-il avec la randomisation d'adresse activée ?