Question Les commandes Ruby désactivent tty echo


Après avoir exécuté les scripts Ruby, presque 100% du temps, la ligne de commande bash apparaître être inactif, alors qu'en fait il accepte en silence mes frappes sans me les montrer.

Cela s'est produit avec plusieurs versions de Ruby, grâce à plusieurs mises à jour du système d'exploitation. pour le moment, j'exécute v1.9.2p29 sous OS X 10.9.2. reset répare le problème; clearet autres, non.

Le "maintenant vous ne faites pas", etc., ci-dessous est la sortie de invisible echo commandes.

$ 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 sortie quand les choses fonctionnent:

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 sortie quand les choses ne sont pas:

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

Je remarque en particulier qu'en lflags, echo est devenu -echo.

Je ne suis pas sûr de ce qui cause ceci, ou de quels autres paramètres / diagnostics je devrais vérifier.


5
2018-03-03 18:23


origine


même question sur demande différente: apple.stackexchange.com/q/122964/7057 - glenn jackman
Vrai. Différents publics, mais appropriés pour l'un ou l'autre site, à mon humble avis. Si j'obtiens une réponse en une fois, je ferme l'autre question avec un lien vers la réponse. Je vais résister à l'envie de laisser un "même commentaire sur le superutilisateur ..." réponse à votre commentaire là-bas. :-) - Paul Roub
Avez-vous testé d'autres émulateurs de terminaux? Est-ce spécifique à terminal.app? - terdon
Le point de PaulRoub, @ glennjackman est valide. Publication croisée la même question exacte est considérée comportement abusif. Nous pouvons débattre de la validité de cette position, mais c'est le statu quo actuel. - terdon
@PaulRoub - La traversée des commentaires est l’une des principales raisons pour lesquelles la publication croisée n’est généralement pas tolérée sur les sites SE. S'il vous plaît, fermez l'un ou l'autre. En tant que répondeur, il est extrêmement ennuyeux de devoir "construire" la position d'un Q + any A en sautant sur plusieurs sites. - slm


Réponses:


Lorsque vous tapez ceci dans votre invite:

$ And now you don't.
> 

Cela déclenche une suite de ligne de commande. Vous n'avez apparemment pas votre invite secondaire définie sur OSX (je devine sur le prompt) mais votre problème est parce que vous utilisez cette chaîne particulière, "$ Et maintenant vous ne le faites pas."

Lorsque vous tapez ceci:

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

Vous fermez la suite. Essayez une chaîne différente pour voir si le même problème est vrai.

REMARQUE: La question fondamentale est votre utilisation de '....'.


0
2018-03-04 00:18



Je n'ai pas tapé "Et maintenant vous ne faites pas". j'ai tapé $ echo And now you don''t, qui n'a jamais été montré à l'écran. Vous voyez le sortie du echo commander. Il n'y a pas de suite. - Paul Roub
Modifier l'exemple pour réduire la confusion. - Paul Roub


le echo paramètre dans les paramètres du pilote de terminal spécifie si le pilote de terminal doit écho sauvegarder les caractères que vous tapez. Applications comme vi ou des coquilles modernes à leur prompte ne pas utiliser cela, ni ils utilisent le terminal mode canonique, ils manipulent chaque touche pressée et écho ce que vous tapez vous-même en écrivant au terminal.

Cependant, readline et toute application l'utilisant, comme bash ou gdb désactiver également leur  en écho quand ils détectent que le terminal echo a été désactivé, d'autres shells aiment zsh ou tcsh ne pas.

Notez que echo est toujours désactivé au bash (ou tout shell moderne avec leur propre éditeur de ligne) invite du shell comme readline fait son propre écho. bash/readline enregistre les paramètres du terminal avant chaque invite et le définit comme celui dont il a besoin pour implémenter son éditeur de ligne (ce qui inclut la désactivation echo) et le réinitialise à la valeur enregistrée avant d'exécuter une commande.

Donc, la sortie de stty -a est cette configuration enregistrée. Et bash/ readline (mais pas les autres shells) désactive son propre écho lorsque echo est désactivé dans cette configuration enregistrée.

Vous pouvez obtenir le même comportement en émettant:

stty -echo

Les applications désactivent généralement l'écho de terminal lorsqu'elles émettent une invite de mot de passe, ou comme dans le cas de vi ou bash ci-dessus, pour implémenter leur propre édition de texte (et puis ils n'utilisent pas le mode canonique terminal), et ils restaurent les paramètres à la sortie.

Une autre différence dans votre cas est que icanon a été désactivé, ce qui suggère que nous sommes plus susceptibles dans le second cas.

Votre script Ruby démarre probablement une application visuelle qui ne parvient pas à réinitialiser correctement les paramètres du terminal. Cela pourrait se produire si cette application est supprimée avec un signal non-traçable comme SIGKILL ou si elle est toujours en cours d'exécution ou suspendue.

Pour restaurer les paramètres du terminal, vous pouvez faire une stty sane ou reset. Vous voudrez peut-être vérifier qu'aucun processus n'est encore en cours d'exécution et quelle application est exécutée par ce script et pourquoi il se comporte mal.


0
2018-03-05 09:01



stty sane, stty echo et (comme indiqué dans la question) reset tout réparer le problème. J'essaie de comprendre comment prévenir le problème, qui semble au moins quelque peu spécifique à mon système, sinon je verrais des rapports de bogue à ce sujet quelque part. Les scripts Ruby sont des générateurs, des mises à jour de gemmes - rien avec un composant visuel. - Paul Roub
@PaulRoub, peut-être quelque chose démarre un éditeur avec la sortie rejetée. dtruss -f peut être en mesure de vous dire quelles commandes il exécute, et / ou que fait l'ioctl qui désactive l'écho (exécuter dtruss stty -echo pour obtenir le numéro ioctl). - sch