我有一个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"
还有一个我试图从脚本中使用的构造(我现在正在 CentOS 的命令行上使用它进行测试):
filewatch . | while read line; do echo "file $line has changed\!\!"; done &
所以我希望这样做是让我一次处理一行,的输出inotify,当然它会为它检测到更改的每个文件发送一行。
现在,为了让我的脚本能够正确清理内容,我需要能够在脚本退出时终止整个后台管道。
所以我运行它,然后如果我kill在管道的第一部分或第二部分运行,另一部分不会终止。
因此,我认为如果我杀死该while read line部分(应该是sh(zsh在 cmd 行上运行的情况下)),那么filewatch应该会收到一个 SIGPIPE。好的,所以我不处理它,我想它可以继续运行。
但是,如果我杀死filewatch,它看起来会zsh继续它的while read line. 为什么?