在下面的代码中,我必须轮询$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
默认情况下会在字符串末尾添加一个新行)。