结合使用wget和zenity/yad

3

我正在尝试通过使用zenity/yad为wget下载过程提供一种GUI界面。我想到了以下这种方法:

wget http://example.com/ 2>&1 | \
sed -u 's/^[a-zA-Z\-].*//; s/.* \{1,2\}\([0-9]\{1,3\}\)%.*/\1\n#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的退出状态),因此我无法确定下载是成功还是失败。
如何解决上述问题?

2
我认为你需要编写一个带有中间文件的脚本,这样你就可以捕获中间状态。 - GreenAsJade
1个回答

3
你可以这样说:
set -o pipefail

说出这句话会导致$?报告管道中最后一个以非零状态退出的命令的退出代码。引用自内置设置:“pipefail” 若设置,则管道的返回值是最后(最右侧)一个以非零状态退出的命令的值,或者如果管道中所有命令都成功退出则为零。默认情况下禁用此选项。此外,数组PIPESTATUS将报告管道中所有命令的返回代码。说:
echo "${PIPESTATUS[@]}"

会列出所有这些。以您的示例为例,它将显示3个数字,例如:

1 0 0

如果wget失败。

引用自手册:

PIPESTATUS

一个数组变量(参见数组),其中包含最近执行的前台管道(可能仅包含单个命令)中进程的退出状态值列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接