我正试图通过使用zenity/yad为wget下载过程提供某种GUI。我想出了这个:
wget http://example.com/ 2>&1 |
sed -u 's/^[a-zA-Z-].*//; s/.* {1,2}([0-9]{1,3})%.*/1n#Downloading... 1%/; s/^20[0-9][0-9].*/#Done./' |
zenity --progress --percentage=0 --title=Download dialog --text=Starting... --auto-close --auto-kill
现在,假设wget遇到错误。我需要通知用户下载失败。由于无论成功还是失败,$?
变量的值似乎都是0
(可能是因为$?
正在存储zenity的退出状态?),我无法判断下载是失败还是成功。
如何纠正上述问题?
您可以说:
set -o pipefail
这样说会导致$?
报告管道中最后一个命令的退出代码,以非零状态退出。
引用The Set Builtin:
pipefail
如果设置了,则管道的返回值是最后一个(最右边)以非零状态退出的命令的值,如果全部为零则为零管道中的命令成功退出。此选项被禁用违约
此外,数组PIPESTATUS
将报告管道中所有命令的返回代码。说:
echo "${PIPESTATUS[@]}"
会列出所有这些。例如,它会显示3个数字,例如
1 0 0
如果CCD_ 7失败。
引用手册:
管道状态
数组变量(请参阅数组),包含最近执行的前台进程的退出状态值列表管道(可能只包含一个命令)。