Восстановление tty с помощью stty

Я пишу скрипт bash, чтобы читать некоторые данные пользователя (например, запрос пароля), и я хотел бы получить результат и передать его через его stdout. (Я работаю в среде GNU / Linux, с последним программным обеспечением).

Вот упрощенная версия скрипта, который воспроизводит проблемы

….

# read_input.sh # # Issue B : redirection of "3>&1" here causes stty error when # this script is executed via a command subsitution context subshell exec 3>&1 </dev/tty >/dev/tty tty_settings=`stty -g` # Issue A : uncommented version doesn't restore tty properly. #trap 'stty "$tty_settings";' EXIT #trap 'echo "...interrupting"; exit 1' INT ABRT HUP QUIT TERM trap 'echo "...interrupting"; stty "$tty_settings"; exit 1' INT ABRT HUP QUIT TERM stty -echo echo "Enter input: " input="" while IFS= read -r -n1 char; do # nb: stripped out proper char handling code here, # (except return), for simplicity if [[ $char = "" ]]; then break fi input+=$char echo -n "*" done echo "" stty "$tty_settings" #trap - EXIT INT ABRT HUP QUIT TERM trap - INT ABRT HUP QUIT TERM echo "$input" >&3 

Намерение состоит в том, чтобы записать в fd 3 результат ввода (если stdout этого скрипта при вызове подключен в трубе) – при этом все еще есть tty во время взаимодействия. Затем я изменяю tty с помощью stty для управления эхом и т. Д., Восстанавливая любые изменения с помощью ловушки.

Я столкнулся с двумя проблемами.


Проблема A

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

В случае с одной строкой – скажем, на INT: tty восстанавливается, а затем вызывается через обработчик. Я не поймаю EXIT сам – зачем это нужно?


Проблема B

Это связано с перенаправлением «3> и 1» exec в контексте подсетей.

По какой-то причине, скажем, я запустил этот скрипт («read_input.sh») в подоболочке – и хочу захватить его вывод из другого скрипта с помощью подстановки команд:

….

 # read_input_caller.sh input=$(sh read_input.sh) echo "$input" 

Я обнаружил, что вызов stty в обработчике ловушки жаловался на прерывание вызывающего скрипта (скажем, с помощью ^ C):

stty: «стандартный ввод»: ошибка ввода / вывода

Это сообщение об ошибке происходит только из-за перенаправления «3> и 1» в строке exec, вызывающей строку exec без «3> и 1», нет никакой ошибки stty (но не очень полезной для передачи ввода в stdout). Я не могу понять, почему это так?

В вызывающем скрипте другой вызов в виде подоболочки, например

….

 sh read_input.sh | cat 

Не вызывает эту ошибку.

Интересно отметить, что при выпуске B, контрольный терминал tty, казалось, был восстановлен должным образом, даже при проблемном улавливании / восстановлении проблемы A.