inotifywaitを使用してstdinから読み取るスクリプトを呼び出す方法

inotifywaitを使用してstdinから読み取るスクリプトを呼び出す方法

私はこのコードを持っています:

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ファイル名が印刷されないようにすることができます。

おすすめ記事