Bash
bash 如何在執行命令前後設置 tty 屬性?
打開
xterm
,執行tty
並查看偽終端從文件(假設它是/dev/pts/0
)。然後打開另一個xterm
並執行$ stty -F /dev/pts/0 speed 38400 baud; line = 0; lnext = <undef>; discard = <undef>; min = 1; time = 0; -brkint -icrnl -imaxbel iutf8 -icanon -echo
然後
/bin/sleep 1000
在第一個 xterm 中執行。然後再次在第二個 xterm 中執行相同的stty
命令:$ stty -F /dev/pts/0 speed 38400 baud; line = 0; -brkint -imaxbel iutf8
sleep
然後在第一個 xterm 中終止命令。然後再次在第二個 xterm 中執行相同的stty
命令:$ stty -F /dev/pts/0 speed 38400 baud; line = 0; lnext = <undef>; discard = <undef>; min = 1; time = 0; -brkint -icrnl -imaxbel iutf8 -icanon -echo
我們看到 bash 在執行命令之前更改 tty 屬性,並在執行命令後恢復它們。它在 bash 文件中的描述在哪裡?tty 屬性是否全部恢復,或者某些屬性被程序更改後可能無法恢復?
那就是
readline(3)
行編輯庫,它通常作為 bash 的一部分靜態建構,但也被其他程序使用。每次開始讀取使用者的命令時,readline 都會保存終端設置,並將終端置於“原始”模式
$$ 1 $$,因此它可以處理左右移動插入點,從歷史記錄中呼叫命令等。
readline(3)
返回時(例如,當使用者按下 Enter 時),終端的原始設置被恢復。Readline 也會混淆信號,這可能會導致一些令人費解的行為。 如果您使用 stracebash
,請查找ioctl(TCSETS*)
(which implementstcsetattr(3)
) 和 forioctl(TCGETS)
(tcgetattr(3)
)。這些是 . 使用的相同功能stty(1)
。如果你執行 bash,--noediting
你會發現它只保留了終端設置。$$ 1 $$不完全是“原始”模式
cfmakeraw(3)
;你可以在這裡看到確切的細節。所有這些終端設置都記錄在termios(3)
手冊頁中。