Ruby-Befehle schalten tty Echo aus

843
Paul Roub

Ruby - Skripte Nach dem Ausführen von fast 100% der Zeit, die Bash - Befehlszeile erscheinen inaktiv zu sein, während in der Tat ist es still ist meine Tastenanschläge zu akzeptieren, ohne sie zu mir zeigt.

Dies ist bei mehreren Ruby-Versionen durch mehrere Betriebssystem-Updates geschehen. Im Moment verwende ich v1.9.2p29 unter OS X 10.9.2. resetbehebt das Problem clearet al. nicht.

Das "Jetzt, das Sie nicht tun" usw. ist die Ausgabe von unsichtbaren echoBefehlen.

$ 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 Dinge funktionieren:

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

Ich bemerke, insbesondere, dass in lflags, echogeworden ist -echo.

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

5
Gleiche Frage auf Anfrage anders: http://apple.stackexchange.com/q/122964/7057 glenn jackman vor 10 Jahren 1
Wahr. Unterschiedliche Zielgruppen, jedoch für beide Standorte geeignet, IMHO. Wenn ich einmal eine Antwort bekomme, schließe ich die andere Frage mit einem Link zur gelösten. Ich werde dem Drang widerstehen, eine "gleiche Bemerkung zu Superuser ..." zu hinterlassen. :-) Paul Roub vor 10 Jahren 0
Haben Sie noch andere Terminalemulatoren getestet? Ist das spezifisch für terminal.app? terdon vor 10 Jahren 0
PaulRoub, @ glennjackman's Punkt ist gültig. [Crossposting] (http://meta.stackexchange.com/q/64068/203101) Die gleiche Frage wird als [missbräuchliches Verhalten] (http://meta.stackexchange.com/questions/64068/is-cross) betrachtet -posting-a-frage-auf-mehrere-stack-exchange-sites-allowed-if-the-qu # comment181805_75012). Wir können die Gültigkeit dieser Position debattieren, aber es ist der aktuelle Status quo. terdon vor 10 Jahren 2
@PaulRoub - Das Überschreiten der Kommentare ist einer der Hauptgründe, warum Cross Posting auf den SE-Standorten normalerweise nicht toleriert wird. Bitte entweder das eine oder das andere schließen. Als Beantworter ist es extrem ärgerlich, dass ich die Position eines Q + eines beliebigen A durch ein Überspringen mehrerer Standorte "konstruieren" müsste. slm vor 10 Jahren 0
@terdon habe ich gerade überprüft, und es passiert auch in iTerm2. Es ist definitiv nicht Terminal.app-spezifisch. Der Titel und die Tags wurden entsprechend bearbeitet. Paul Roub vor 10 Jahren 0
Ich habe die andere Frage entfernt, übrigens. Vielen Dank für die Rückmeldungen und Erinnerungen. Paul Roub vor 10 Jahren 0

2 Antworten auf die Frage

0
slm

Wenn Sie dies in Ihre Eingabeaufforderung eingeben:

$ And now you don't. >  

Dies löst eine Befehlszeilenfortsetzung aus. Sie haben anscheinend keine sekundäre Eingabeaufforderung für OSX (ich schätze bei der Eingabeaufforderung), aber Ihr Problem liegt darin, dass Sie diese bestimmte Zeichenfolge verwenden: "$ And now do not".

Wenn Sie das 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 zutrifft.

HINWEIS: Das Endergebnis ist Ihre Verwendung von '....'.

Ich habe nicht "Und jetzt tust du nicht" eingegeben. Ich tippte "Echo" und jetzt "Sie nicht", was nie auf dem Bildschirm gezeigt wurde. Sie sehen die * Ausgabe * des `echo'-Befehls. Es gibt keine Fortsetzung. Paul Roub vor 10 Jahren 1
Bearbeiten Sie das Beispiel, um die Verwirrung zu verringern. Paul Roub vor 10 Jahren 0
0
sch

Die echoEinstellung in den Terminaltreibereinstellungen gibt an, ob der Terminal - Treiber sollte echo die Zeichen wieder angezeigt werden . Anwendungen wie vioder moderne Shells verwenden an ihrer Eingabeaufforderung weder das Gerät noch den kanonischen Modus des Terminals . Sie behandeln jeden Tastendruck und geben das von Ihnen eingegebene Echo selbst wieder, indem Sie auf das Terminalgerät schreiben.

Readline und jede Anwendung, die es verwendet, mögen bashoder gdbdeaktivieren ihr Echo jedoch, wenn sie feststellen, dass das Terminal echodeaktiviert wurde, andere Shells mögen zshoder tcshnicht.

Beachten Sie, dass echoder bashShell-Prompt (oder eine moderne Shell mit eigenem Zeileneditor) immer deaktiviert ist, da readline sein eigenes Echo ausführt. bash/ readlinespeichert die Terminaleinstellungen vor jeder Aufforderung und setzt sie auf diejenige, die zur Implementierung des Zeileneditors erforderlich ist (einschließlich Deaktivierung echo), und setzt sie vor der Ausführung eines Befehls auf den gespeicherten Wert zurück.

Die Ausgabe von stty -aist also die gespeicherte Konfiguration. Und bash/ readline (aber keine anderen Shells) deaktiviert das eigene Echo, wenn echoes in dieser gespeicherten Konfiguration deaktiviert ist .

Sie erhalten dasselbe Verhalten, das Sie sehen, wenn Sie Folgendes ausgeben:

stty -echo 

Anwendungen deaktivieren normalerweise das Echo des Terminals, wenn sie eine Kennwortaufforderung ausgeben, oder wie im Fall von vioder bashdarüber, um ihre eigene Textbearbeitung zu implementieren (und sie verwenden nicht den kanonischen Modus des Terminals). Sie stellen die Einstellungen beim Beenden wieder her.

Ein weiterer Unterschied in Ihrem Fall besteht darin, dass icanondie Option deaktiviert ist. Dies legt nahe, dass wir im zweiten Fall wahrscheinlicher sind.

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

Um die Terminaleinstellungen wiederherzustellen, können Sie eine stty saneoder reset. Möglicherweise möchten Sie überprüfen, ob noch ein Prozess ausgeführt wird und welche Anwendung das Skript ausführt und warum es nicht ordnungsgemäß funktioniert.

`stty sane`,` stty echo` und (wie in der Frage erwähnt) `reset` beheben das Problem. Ich versuche herauszufinden, wie ich das Problem * verhindern * kann, das zumindest für mein System etwas spezifisch zu sein scheint, andernfalls würde ich irgendwo Fehlerberichte darüber erhalten. Die Ruby-Skripte sind Builder, Gem-Updates - nichts mit einer visuellen Komponente. Paul Roub vor 10 Jahren 1
@PaulRoub, möglicherweise startet etwas einen Editor, dessen Ausgabe verworfen wird. `dtruss -f` kann Ihnen vielleicht sagen, welche Befehle es ausführt und / oder was das ioctl bewirkt, das das Echo deaktiviert (führen Sie` dtruss stty -echo 'aus, um die ioctl-Nummer zu erhalten). sch vor 10 Jahren 0