
После запуска скриптов 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
.
Не уверен, что является причиной этого и какие еще настройки/диагностику мне следует проверить.
решение1
Когда вы вводите это в командной строке:
$ And now you don't.
>
Это вызывает продолжение командной строки. У вас, по-видимому, не установлена вторичная подсказка на OSX (я предполагаю, что это касается подсказки), но ваша проблема в том, что вы используете эту конкретную строку, "$ А теперь вы этого не делаете.`".
Когда вы вводите это:
$ echo And we''re back.
And were back.
Вы закрываете продолжение. Попробуйте другую строку, чтобы проверить, сохраняется ли та же проблема.
ПРИМЕЧАНИЕ:Суть проблемы заключается в вашем использовании '....'
.
решение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
. Вы можете проверить, не запущен ли какой-либо процесс, какое приложение запускает этот скрипт и почему он ведет себя неправильно.