我有一个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
. 为什么?