在Linux上终止管道的一半不会终止另一半

在Linux上终止管道的一半不会终止另一半,linux,shell,unix,pipe,Linux,Shell,Unix,Pipe,我有一个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

我有一个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的命令行上使用它进行测试:

文件观察读行时;是否回显文件$line已更改\!\!;完成&

所以我希望它能让我一次处理一行,inotify的输出,当然它会为每个检测到变化的文件发送一行

现在,为了让我的脚本正确地清理内容,我需要能够在脚本退出时终止整个后台管道

所以我运行它,然后如果在管道的第一部分或第二部分运行kill,另一部分不会终止

因此,我认为如果我杀死whileread行部分,在cmd行上运行时,它应该是shzsh,那么filewatch应该会收到一个SIGPIPE。好吧,我没有处理这个问题,我想它可以继续运行


不过,如果我杀了filewatch,它看起来像是zsh继续它的while read行。为什么?

我可能不得不解释环境之间的这种不一致性,只使用inotify而不使用-m,并每次重新生成它。无需杀死它,我可以在完成后停止产卵。不过,这并不是很好,因为它每次都要重新建立所有的监视,并且在情况快速变化时会丢失一堆东西。我很确定,如果您不在filewatch脚本中使用sed,那么您的问题就会消失。否则,我如何构建一个规范化输出的脚本?提到了一个格式选项。哦,很好。我会调查的。