私はこのコードを持っています:
inotifywait -m -e close_write src/lips.js ./test_port.scm | \
while read x; do ./test_port.scm; done
問題は、私のスクリプトがinotifywaitが生成するものを読むことです。だから私の質問は:このスクリプトが標準入力から読み取った場合、すべてのファイルが変更されたときにtest_port.scmを実行する正しい方法は何ですか?
修正する:
まあ、これはうまくいきます。入力を待つためにスクリプトを実行するように変更しました。しかし、テキスト入力は機能しません。再保存すると、次のような結果が得られます。
./test_port.scm CLOSE_WRITE,CLOSE
>>> ./test_port.scm CLOSE_WRITE,CLOSE
私のコードは次のとおりです
(display (string-append ">>> " (read-line)))
(newline)
1行を読み取って印刷するためのスキームコード、コードはこの点でより複雑です。実際に1行を読む必要があるのはNode.js + Readlineです。
var interp = Interpreter('repl', {
stdin: InputPort(function() {
return new Promise(function(resolve) {
rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('', function(data) {
resolve(data);
rl.close();
});
});
}),
問題があるようで、while read x;
ここに質問をします。
修正する:
私の実際の問題は、すべてのファイルが変更されたときにスクリプトを実行し、スクリプトがstdinを読む必要があることです。実際にinotifywaitかどうかは関係ありませんが、これがファイルの変更時に実行される唯一のソリューションです。
ベストアンサー1
一般的なアプローチは、パイプ全体をリストにラップし、標準入力として使用されるファイル記述子をコピーし、コマンドの標準入力をループ本文にリダイレクトして新しいパイプから読み取ることです。
{
inotifywait -m -e close_write src/lips.js ./test_port.scm |
while read x; do
./test_port.scm 0<&3
done
} 3<&0
これはデフォルトでを使用するのと同じです/dev/tty
。ホクラキンの答えこれは本当ですが、端末ではなく外部標準入力も許可します。
ただし、このソリューションでは、ファイル名に改行文字を含めないでください。各イベントに対してループ本文が複数回実行されるようにします(変数に偽の値を使用x
)。使用方法によっては、オプションinotifywait
で--format
ファイル名が印刷されないようにすることができます。