
以下のコードは非同期なので、$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
答え3
tail
コマンドにはこれを知らせる-f
/フラグがあります。--follow
「ファイルが大きくなると追加データを出力します」。その後、このhead
コマンドを使用して、最初の行がファイルに書き込まれるのを待つことができます。
input_value=$(tail -f "$tmp_input" | head -1)
最初の行の末尾に新しい行がある場合にのみ機能します(デフォルトでecho
は、文字列の末尾に新しい行が追加されるため、あなたの場合は正しいです)。