我已经dialog
安装了,我希望有一个很好的进度对话框,如下所示:
+-------[ title ]--------+
| |
| +-[ console output ]-+ |
| | output line11 ^ |
| | output line12 | |
| | output line13 | |
| | output line14 # |
| | output line15 | |
| | output line16 v |
| +--------------------+ |
| #########80%#####::::: |
+------------------------+
因此,例如,当升级发行版中的 5 个软件包时,它会显示进度(此处,4 个软件包从 5 个软件包中升级,即 80%),但会显示所执行命令的详细输出。这可能吗?
我怀疑是这样,但我无法使用--tailboxbg
和获得有效的解决方案--gauge
。
答案1
是的,你可以这样做--gauge
:
#!/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
这段代码的实际作用:
笔记。此代码实际上将这五个文件复制到/etc/
您的$HOME
文件夹中。
答案2
您关于--tailboxbg
与 一起使用是正确的--gauge
,但是它们必须侦听不同的文件描述符并按正确的顺序(--tailboxbg
首先)
将双下划线更改__MACROS__
为相关内容
let total=__GET_MAX_COUNT__
let idx=0
let percent=0
let width=$(tput cols)
let height=$(tput lines)
log=$(mktemp --tmpdir dialog-progress.logXXX)
(for __LOOP__; do
cat <<EOF
XXX
$percent
Processing item $index ($percent %)
XXX
EOF
let idx++
let "percent = 100 * idx / total"
__COMMAND__ >> $log
done
) | dialog \
--title "Dialog example progress with command output" \
--begin 12 2 \
--tailboxbg $log $((height - 14)) $((width - 6)) \
--and-widget \
--begin 2 2 \
--gauge "Converting ..." 8 $((width - 6)) 0