Перейти к содержимому

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

5

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

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

874 просмотра
Paul Roub спросил 12 лет назад
P 192

2 ответа

0

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 · 12 лет назад · 1

Редактирование примера, чтобы уменьшить путаницу.

Paul Roub · 12 лет назад · 0
slm ответил 12 лет назад
S 6 130
0

Параметр в 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 · 12 лет назад · 1

@PaulRoub, возможно, что-то запускает редактор с удаленным выводом. dtruss -f может сообщить вам, какие команды он выполняет, и / или что делает ioctl, который отключает эхо (запустите dtruss stty -echo, чтобы получить номер ioctl).

sch · 12 лет назад · 0
sch ответил 12 лет назад
S 232