
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. reset
resolve o problema; clear
, e outros, não.
O "agora não", etc., abaixo é a saída de echo
comandos 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 -a
saí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 -a
saí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
, echo
tornou-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 echo
configuração nas configurações do driver de terminal especifica se o driver de terminal deveecode volta os caracteres que você digita. Aplicativos como vi
ou 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 bash
ou gdb
também desativedeles ecoandoquando detectam que o terminal echo
foi desabilitado, outros shells gostam zsh
ou tcsh
não.
Observe que echo
está sempre desabilitado no bash
prompt do shell (ou em qualquer shell moderno com seu próprio editor de linha), pois readline faz seu próprio eco. bash
/ readline
salva 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 echo
está 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 vi
acima 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 icanon
foi 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 sane
ou 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.