
Ich habe es untersucht terminfo
und stty
. Wenn ich stty -a|grep icanon
es ausführe, scheint der kanonische Modus eingestellt zu sein, aber wenn ich versuche, ihn mit auszuschalten stty -icanon
und erneut zu prüfen, sehe ich, dass er immer noch eingestellt ist. Wenn ich dasselbe unter Bash mache, kann ich Icanon deaktivieren, aber ich merke keine Änderung im Verhalten. Ich habe also zwei Fragen: Warum kann ich Icanon in zsh nicht deaktivieren und wie sollte es das Verhalten beeinflussen, wenn ich es könnte?
Antwort1
Wenn ich dasselbe unter Bash mache, kann ich Icanon deaktivieren, bemerke aber keine Änderung im Verhalten.
Das liegt daran, dass Bash den kanonischen Modus einschaltetausbeim Lesen von Befehlen des Benutzers (um Zeilenbearbeitungsfunktionen implementieren zu können, die der Terminaltreiber nicht bietet - wie das Einfügen von Text, das Bewegen des Cursors nach links und rechts mit den Pfeiltasten usw.) und dannstellt wieder herdie vorherigen Terminaleinstellungen beim Ausführen einer beliebigen Befehlszeile.
Um die Wirkung zu sehen, führen Sie einen externen Befehl wie den folgenden aus cat
:
bash$ stty -icanon
bash$ cat
hheelloo
Jeder Schlüssel wird wiederholt, einmal, weil stty echo
eingeschaltet ist, und einmal, weil cat
er sofort gelesen und zurückgeschrieben wird, anstatt auf vollständige Zeilen warten zu müssen.
[mit zsh] Wenn ich versuche, es mit auszuschalten
stty -icanon
und noch einmal zu prüfen, sehe ich, dass es immer noch eingestellt ist.
Beim Wiederherstellen der vorherigen Terminaleinstellungen wie oben beschrieben, zsh
wird auch erzwungeneinige vernünftige Standardeinstellungen(einschließlich der Einstellungen echo
und icanon
). Wahrscheinlich liegt das daran, dass angenommen wird, dass, wenn ein Befehl den kanonischen Modus verlassen hatausbeim Beenden war es nur ein Unfall (z. B. wenn eine Vollbild-App vi
abstürzte less
).
Ich konnte keine zsh
Option finden, mit der es genauso funktioniert bash
(und wie jedes andere Programm, das die Readline-Bibliothek verwendet), aber wenn Sie den Icanon-Modus vor dem Ausführen eines Befehls ausschalten möchten, können Sie dies tun, indem Sie stty von derselben Befehlszeile aus aufrufen:
zsh$ stty -icanon; cat
hheelloo