我正在尝试调用shell函数,当此函数处理时,应显示zenity进度对话框。 但是,我希望将来自该函数的echo函数存储在变量中以便进一步处理,以及该函数的返回代码。
所有这些都在POSIX shell中。
我目前的做法是这样的:
output="$( compress "${input}" | \
zenity --progress \
--pulsate \
--title="Compressing files" \
--text="Scanning mail logs..." \
--percentage=0 \
)";
if [ "$?" != "0" ]; then
echo "${output}"
exit 1
fi
显示进度对话框,但最后$output
为空。
知道如何获取compress
函数的输出吗?
答案 0 :(得分:0)
zenity
没有这样做。对于进度对话框,它返回到环境的所有内容都是退出代码。
您可以在源代码中看到:
从zenity
打印到shell的唯一文本是额外按钮文本。它只是更新GUI并丢弃进度消息的文本,例如,在zenity_progress_update_time_remaining
答案 1 :(得分:0)
您可以在其中创建子shell并运行命令。唯一需要注意的是,在完成进度对话框后执行的命令不允许写入标准输出。否则会出现I / O错误。
在你的情况下,这将是这样的:
(
output="$(compress "${input}")"
if [ "$?" != "0" ]; then
#echo "${output}" <- this would result in an I/O error because the pipe is closed
# write to somewhere else, maybe standard error like so:
echo "${output}" >&2
exit 1
fi
) | \
zenity --progress \
--pulsate \
--title="Compressing files" \
--text="Scanning mail logs..." \
--percentage=0
我用它来为sha256sum创建一个小的“GUI”包装器,如下所示:
(
HASH=$(sha256sum "$1")
# send EOF to end the zenity progress dialog
exec 1>&-
zenity --title="sha256sum" --info --text="$HASH" --no-wrap
) | zenity --progress --title="sha256sum" --pulsate --auto-close --no-cancel