打开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 implementstcsetattr(3)
) 和 forioctl(TCGETS)
(tcgetattr(3)
)。这些是 . 使用的相同功能stty(1)
。如果你运行 bash,--noediting
你会发现它只保留了终端设置。[1] 不完全是“原始”模式
cfmakeraw(3)
;你可以在这里看到确切的细节。所有这些终端设置都记录在termios(3)
手册页中。