私は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
((zsh
cmd行で実行している場合))filewatch
、SIGPIPEを受け取る必要があると思います。わかりましたので、私はそれを処理していません。実行し続けることができると思います。
ただし、を殺すと、その が続くfilewatch
ように見えます。なんで?zsh
while read line