
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. reset
behebt das Problem; clear
und andere nicht.
Das „jetzt tust du es nicht“ usw. unten ist die Ausgabe nicht angezeigter echo
Befehle.
$ 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
Ausgabe, 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 -a
Ausgabe, 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 lflags
zu echo
geworden 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 echo
Einstellung in den Terminaltreibereinstellungen gibt an, ob der TerminaltreiberEchodie eingegebenen Zeichen zurück. Anwendungen wie vi
oder 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 bash
oder gdb
auch deaktivierenihre EchoWenn sie feststellen, dass das Terminal echo
deaktiviert wurde, gefällt das anderen Shells, zsh
oder tcsh
auch nicht.
Beachten Sie, dass dies in der Shell-Eingabeaufforderung (oder in jeder modernen Shell mit eigenem Zeileneditor) echo
immer 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.bash
bash
readline
echo
Die Ausgabe stty -a
ist also die gespeicherte Konfiguration. Und bash
/readline (aber nicht andere Shells) deaktiviert sein eigenes Echo, wenn echo
es 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
, bash
um 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 icanon
deaktiviert 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 sane
oder 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.