web-dev-qa-db-ja.com

ユーザー入力を待つのをやめる

ユーザーが任意のキーを押してスキップすることを選択できる待機時間を実装しようとしています。また、進行状況バーを表示するために使用しているため、端末に何も印刷してはなりません。ユーザー入力をキャッチしてテストするのが難しいのですが、それ以上の難しさがあるため、合計待機時間の遅延が増えてはなりません。

ここに私が現在持っているものがあります:

read -t 0 input </dev/tty1
   if [[ $input -ne "" ]]; then
exit 0
fi

そして、それはプログレスバーを更新するループの中にあります。遅延を追加したり、不要な行を印刷したりすることはありませんが、その機能は果たしません。

-t 0これ以上の遅延を追加しない

不要な行を追加しないように「/ dev/tty1」から読み取る

どうすればこれを達成できますか?

1
Adrien Horgnies

信じられないかもしれませんが、あなたを台無しにしているのはゼロです。 .01のような非常に小さい数値に変更すると、機能します。次のようにさらにストリームライン化できます。

if $(read -t.01 -sn1); then exit 0; fi
2
bashBedlam

parallel。で2つのことを実行したいとします。

  1. 5秒待っている入力を読み取ります(たとえば)
  2. 進行状況バーを更新する(5秒が終了していることを示す)

これを実現するには、ループ内にreadコマンドを配置しないでください。

代わりに、次のようにします。

for i in {1..10}; do sleep 0.5s; echo ${i}0; done | zenity --progress --auto-close --text="waiting for input...5sec" 2>/dev/null &  
read -t 5 asd && kill $!

(上記の2行をファイル(たとえばabc.sh)に入れて実行しますbash abc.sh

説明 :

最初のコマンド(進行状況バーを更新するため)は、を使用してバックグラウンドに送信されます。最初に終了した場合にコマンドを読み取る場合、kill $!は、進行状況バーを閉じます。

注:チェックアウト GNU Parallel 。これは、より多くのことを並行して行うのに役立ちます。

1
Severus Tux