
我一直在探索terminfo
和stty
。如果我運行,stty -a|grep icanon
似乎已設定規範模式,但如果我嘗試將其關閉stty -icanon
並再次檢查,我發現它仍然設定。當我在 bash 下做同樣的事情時,我可以停用 icanon,但我沒有註意到行為有任何變化。所以我有兩個問題;為什麼我無法在 zsh 中停用 icanon,如果可以的話,它會如何影響行為?
答案1
當我在 bash 下做同樣的事情時,我可以停用 icanon,但我沒有註意到行為有任何變化。
那是因為 bash 轉變了規範模式離開當讀取使用者的命令時(為了能夠實現終端驅動程式未提供的行編輯功能 - 例如插入文字、使用箭頭鍵左右移動遊標等),然後恢復運行任何命令列時的先前終端設定。
若要查看其效果,請執行外部命令,例如cat
:
bash$ stty -icanon
bash$ cat
hheelloo
每個鍵都會重複,一次因為stty echo
打開,一次因為cat
將立即讀取它並寫回,而不必等待完整的行。
[使用 zsh] 如果我嘗試將其關閉
stty -icanon
並再次檢查,我會發現它仍然設定。
當如上所述恢復先前的終端設定時,zsh
也強制執行一些合理的預設值(包括echo
和icanon
設定)。可能是因為它假設,如果命令離開規範模式離開終止後,這只是一個意外(例如,當全螢幕應用程式崩潰vi
或less
崩潰時)。
我無法找到任何zsh
可以使其像bash
使用 readline 庫的其他程式一樣工作的選項,但是如果您想在運行命令之前關閉 icanon 模式,您可以透過從相同的命令列:
zsh$ stty -icanon; cat
hheelloo