Bash

bash 如何在執行命令前後設置 tty 屬性?

  • October 18, 2019

打開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 也會混淆信號,這可能會導致一些令人費解的行為。 如果您使用 strace bash,請查找ioctl(TCSETS*)(which implements tcsetattr(3)) 和 for ioctl(TCGETS)( tcgetattr(3))。這些是 . 使用的相同功能stty(1)。如果你執行 bash,--noediting你會發現它只保留了終端設置。

$$ 1 $$不完全是“原始”模式cfmakeraw(3)你可以在這裡看到確切的細節。所有這些終端設置都記錄在termios(3)手冊頁中。

引用自:https://unix.stackexchange.com/questions/547423