一部のファイルを監視するためにentrを使用しようとしています。
私のスクリプトは次の例に基づいています。
do_it(){ echo Eita!; }
while true; do ls folder/* more-folder/* | entr -pd do_it; done
>> entr: exec do_it: No such file or directory
しかしこれはうまくいきます:
while true; do ls folder1/* folder2/* | entr -pd echo Eita!; done
私は何が間違っていましたか?
答え1
「while」ループのパイプは別のサブシェルで実行されます。関数がエクスポートされないため、do_it
実行中の正しいサブシェルはentr
これを知りません。最も短い解決策は関数をエクスポートすることです(bashではこれを許可します)。
do_it(){ echo Eita!; }
export -f do_it
while true; do ls folder/* more-folder/* | entr -pd do_it; done
コマンドがディスク上でアクションを実行したい場合は、entr
関数をスクリプトファイルに入れて、entr
次を指すことをお勧めします。それ。
ファイル名は /path/to/do_it です。
#!/bin/sh
echo Eita!
ファイルが実行可能であることを確認してください。
chmod +x /path/to/do_it
新しいコマンドライン:
while true; do ls folder/* more-folder/* | entr -pd /path/to/do_it; done
答え2
entrのプログラマーが答えました(https://github.com/eradman/entr/issues/6):「関数はサブシェルにエクスポートできますが、外部プログラムでは関数を実行できません。シェル関数を実行するには、次のようにループを作成できます。」
do_it(){ echo 'Eita!'; }
while true; do
ls folder1/* folder2/* | entr -pd -s 'kill $PPID'
do_it
done