Entr:ファイルの変更を監視しながら機能を起動しようとします。

Entr:ファイルの変更を監視しながら機能を起動しようとします。

一部のファイルを監視するために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

関連情報