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 &

したがって、これが行うことを望んでいるのは、一度に1行ずつ、の出力を処理できるようにすることです。inotifyもちろん、変更が検出されたファイルごとに1行を送信します。

スクリプトが適切にクリーンアップするには、スクリプトの終了時に、このバックグラウンド パイプライン全体を強制終了できる必要があります。

だから私はそれを実行killし、パイプの最初の部分または2番目の部分で実行すると、他の部分は終了しません。

while read lineしたがって、その部分を強制終了するとsh((zshcmd行で実行している場合))filewatch、SIGPIPEを受け取る必要があると思います。わかりましたので、私はそれを処理していません。実行し続けることができると思います。

ただし、を殺すと、その が続くfilewatchように見えます。なんで?zshwhile read line

4

0 に答える 0