在下面的代码中,我必须轮询$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
该代码有效,但我想知道是否有另一种方法可以实现相同的结果。
您可以改为创建一个命名管道
mkfifo
,然后阅读它。读取将被阻塞,直到有东西写入管道为止,无需手动轮询。就像是:我转而
mktemp -d
作为一种希望更安全的替代方案,而不是从 获取名称mktemp
然后使用该名称mkfifo
。您听说过inotifywait吗?听起来像是你想要的。
(我经常使用entr来执行文件更改 - 但我认为您可以使用 inotifywait 实现您的目标。)
tail
命令有一个-f
/--follow
标志,告诉它“随着文件的增长输出附加数据”。然后您可以使用该head
命令等待,直到第一行写入文件。请注意,只有在第一行末尾有一个新行时它才会起作用(这在您的情况下是正确的,因为
echo
默认情况下会在字符串末尾添加一个新行)。