Команды 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.

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

ПРИМЕЧАНИЕ. Суть в том, что вы используете '....',

Другие вопросы по тегам