我想在Bash中建立一个具有暂停功能的秒表。它应该显示一个递增计数器,就像this one一样,但是在我按下“ p”键时将其暂停。
我应该如何实施?如果我等待read
的用户输入,则无法同时刷新屏幕上的计数器。到目前为止,将read
放入一个有超时的循环是我最好的计划,但是使用不到一秒的超时并不是很简单的,这是我在这里需要的。 (read
或GNU timeout
不支持。)可以进行中断,但是我想支持“ p”和“ x”之类的任意键。
有没有合理简单的方法来实现这一目标?
答案 0 :(得分:1)
6379
或您喜欢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'
,计数器将继续运行
答案 1 :(得分:1)
带有文件描述符和简单输入重定向的简单脚本,没有要清除的临时文件。通过使用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
答案 2 :(得分:0)
我对您引用的代码进行了更改。
...
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脚本,该脚本等待标准输入中的“ 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