Ruby-Befehle schalten das TTY-Echo aus

Ruby-Befehle schalten das TTY-Echo aus

Nach dem Ausführen von Ruby-Skripten wird die Bash-Befehlszeile in fast 100 % der Fälleerscheineninaktiv zu sein, während es in Wirklichkeit stillschweigend meine Tastenanschläge akzeptiert, ohne sie mir anzuzeigen.

Dies ist bei mehreren Versionen von Ruby und im Laufe mehrerer Betriebssystem-Updates passiert. Derzeit verwende ich v1.9.2p29 auf OS X 10.9.2. resetbehebt das Problem; clearund andere nicht.

Das „jetzt tust du es nicht“ usw. unten ist die Ausgabe nicht angezeigter echoBefehle.

$ 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 -aAusgabe, wenn alles funktioniert:

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 -aAusgabe, wenn die Dinge nicht so sind:

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

Mir fällt insbesondere auf, dass in lflagszu echogeworden ist -echo.

Ich bin nicht sicher, woran dies liegt oder welche anderen Einstellungen/Diagnosen ich überprüfen sollte.

Antwort1

Wenn Sie dies in Ihre Eingabeaufforderung eingeben:

$ And now you don't.
> 

Dies löst eine Befehlszeilenfortsetzung aus. Sie haben anscheinend Ihre sekundäre Eingabeaufforderung unter OSX nicht eingestellt (ich vermute, es geht um die Eingabeaufforderung), aber Ihr Problem liegt darin, dass Sie diese bestimmte Zeichenfolge verwenden: „$ Und jetzt tun Sie es nicht mehr.“.

Wenn Sie Folgendes eingeben:

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

Sie schließen die Fortsetzung ab. Versuchen Sie es mit einer anderen Zeichenfolge, um zu sehen, ob das gleiche Problem weiterhin besteht.

NOTIZ:Entscheidend ist letztlich Ihre Verwendung von '....'.

Antwort2

Die echoEinstellung in den Terminaltreibereinstellungen gibt an, ob der TerminaltreiberEchodie eingegebenen Zeichen zurück. Anwendungen wie vioder moderne Shellsauf ihre Aufforderungverwenden Sie das nicht, noch verwenden sie das Terminalkanonischer Modus, sie verarbeiten jeden Tastendruck undEchowas Sie selbst eingeben, indem Sie es auf das Endgerät schreiben.

Allerdings readline und jede Anwendung, die es verwendet, wie bashoder gdbauch deaktivierenihre EchoWenn sie feststellen, dass das Terminal echodeaktiviert wurde, gefällt das anderen Shells, zshoder tcshauch nicht.

Beachten Sie, dass dies in der Shell-Eingabeaufforderung (oder in jeder modernen Shell mit eigenem Zeileneditor) echoimmer deaktiviert ist, da readline ein eigenes Echo ausführt. / speichert die Terminaleinstellungen vor jeder Eingabeaufforderung und setzt sie auf die Einstellungen, die zur Implementierung des Zeileneditors erforderlich sind (einschließlich der Deaktivierung ) und setzt sie vor dem Ausführen eines Befehls auf den gespeicherten Wert zurück.bashbashreadlineecho

Die Ausgabe stty -aist also die gespeicherte Konfiguration. Und bash/readline (aber nicht andere Shells) deaktiviert sein eigenes Echo, wenn echoes deaktiviert istin dieser gespeicherten Konfiguration.

Sie können dasselbe Verhalten wie das angezeigte erzielen, indem Sie Folgendes eingeben:

stty -echo

Anwendungen deaktivieren das Terminalecho normalerweise, wenn sie eine Kennwortabfrage ausgeben oder, wie im obigen Fall vi, bashum ihre eigene Textbearbeitung zu implementieren (und dann verwenden sie nicht den kanonischen Terminalmodus) und stellen die Einstellungen beim Beenden wieder her.

Ein weiterer Unterschied in Ihrem Fall ist, dass es icanondeaktiviert wurde, was darauf hindeutet, dass es sich eher um den zweiten Fall handelt.

Ihr Ruby-Skript startet wahrscheinlich eine visuelle Anwendung, die die Terminaleinstellungen nicht richtig zurücksetzt. Das kann passieren, wenn die Anwendung mit einem nicht abfangbaren Signal wie SIGKILL beendet wird oder wenn sie noch läuft oder angehalten ist.

Um die Terminaleinstellungen wiederherzustellen, können Sie stty saneoder ausführen reset. Sie sollten überprüfen, ob kein Prozess mehr ausgeführt wird, welche Anwendung dieses Skript ausführt und warum es sich nicht richtig verhält.

verwandte Informationen