在等待用户输入时如何更改Bash脚本的输出?

时间:2019-01-22 18:59:06

标签: bash gnu-coreutils

我想在Bash中建立一个具有暂停功能的秒表。它应该显示一个递增计数器,就像this one一样,但是在我按下“ p”键时将其暂停。

我应该如何实施?如果我等待read的用户输入,则无法同时刷新屏幕上的计数器。到目前为止,将read放入一个有超时的循环是我最好的计划,但是使用不到一秒的超时并不是很简单的,这是我在这里需要的。 (read或GNU timeout不支持。)可以进行中断,但是我想支持“ p”和“ x”之类的任意键。

有没有合理简单的方法来实现这一目标?

3 个答案:

答案 0 :(得分:1)

等待用户输入时打印到控制台

  1. 编写一个用于创建输出的函数(例如:6379或您喜欢counter的示例)。
  2. 编写一个函数以读取用户命令(spin
  3. 循环调用这两个函数
  4. 设置超时,以便尽快读取按键。 (readCommandsleep .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