Команды Ruby отключают эхо Tty
После запуска сценариев Ruby почти 100% времени командная строка bash будет выглядеть неактивной, хотя фактически она молча принимает нажатия клавиш, не показывая их мне.
Это произошло с несколькими версиями Ruby через несколько обновлений ОС; на данный момент я использую v1.9.2p29 на OS X 10.9.2. reset
исправляет проблему; clear
и др. нет.
"Теперь нет" и т. Д. Ниже - результат невидимого echo
команды.
$ echo Now you see my typing...
Now you see my typing...
$ bundle exec jekyll build
...
done.
$ This is the output of an unseen echo command
$ About to run "reset"
$ echo And we''re back.
And we're back.
stty -a
вывод, когда все работает:
speed 9600 baud; 57 rows; 187 columns;
lflags: icanon isig -iexten echo echoe echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff -ixany imaxbel iutf8
-ignbrk brkint -inpck ignpar -parmrk
oflags: opost onlcr oxtabs onocr onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = <undef>; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = <undef>;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
stty -a
вывод, когда вещи не:
speed 9600 baud; 57 rows; 187 columns;
lflags: -icanon isig -iexten -echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl inlcr -igncr ixon -ixoff -ixany imaxbel iutf8
-ignbrk brkint -inpck ignpar -parmrk
oflags: opost onlcr oxtabs onocr onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = <undef>; eof = <undef>; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U;
lnext = <undef>; min = 1; quit = ^\; reprint = <undef>;
start = ^Q; status = <undef>; stop = ^S; susp = ^Z; time = 0;
werase = <undef>;
Я отмечаю, в частности, что в lflags
, echo
стал -echo
,
Не уверен, что вызывает это, или какие другие настройки / диагностику я должен проверить.
2 ответа
echo
настройка в настройках драйвера терминала указывает, должен ли драйвер терминала отображать введенные вами символы. Приложения, такие как vi
или современные оболочки по их запросу не используют это, и при этом они не используют терминальный канонический режим, они действительно обрабатывают каждое нажатие клавиши и отражают то, что вы печатаете сами, записывая в терминальное устройство.
Тем не менее, readline и любое приложение, использующее его, как bash
или же gdb
также отключить их эхо, когда они обнаружат, что терминал echo
был отключен, другие оболочки, как zsh
или же tcsh
нет.
Обратите внимание, что echo
всегда отключен на bash
(или в любой современной оболочке с собственным редактором строк) приглашение командной строки, поскольку readline выполняет свое собственное отображение. bash
/readline
сохраняет настройки терминала перед каждым приглашением и устанавливает его на тот, который необходим для реализации редактора строк (который включает отключение echo
) и сбрасывает его до сохраненного значения перед выполнением команды.
Так что выход stty -a
это сохраненная конфигурация А также bash
/ readline (но не другие оболочки) отключает свое эхо, когда echo
отключен в этой сохраненной конфигурации.
Вы можете получить то же поведение, которое вы видите, выполнив:
stty -echo
Приложения обычно отключают эхо-сигналы терминала, когда выдают запрос на ввод пароля, или, как в случае с vi
или же bash
выше, чтобы реализовать свое собственное редактирование текста (и тогда они не используют терминальный канонический режим), и они восстанавливают настройки при выходе.
Еще одно отличие в вашем случае заключается в том, что icanon
был отключен, что предполагает, что мы более вероятны во втором случае.
Ваш скрипт ruby, вероятно, запускает визуальное приложение, которое не может правильно сбросить настройки терминала. Это может произойти, если это приложение будет уничтожено с помощью не перехватываемого сигнала, такого как SIGKILL, или если оно все еще работает или приостановлено.
Чтобы восстановить настройки терминала, вы можете сделать stty sane
или же reset
, Возможно, вы захотите проверить, не запущен ли еще какой-либо процесс и какое приложение запускает этот сценарий и почему он работает неправильно.
Когда вы вводите это в вашем приглашении:
$ And now you don't.
>
Это вызывает продолжение командной строки. Очевидно, у вас не установлена вторичная подсказка в OSX (я предполагаю, что подсказка), но ваша проблема в том, что вы используете именно эту строку "$, а теперь нет".
Когда вы печатаете это:
$ echo And we''re back.
And were back.
Вы закрываете продолжение. Попробуйте другую строку, чтобы увидеть, имеет ли место та же проблема.
ПРИМЕЧАНИЕ. Суть в том, что вы используете '....'
,