[英]How can I change output from a Bash script while waiting on user input?
我想在Bash中制作一個具有暫停功能的秒表。 它應該顯示一個遞增計數器,就像這樣 ,但是當我按下“p”鍵時暫停它。
我應該如何實現呢? 如果我等待用戶輸入read
我無法同時刷新屏幕上的計數器。 將read
放在一個循環中,超時,是我迄今為止最好的計划,但使用超過一秒的超時是非常重要的,這就是我在這里需要的。 (它不受read
或GNU timeout
支持。)中斷可以工作,但我想支持像“p”和“x”這樣的任意鍵。
有沒有一種相當簡單的方法來實現這一目標?
counter
或者你喜歡spin
)。 readCommand
) sleep .1
和read -t.1
) function readCommand(){
lastCommand=$1
read -t.1 -n1 c;
if [ "$c" = "p" ]
then
printf "\n\r";
return 0
fi
if [ "$c" = "g" ]
then
printf "\n\r";
return 1
fi
return $lastCommand
}
function spin(){
for i in / - \\ \| ;
do
printf "\r$i";
sleep .1;
done
}
function countUp(){
currentCount=$1
return `expr $currentCount + 1`
}
function counter(){
countUp $count
count=$?
printf "\r$count"
sleep .1;
}
command=1
count=0
while :
do
if [[ $command == 1 ]]
then
counter
fi
readCommand $command
command=$?
done
如果用戶按下'p'
,計數器將停止,如果用戶按下'g'
帶有文件描述符和簡單輸入重定向的簡單腳本,不會留下任何臨時文件進行清理。 等待是通過使用read
參數-t
。
counter() {
while ! read -t 0.05 -n1 _; do
printf '\r\t%s' "$(date +%T.%N)"
done
}
{
IFS= read -p "Your name, Sir?"$'\n' -r name
echo >&3
} 3> >(counter "$tmp")
echo "Sir $name, we exit"
示例輸出:
Your name, Sir?
2:12:17.153951623l
Sir Kamil, we exit
我對您引用的代碼進行了更改。
...
while [ true ]; do
if [ -z $(cat /tmp/pause) ]; then
STOPWATCH=$(TZ=UTC datef $DATE_INPUT $DATE_FORMAT | ( [[ "$NANOS_SUPPORTED" ]] && sed 's/.\{7\}$//' || cat ) )
printf "\r\e%s" $STOPWATCH
sleep 0.03
fi
done
所以你現在需要做的是一個shell腳本,它等待來自stdin的“p”字符並寫入1> / tmp / pause或clean / tmp / pause以使秒表暫停或工作。
就像是:
while read char;
do
if [ $char == "p" ]; then
if [ -z $(cat /tmp/pause) ];then
echo 1 > /tmp/pause
else
echo > /tmp/pause
fi
char=0
fi
done < /dev/stdin
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.