1

我有一个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部分(应该是shzsh在 cmd 行上运行的情况下)),那么filewatch应该会收到一个 SIGPIPE。好的,所以我不处理它,我想它可以继续运行。

但是,如果我杀死filewatch,它看起来会zsh继续它的while read line. 为什么?

4

0 回答 0