对话框窗口中的 Bash 脚本下运行的计时器

对话框窗口中的 Bash 脚本下运行的计时器

以下 bash 脚本是如何使用 dialog 命令的示例。此脚本运行进度条(并显示进程升级)。对话框中缺少的是时间钟- 显示进度条每秒运行了多少时间,直到结束。

我不确定对话框是否启用了此功能,所以我问是否可以在对话框窗口内打印时钟?

如果没有,还有哪些其他选择?(例如,在对话框窗口外运行的时钟)

  #!/bin/bash
  declare PACKAGES=("/etc/crontab"  "/etc/dmtab"  "/etc/fstab"  "/etc/inittab"  "/etc/mtab")
     NUM_PACKAGES=${#PACKAGES[*]} # no. of packages to update (#packages in the array $PACKAGES)
  step=$((100/$NUM_PACKAGES))  # progress bar step
   cur_file_idx=0
   counter=0
 DEST=${HOME}
    (
    # infinite while loop
    while :
  do
  cat <<EOF
  XXX
 $counter
   $counter% upgraded

   $COMMAND
   XXX
   EOF
       COMMAND="cp ${PACKAGES[$cur_file_idx]} $DEST &>/dev/null" # sets/updates command to exec.
      [[ $NUM_PACKAGES -lt $cur_file_idx ]] && $COMMAND # executes command

   (( cur_file_idx+=1 )) # increase counter
     (( counter+=step ))
   [ $counter -gt 100 ] && break  # break when reach the 100% (or greater
                               # since Bash only does integer arithmetic)
   sleep 10 # delay it a specified amount of time i.e. 1 sec
 done
     ) |
      dialog --title "File upgrade" --gauge "Please wait..." 10 70 0

更新:我还发现了一些计时器代码,我想将这些代码合并到对话框行中 - 我该怎么做?

计时器脚本(代码):

 date1=`  date   +%s`; 
   while true; do 
   echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r"; 
   done

答案1

确实,如果对话框有一个选项或类似的东西那就太好了--show-elapsed,但目前做到这一点并不简单。

显示部分不太难:您可以(滥用)使用该选项来显示已用时间。您甚至可以通过添加更多选项(并更改框大小)--title使其显示在仪表下方。\n

在此处输入图片描述

更棘手的是让它每秒显示一次,即使状态更新间隔 50 秒。以下是使用read -t超时选项的解决方案:

#!/bin/bash

show_dialog()
{
    p=0             # percentage
    date1=`date +%s`
    while [ "$p" != 100 ]; do
        read -t 1 tmp && p=$tmp
        elapsed="$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)"
        echo $p | dialog --title "File upgrade" --gauge "Please wait...\n\n\n\n$elapsed" 10 70 0
    done
}

task()              # fake task
{ for p in `seq 1 100`; do echo $p; sleep 2; done; }

task | show_dialog

相关内容