Команды Ruby отключают эхо Tty

733
Paul Roub

После запуска сценариев 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.

Не уверен, что вызывает это, или какие другие настройки / диагностику я должен проверить.

5
один и тот же вопрос задавайте по другому: http://apple.stackexchange.com/q/122964/7057 glenn jackman 10 лет назад 1
Правда. Разные аудитории, но подходящие для любого сайта, ИМХО. Если я получу ответ в одном месте, другой вопрос я закрою ссылкой на решенный. Я буду сопротивляться желанию оставить там «тот же комментарий на суперпользователя ...» на ваш комментарий. :-) Paul Roub 10 лет назад 0
Вы тестировали какие-либо другие эмуляторы терминала? Это специфично для Terminal.app? terdon 10 лет назад 0
PaulRoub, точка зрения @ glennjackman действительна. [Перекрестная публикация] (http://meta.stackexchange.com/q/64068/203101) один и тот же вопрос считается [оскорбительным поведением] (http://meta.stackexchange.com/questions/64068/is-cross -posting-а-вопрос-на-множественным стек-обменные сайты оседание-если-заместитель Цюй # comment181805_75012). Мы можем обсудить обоснованность этой позиции, но это текущий статус-кво. terdon 10 лет назад 2
@PaulRoub - Пересечение комментариев является одной из основных причин, по которой перекрестная публикация обычно не допускается на сайтах SE. Пожалуйста, закройте это или другое. Как ответчик очень раздражает, что мне придется «строить» положение Q + любой А, перепрыгивая через несколько сайтов. slm 10 лет назад 0
@terdon Я только что проверил, и это происходит в iTerm2. Это определенно не зависит от Terminal.app. Отредактировал заголовок и теги соответственно. Paul Roub 10 лет назад 0
Я удалил другой вопрос, кстати. Спасибо за отзывы и напоминания об этом. Paul Roub 10 лет назад 0

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

0
slm

When you type this in your prompt:

$ And now you don't. > 

This is triggering a command line continuation. You apparently do not have your secondary prompt set on OSX (I'm guessing on the prompt thing) but your issue is because you're using that particular string, "$ And now you don't.`".

When you type this:

$ echo And we''re back. And were back. 

You're closing off the continuation. Try a different string to see if the same issue holds true.

NOTE: The bottom line issue is your use of '....'.

Я не набрал «А теперь нет». Я набрал `echo И теперь ты не ', что никогда не показывалось на экране. Вы видите * вывод * команды `echo`. Там нет продолжения. Paul Roub 10 лет назад 1
Редактирование примера, чтобы уменьшить путаницу. Paul Roub 10 лет назад 0
0
sch

Параметр в 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. Возможно, вы захотите проверить, не запущен ли еще какой-либо процесс и какое приложение запускает этот сценарий и почему он работает неправильно.

`stty sane`,` stty echo` и (как отмечено в вопросе) `reset` решают проблему. Я пытаюсь выяснить, как * предотвратить * проблему, которая, по крайней мере, в некоторой степени специфична для моей системы, иначе я бы где-нибудь видел сообщения об ошибках. Сценарии ruby ​​- это сборщики, обновления гемов - ничего с визуальным компонентом. Paul Roub 10 лет назад 1
@PaulRoub, возможно, что-то запускает редактор с удаленным выводом. `dtruss -f` может сообщить вам, какие команды он выполняет, и / или что делает ioctl, который отключает эхо (запустите` dtruss stty -echo`, чтобы получить номер ioctl). sch 10 лет назад 0