
Después de ejecutar scripts de Ruby, casi el 100% del tiempo, la línea de comando bashaparecerestar inactivo, cuando en realidad acepta silenciosamente mis pulsaciones de teclas sin mostrármelas.
Esto ha sucedido con múltiples versiones de Ruby, a través de múltiples actualizaciones del sistema operativo; Por el momento, estoy ejecutando v1.9.2p29 en OS X 10.9.2. reset
soluciona el problema; clear
, et al, no lo hacen.
El "ahora no lo haces", etc., a continuación es el resultado de echo
comandos invisibles.
$ 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
salida cuando las cosas están 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
salida cuando las cosas no son:
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, en particular, que en lflags
, echo
se ha convertido en -echo
.
No estoy seguro de qué está causando esto ni qué otras configuraciones/diagnósticos debo verificar.
Respuesta1
Cuando escribe esto en su mensaje:
$ And now you don't.
>
Esto desencadena una continuación de la línea de comando. Aparentemente no tienes tu mensaje secundario configurado en OSX (supongo que en el mensaje), pero tu problema se debe a que estás usando esa cadena en particular, "$ Y ahora no".
Cuando escribes esto:
$ echo And we''re back.
And were back.
Estás cerrando la continuación. Pruebe con una cadena diferente para ver si se produce el mismo problema.
NOTA:El problema fundamental es el uso de '....'
.
Respuesta2
La echo
configuración en la configuración del controlador de terminal especifica si el controlador de terminal debeecorecuperar los caracteres que escribe. Aplicaciones como vi
o conchas modernas.a su avisono usan eso, ni usan la terminalmodo canónico, manejan cada pulsación de tecla yecolo que escribe por sí mismos escribiendo en el dispositivo terminal.
Sin embargo, readline y cualquier aplicación que lo use, como bash
o gdb
también deshabilitarsu haciendo ecocuando detectan que el terminal echo
ha sido deshabilitado, a otros shells les gusta zsh
o tcsh
no.
Tenga en cuenta que echo
siempre está deshabilitado en el bash
indicador de shell (o en cualquier shell moderno con su propio editor de líneas), ya que readline hace su propio eco. bash
/ readline
guarda la configuración del terminal antes de cada mensaje y la establece en la que necesita para implementar su editor de líneas (que incluye deshabilitar echo
) y lo restablece al valor guardado antes de ejecutar un comando.
Entonces el resultado stty -a
es esa configuración guardada. Y bash
/readline (pero no otros shells) desactiva su propio eco cuando echo
está desactivadoen esa configuración guardada.
Puede obtener el mismo comportamiento que está viendo emitiendo:
stty -echo
Las aplicaciones generalmente desactivan el eco del terminal cuando solicitan una contraseña, o como en el caso vi
anterior bash
, para implementar su propia edición de texto (y luego no usan el modo canónico del terminal), y restauran la configuración al salir.
Otra diferencia en su caso es que icanon
se ha deshabilitado, lo que sugiere que es más probable que estemos en el segundo caso.
Su script Ruby probablemente inicia una aplicación visual que no restablece correctamente la configuración del terminal. Eso podría suceder si esa aplicación se cierra con una señal no detectable como SIGKILL o si todavía está ejecutándose o suspendida.
Para restaurar la configuración del terminal, puede hacer a stty sane
o reset
. Es posible que desee verificar que todavía no se esté ejecutando ningún proceso y qué aplicación ejecuta ese script y por qué se comporta mal.