Os comandos do Ruby estão desligando o tty echo

5

Após a execução dos scripts Ruby, quase 100% do tempo, a linha de comando do bash aparecerá para ficar inativa, enquanto na verdade ela aceita silenciosamente minhas teclas sem mostrá-las para mim.

Isso aconteceu com várias versões do Ruby, através de várias atualizações do SO; no momento, estou executando o v1.9.2p29 no OS X 10.9.2. reset corrige o problema; clear , et al, não.

O "now you don't", etc., abaixo, é a saída dos comandos echo não vistos.

$ 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 output 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 -a output quando as coisas não estã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>;

Noto, em particular, que em lflags , echo se tornou -echo .

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

    
por Paul Roub 03.03.2014 / 19:23

2 respostas

0

Quando você digita isso no seu prompt:

$ And now you don't.
> 

Isso está provocando uma continuação de linha de comando. Você aparentemente não tem o seu prompt secundário definido no OSX (eu estou supondo que a coisa pronta), mas o seu problema é porque você está usando essa seqüência específica, "$ E agora você não faz. '".

Quando você digita isso:

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

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

OBSERVAÇÃO: A questão básica é o uso de '....' .

    
por 04.03.2014 / 01:18
0

A configuração echo nas configurações do driver do terminal especifica se o driver do terminal deve repetir os caracteres digitados. Aplicativos como vi ou shells modernos em seu prompt não usam isso, nem usam o terminal canonical mode , eles lidam com todas as teclas pressionadas e echo o que você digita sozinho gravando no terminal.

No entanto, readline e qualquer aplicativo que o use, como bash ou gdb , também desativam o seu echoing quando detectam que o terminal echo foi desativado , outros shells como zsh ou tcsh não.

Observe que echo está sempre desativado no prompt de shell bash (ou qualquer shell moderno com seu próprio editor de linhas), pois readline faz seu próprio eco. bash / readline salva as configurações do terminal antes de cada prompt e o configura para o que precisa para implementar seu editor de linhas (que inclui a desativação de echo ) e redefine para o valor salvo antes de executar um comando.

Portanto, a saída de stty -a é essa configuração salva. E bash / readline (mas não outras shells) desabilita seu próprio eco quando echo está desabilitado nessa configuração salva .

Você pode obter o mesmo comportamento que está visualizando:

stty -echo

Normalmente, os aplicativos desabilitam o eco do terminal quando emitem uma solicitação de senha ou, como no caso de vi ou bash acima, para implementar sua própria edição de texto (e não usam o modo canônico terminal) e eles restauram as configurações ao sair.

Outra diferença no seu caso é que icanon foi desativado, o que sugere que estamos mais propensos no segundo caso.

Seu script ruby provavelmente inicia um aplicativo visual que falha ao redefinir as configurações do terminal corretamente. Isso pode acontecer se o aplicativo for eliminado com um sinal não passível de interceptação, como o SIGKILL ou se ainda estiver em execução ou suspenso.

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

    
por 05.03.2014 / 10:01