Comandos Ruby estão desativando tty echo

Comandos Ruby estão desativando tty echo

Depois de executar scripts Ruby, quase 100% do tempo, a linha de comando do bash iráaparecerestar inativo, quando na verdade está aceitando silenciosamente minhas teclas, sem mostrá-las para mim.

Isso aconteceu com múltiplas versões do Ruby, através de múltiplas atualizações do sistema operacional; no momento, estou executando a v1.9.2p29 no OS X 10.9.2. resetresolve o problema; clear, e outros, não.

O "agora não", etc., abaixo é a saída de echocomandos invisíveis.

$ 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 -asaída quando as coisas estão funcionando:

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 -asaída quando as coisas não são:

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>;

Percebo, em particular, que em lflags, echotornou-se -echo.

Não tenho certeza do que está causando isso ou quais outras configurações/diagnósticos devo verificar.

Responder1

Quando você digita isso em seu prompt:

$ And now you don't.
> 

Isso está acionando uma continuação da linha de comando. Aparentemente, você não tem seu prompt secundário definido no OSX (suponho que seja no prompt), mas seu problema é porque você está usando aquela string específica, "$ E agora você não usa. `".

Quando você digita isso:

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

Você está encerrando a continuação. Tente uma string diferente para ver se o mesmo problema é verdadeiro.

OBSERVAÇÃO:A questão principal é o uso do '....'.

Responder2

A echoconfiguração nas configurações do driver de terminal especifica se o driver de terminal deveecode volta os caracteres que você digita. Aplicativos como viou shells modernosno seu promptnão use isso, nem eles usam o terminalmodo canônico, eles lidam com cada pressionamento de tecla eecoo que você digita escrevendo no dispositivo terminal.

No entanto, readline e qualquer aplicativo que o utilize, goste bashou gdbtambém desativedeles ecoandoquando detectam que o terminal echofoi desabilitado, outros shells gostam zshou tcshnão.

Observe que echoestá sempre desabilitado no bashprompt do shell (ou em qualquer shell moderno com seu próprio editor de linha), pois readline faz seu próprio eco. bash/ readlinesalva as configurações do terminal antes de cada prompt e o define como necessário para implementar seu editor de linha (que inclui desabilitar echo) e redefine-o para o valor salvo antes de executar um comando.

Portanto, a saída stty -aé essa configuração salva. E bash/readline (mas não outros shells) desativa seu próprio eco quando echoestá desativadonaquela configuração salva.

Você pode obter o mesmo comportamento que está vendo emitindo:

stty -echo

Os aplicativos normalmente desabilitam o eco do terminal quando emitem um prompt de senha, ou como no caso viacima bash, para implementar sua própria edição de texto (e então não usam o modo canônico do terminal) e restauram as configurações ao sair.

Outra diferença no seu caso é que ele icanonfoi desativado, o que sugere que estamos mais provavelmente no segundo caso.

Seu script Ruby provavelmente inicia um aplicativo visual que não consegue redefinir as configurações do terminal corretamente. Isso pode acontecer se esse aplicativo for encerrado com um sinal não interceptável como SIGKILL ou se ainda estiver em execução ou suspenso.

Para restaurar as configurações do terminal, você pode fazer um stty saneou reset. Você pode querer verificar se nenhum processo ainda está em execução e qual aplicativo esse script é executado e por que está se comportando mal.

informação relacionada