2016-07-09 11 views
0

私はこれが可能であるかどうかはわかりませんが、私はしばしばそれを考えていて、いくつかの解決策は私を驚かせました。 whileループ内で私が欲しいん余分なプロセスを作成せずにスクリプトでinotifywait -mを使用しますか?

#!/bin/bash 

EVENTS="CREATE,CLOSE_WRITE,DELETE,MODIFY,MOVED_FROM,MOVED_TO" 
inotifywait -e "$EVENTS" -m -r ~/Desktop/testing | \ 
    while true; do 
    read TMP 
    echo "${TMP}" >> ~/Desktop/eventlog 
    done 

注:それは二つのプロセスを作成せずに次のスクリプトと同等のものを作成することが可能である(この場合には、パイプがあるので2つのプロセスが作成されている明確です)イベントにアクセスする

パイプが必要なのは、あるプロセスで書き込みを行い、別のプロセスから読み込む必要があるからです。しかし、おそらくトリックが存在するでしょうか?

答えて

2

を行うために探しているもののように、詳細を追加してくださいlastpipeオプションを設定して、whileループを別のプロセスではなく現在のシェルで実行できるようにします。

shopt -s lastpipe 
inotifywait -e "$EVENTS" -m -r ~/Desktop/testing | 
    while true; do 
    read TMP 
    echo "${TMP}" >> ~/Desktop/eventlog 
    done 

bashが行はその文字で終了することができないことを知っているので、あなたは、|後に明示的な行継続を必要としません。)

+0

ああ、これは私が達成しようとしていたことです。興味深いことに、私はそれをどのように実装することができるのだろうか。私は彼らが新しいプロセスを作成するのではなく、新しいスレッドを作成すると思いますか?もし誰かが執筆していて、読んでいるのであれば、2つの "何か"があるはずです。私は2つのスレッドを推測する。 –

+0

いいえ、2つの新しいプロセスをフォークして待機するのではなく、新しいプロセスで最初のコマンドと現在のプロセスでループを実行するだけです。 – chepner

1

forループで変更された変数がループが終了しても値が失われないように、セカンダリスクリプトを避けようとしていると仮定するのは正しいですか?あなただけの交換など

while read TMP; do 
    echo "${TMP}" >> ~/Desktop/eventlog 
done < <(inotifywait -e "$EVENTS" -m -r ~/Desktop/testing) 

のようなものが、あなたのコードの流れ の柔軟性を懸念している場合は、ファイルハンドルにリダイレクトすることができ、その後いつでも コメントそのハンドルから読み取ることができ、その場合には

下のあなたは私の例

エンアウト魚にしたい場合は、それは何か他のものかどう - あなたができる、あなたが実際にbash 4.2で

+0

は、この答えをあなたに感謝します。私はそれを勉強します。私の要望にはっきりしないのは残念です。ループから2つのプロセスを実行する必要はありませんでした。私が望んでいた答えがchepnerにあります。敬具。 –