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 .

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

2 ответа2

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

0

Когда вы вводите это в вашем приглашении:

$ And now you don't.
> 

Это вызывает продолжение командной строки. Похоже, у вас не установлена вторичная подсказка в OSX (я полагаю, подсказка), но ваша проблема в том, что вы используете именно эту строку «$, а теперь нет».

Когда вы печатаете это:

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .