파일 폴링의 대안?

파일 폴링의 대안?

아래 코드에서는 비동기식이므로 $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기본적으로 문자열 끝에 새 줄이 추가되므로 귀하의 경우에는 맞습니다).

관련 정보