簡體   English   中英

如何在等待用戶輸入時更改Bash腳本的輸出?

[英]How can I change output from a Bash script while waiting on user input?

我想在Bash中制作一個具有暫停功能的秒表。 它應該顯示一個遞增計數器,就像這樣 ,但是當我按下“p”鍵時暫停它。

我應該如何實現呢? 如果我等待用戶輸入read我無法同時刷新屏幕上的計數器。 read放在一個循環中,超時,是我迄今為止最好的計划,但使用超過一秒的超時是非常重要的,這就是我在這里需要的。 (它不受read或GNU timeout支持。)中斷可以工作,但我想支持像“p”和“x”這樣的任意鍵。

有沒有一種相當簡單的方法來實現這一目標?

在等待用戶輸入時打印到控制台

  1. 編寫一個創建輸出的函數(例如: counter或者你喜歡spin )。
  2. 編寫一個函數來讀入用戶命令( readCommand
  3. 在循環中調用這兩個函數
  4. 設置超時,即可快速讀取按鍵。 sleep .1read -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM