whiptail: как перенаправить вывод в переменную окружения?

Я пытаюсь использовать whiptail, так как это облегченная альтернатива в диалог и, кажется, установлен по умолчанию в большинстве систем (т. е. людям не нужно ходить и устанавливать его, если он «забыт» или не был установлен по умолчанию). Я проверил вопрос № 1562666 для нескольких примеров здесь, но я ищу альтернативу для перенаправления вывода, чтобы установить среду переменная, а не просто запись на диск.

Например, когда я пытаюсь использовать диалог, это работает (я вижу диалоговое окно и устанавливается переменная среды):

result=$(dialog --output-fd 1 --inputbox "Enter some text" 10 30)
echo Result=$result

Однако это не работает при использовании whiptail вместо диалога, так как диалоговое окно никогда не появляется. Я должен перенаправить его в файл на диске и прочитать его, например:

result=$(tempfile) ; chmod go-rw $result
whiptail --inputbox "Enter some text" 10 30 2>$result
echo Result=$(cat $result)
rm $result

Это работает, и я могу использовать один и тот же временный файл от начала до конца (удаляя его, когда скрипт заканчивается). Но неудобно использовать диск только для этого, вместо того, чтобы хранить все это в памяти (перенаправляя на переменную среды).

Поэтому я спрашиваю: я что-то забыл или мне действительно нужно использовать диск при использовании whiptail?

Заранее благодарим вас за отзыв.


person jbatista    schedule 28.12.2009    source источник
comment
Кажется, что всякий раз, когда whiptail перенаправляет свой stdin/stdout, он не отображается (будь то с $(...) или ... | ). Ваше решение выглядит довольно хорошо, учитывая поведение хлыстового хвоста. Кстати, на моей машине с Debian у меня есть whiptail, но нет диалога по умолчанию, на opensuse у меня есть диалог и нет существующего whiptail в официальных репозиториях.   -  person Zeograd    schedule 28.12.2009
comment
@Zeograd, по крайней мере, на RHEL whiptail поставляется в упаковке тритона.   -  person Kimvais    schedule 28.12.2009
comment
Хорошо, спасибо Кимвейс. zypper search whiptail не помог мне, даже если в информации было указано, что он есть.   -  person Zeograd    schedule 28.12.2009
comment
@Zeograd Zeograd: я полагаю, что, учитывая, что каждый дистрибутив выбирает для установки тот или иной, это должно быть простым вопросом проверки его существования, определения переменной среды и использования ее в остальной части скрипта.   -  person jbatista    schedule 29.12.2009


Ответы (2)


Вероятно, это связано с тем, что whiptail использует stdin и stdout для печати поля ввода, поэтому вы не можете перенаправить stderr напрямую на stdout, но вам нужно поменять их местами, например:

foobar=$(whiptail --inputbox "Enter some text" 10 30 3>&1 1>&2 2>&3)
person Kimvais    schedule 28.12.2009
comment
У меня есть вопрос. Почему вы поставили 3>&1 1>&2 2>&3 в конце whiptail? Без него команда не работает, но я не знаю почему. - person A. Dziedziczak; 19.07.2017
comment
Он меняет местами stdout и stderr, возвращая миру здравомыслие. $(...) захватывает стандартный вывод, поэтому вы действительно хотите, чтобы материал графического интерфейса печатался в стандартный вывод, а результат выводился в стандартный вывод, но по какой-то причине whiptail поменял их местами. Эти три перенаправления меняют их обратно. - person John Kugelman; 01.05.2019
comment
... Я полагаю, можно было бы добавить 3>&- в конец, чтобы оставить 1 и 2 местами, а 3 красиво закрыть. Впрочем, не то чтобы это имело особое значение. - person Charles Duffy; 01.05.2019
comment
Это мило! Таким образом, мы можем определить как функцию: function menu() { whiptail "$@" 3>&1 1>&2 2>&3 3>&- ; }, а затем мы можем сделать более чистый вызов, такой как result=$(menu --inputbox "Enter some text" 10 30) или аналогичный. - person jbatista; 18.11.2020

Похоже, что whiptail(1) записывает свой управляющий вывод в терминал на основе установки переменной окружения TERM. Следовательно, вы не можете использовать стандартный поток вывода whiptail(1) для установки переменной. Кроме того, whiptail(1) записывает пользовательский ввод в поле ввода в стандартный поток ошибок, поэтому, опять же, вы не можете использовать его стандартный поток вывода для установки переменной.

person Steve Emmerson    schedule 28.12.2009