Terminer la moitié d’un tube sous Linux ne met pas fin à l’autre moitié

J’ai un programme filewatch :

  #!/bin/sh # On Linux, uses inotifywait -mre close_write, and on OS X uses fswatch. set -e [[ "$#" -ne 1 ]] && echo "args count" && exit 2 if [[ `uname` = "Linux" ]]; then inotifywait -mcre close_write "$1" | sed 's/,".*",//' elif [[ `uname` = "Darwin" ]]; then # sed on OSX/BSD wants -l for line-buffering fswatch "$1" | sed -l 's/^[a-f0-9]\{1,\} //' fi echo "fswatch: $$ exiting" 

Et une construction que j’essaie d’utiliser depuis un script (et je teste avec la ligne de commande sur CentOS maintenant):

filewatch . | while read line; do echo "file $line has changed\!\!"; done &

J’espère donc que cela me permettra de traiter, une ligne à la fois, la sortie d’ inotify , qui envoie bien sûr une ligne pour chaque fichier sur lequel elle a détecté une modification.

Maintenant que mon script doit nettoyer les choses correctement, je dois pouvoir tuer tout ce pipeline en arrière-plan lorsque le script se termine.

Donc, je l’exécute et si je lance kill sur la première partie du tube ou sur la deuxième partie, l’autre partie ne se termine pas.

Donc, je pense que si je tue la while read line (qui devrait être sh ( zsh dans le cas de l’exécution sur la ligne de commande)), alors filewatch devrait recevoir un SIGPIPE. Bon alors je ne gère pas ça, je suppose que ça peut continuer à courir.

Si je tue filewatch , cependant, il semble que zsh continue avec sa while read line . Pourquoi?