ファイルポーリングの代替?

ファイルポーリングの代替?

以下のコードは非同期なので、$tmp_inputコードを実行し続けるにはポーリングする必要があります。wezterm cli send-textこれにより、すべてを$tmp_input準備できます。

tmp_input=$(mktemp ./tmp_input.XXXXXX)

echo "read input; echo \$input > $tmp_input" | wezterm cli send-text --pane-id $bottom_pane_id --no-paste

while [ ! -s "$tmp_input" ]; do
    sleep 1
done

input_value=$(cat "$tmp_input")
rm "$tmp_input"

echo "Input was: $input_value" | wezterm cli send-text --pane-id $bottom_pane_id --no-paste

コードはうまくいきますが、同じ結果を得る別の方法があるかどうかを知りたいです。

答え1

代わりに、名前付きパイプを作成してmkfifo読み取ることができます。パイプに何かが書き込まれるまで読み取りがブロックされるため、手動ポーリングは必要ありません。それは次のとおりです。

tmp_input=$(mktemp -d ./tmp_input.XXXXXX)
mkfifo "$tmp_input/fifo"

echo "read input; echo \$input > $tmp_input/fifo" | wezterm cli send-text --pane-id $bottom_pane_id --no-paste

input_value=$(cat "$tmp_input/fifo")
rm "$tmp_input/fifo"
rmdir "$tmp_input"

echo "Input was: $input_value" | wezterm cli send-text --pane-id $bottom_pane_id --no-paste

mktemp -dはから名前を取得し、それを使用mktempするよりも安全な選択肢を選択しましたmkfifo

答え2

について聞いたことがあるinotify待つ?あなたが欲しいと思います。

(私はよく使う。入力するファイルが変更されると実行されますが、目標を達成するにはinotifywaitを使用できると思います。 )

答え3

tailコマンドにはこれを知らせる-f/フラグがあります。--follow「ファイルが大きくなると追加データを出力します」。その後、このheadコマンドを使用して、最初の行がファイルに書き込まれるのを待つことができます。

input_value=$(tail -f "$tmp_input" | head -1)

最初の行の末尾に新しい行がある場合にのみ機能します(デフォルトでechoは、文字列の末尾に新しい行が追加されるため、あなたの場合は正しいです)。

関連情報