Zenity --progress返回字符串和返回码(POSIX shell)

时间:2016-07-10 12:25:00

标签: shell posix zenity

我正在尝试调用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函数的输出吗?

2 个答案:

答案 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