Zenity --progress возвращает строку и код возврата (оболочка POSIX)

Я пытаюсь вызвать функцию оболочки, и пока эта функция обрабатывается, должно отображаться диалоговое окно прогресса zenity. Однако я хочу, чтобы эхо-строка из этой функции сохранялась в переменной для дальнейшей обработки, а также возвращаемый код этой функции.

И все это в оболочке POSIX.

Мой текущий подход таков:

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?


person lockdoc    schedule 10.07.2016    source источник


Ответы (2)


zenity этого не делает. Для диалога прогресса все, что он возвращает в среду, — это код выхода.

Вы можете видеть это в исходном коде:

Единственный текст, напечатанный в вашей оболочке из zenity, — это текст дополнительной кнопки. Он просто обновляет графический интерфейс и отбрасывает текст сообщений о ходе выполнения, например, в zenity_progress_update_time_remaining

person Thomas Dickey    schedule 10.07.2016

Вы можете создать подоболочку и запускать там команды. Единственное предостережение заключается в том, что команды, выполняемые после завершения диалога хода выполнения, не могут быть записаны в стандартный вывод. В противном случае вы получите ошибку ввода-вывода.

В вашем случае это будет выглядеть так:

(
    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

Я использовал это, чтобы создать небольшую оболочку GUI для sha256sum, например:

(
  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
person Sethos II    schedule 08.07.2017