文件轮询的替代方案?

文件轮询的替代方案?

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

相关内容