Можно ли запустить диалог / сценарий whiptail в одном TTY из другого?

3853
pxul

Происхождение этого вопроса, для меня, заключается в том, что %preпри установке пользовательского дистрибутива на основе Centos можно запустить команду whiptail в скрипте из файла кикстарта. Однако поведение, наблюдаемое в Anaconda, может быть легко воспроизведено через виртуальные терминалы любой системы Linux.

Для запуска команды whiptail в Anaconda в качестве %preсценария кикстарта необходимо переключить TTY и выполнить команду в этом новом TTY. Преобладающее предложение относительно того, как это сделать:

%pre exec </dev/tty6 >/dev/tty6 2>/dev/tty6 chvt 6  # then execute your command, for example: whiptail --inputbox "Enter some text..." 10 30  # switch back to the original TTY chvt1 exec </dev/tty1 >/dev/tty1 2>/dev/tty1 %end 

При использовании этого метода диалоговое окно whiptail корректно отображается в новом TTY, однако взаимодействие с диалогом не может происходить - например, нажатие tab, а не переключение между элементами ввода текста, элементами «Ok» и «Cancel», фактически вставляет вкладка в поле ввода текста. Точно так же использование клавиш со стрелками приводит к тому, что escape-последовательности записываются в диалоге:

enter image description here

Такое поведение также наблюдается при использовании python snack (использует ту же библиотеку, что и whiptail - libnewt) и диалоговом окне.

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

TL; DR

Я заинтересован в создании сценария, содержащего команды whiptail / dialog, которые могут быть выполнены в одном TTY и получать / вводить сценарий в / из другого TTY.

1

2 ответа на вопрос

1
Gooseman

This worked for me (Anaconda, Fedora 20):

%pre --log=/tmp/ks_pre.log #!/bin/bash # Backup fds in temporal ones exec >&1 exec >&2 # Go to current terminal for pre% section exec 1>>/dev/pts/0 exec 2>>/dev/pts/0 # Show message whiptail --yesno 'Do you like StackOverflow?' --yes-button 'Yes' --no-button 'No' 10 70 if [ $? = 1 ] then echo 'User sucks' >> /tmp/ks_pre.log else echo 'User rocks' >> /tmp/ks_pre.log fi # Restore fds exec 1>&$STDOUTBACK exec 2>&$STDERRBACK # Close temporal fds exec >&- exec >&- %end 

Possible questions:

  1. Why did you use /dev/pts/0?

    Because from the Anaconda console I found out what device was being used as stdin for the scripts running in the pre% section. I guess, it could be another one depending on the RedHat and Fedora versions. But it is really easy to find out which is the correct one for your case.

  2. What are the exec >&1 and exec >&- things?

    Go to read your man bash and search for the REDIRECTION section, where you can find the following:

Each redirection that may be preceded by a file descriptor number may instead be preceded by a word of the form . In this case, for each redirection operator except >&- and <&-, the shell will allocate a file descriptor greater than 10 and assign it to varname. If >&- or <&- is preceded by, the value of var‐ name defines the file descriptor to close.

0
user150471

This should be a comment, but...

You have to manipulate stdin,stderr and stdout for whiptail to output to a variable.

x=`whiptail --inputbox "hello" 10 40 3>&1 1>&2 2>&3` 

This puts the output into /tmp/x:

whiptail --inputbox "hello" 10 40 3>/tmp/x 1>&2 2>&3 
Возможно, мой вопрос не был слишком ясен. Я заинтересован в создании сценария, содержащего команды whiptail / dialog, которые могут быть выполнены в одном TTY и получать / вводить сценарий в / из другого TTY. Это можно смоделировать, открыв один виртуальный терминал и попытавшись (а) переключить потоки ввода / вывода и (б) переключить виртуальные терминалы из сценария. Выше этого достигается `exec / dev / tty6 2> / dev / tty6` и` chvt 6` соответственно. pxul 9 лет назад 0

Похожие вопросы