バルクタイムアウトの代替?

バルクタイムアウトの代替?

私に必要なのは、キーを押してスキップできる80秒の睡眠です。残り時間を確認できる点がメリットになります。

答え1

より簡単な方法は

read -t 80 -n 1 -s -p "Hit a key to continue"

しかし、残り時間は見られません。残り時間を表示するには、サブシェルを含むより複雑なスクリプトを使用できます。

( for i in {80..0}; do
    echo Wait for $i seconds or press any key;
    sleep 1;
  done )&
read -t 80 -n 1 -s; kill $!

議論の余地がありますが、このkillコマンドはやや安全ではありません。ただし、サブシェルがスリープモードに失敗して早期に終了し、無実のプロセスがそのPIDを再利用して終了する可能性はほとんどありません。

答え2

非常に簡単なスクリプトは次のとおりです。

#!/bin/bash

IFS=_
count=80
echo "hit a key:"
while [ $count -ge 1 ]
do
    echo -e -n "\rtime remaining: $count"
    read -n 1 -s -t 1 myresponse
    if [ "$myresponse" ]
    then
        echo -e -n "\nyou entered: $myresponse\n"
        break
    fi
    ((count--))
done
if [ $count -eq 0 ]
then
    echo -e -n "\nyou did not entered anything\n"
fi

編集する:IFSフィールド区切り文字を下線に変更する行を追加しました。スクリプトは空白、タブ、Enterで動作します。テストを引用符で囲むことは本当に安全なので、これを追加しました。

関連情報