以下 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