为什么终端属性看起来与终端外部不同?

Sch*_*lls 6 terminal tty stty

如果我打开一个终端(xfce4-terminal 0.6.3,但我怀疑这很重要)并查看设置了哪些终端属性(BASH 在终端中运行),

$ stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -extproc
Run Code Online (Sandbox Code Playgroud)

然后我有一大堆终端属性。够好了。如果我再看看我正在使用的终端:

$ tty
/dev/pts/0
Run Code Online (Sandbox Code Playgroud)

然后,在我的终端的新选项卡上(该新选项卡恰好是 /dev/pts/1),我查看了我的第一个终端的终端属性,它的终端属性似乎略有不同:

$ stty -a -F /dev/pts/0
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = <undef>; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -extproc
Run Code Online (Sandbox Code Playgroud)

值得注意的是,这里的原始终端似乎不在规范模式下,它没有文字下一个特殊字符......

那么为什么会发生这种情况呢?我希望能够看到这样的事情,例如,如果现代ed使用规范模式,但如果从另一个终端查看它存在海森堡问题,我不知道我会怎么做。

所以,我的两个主要问题:

  1. 当我从另一个终端查看时,终端是否只是具有不同的属性?(例如,我的第一个终端是否仍处于规范模式,但stty -a -F返回的信息不正确?)
  2. 如果我切换到另一个终端时终端真的改变了属性,它怎么知道?当我不直接看它时,是否以某种方式通知了第一个终端?

PS:我也在 Linux 控制台上尝试过这个,只是为了确保它不是伪终端。结果一样。

Mar*_*ick 8

Bash 需要在等待您输入命令行时将终端置于一次一个字符模式,以便您可以使用 emacs 或类似 vi 的编辑字符来编辑命令行。这就是您在示例中从另一个终端查看终端属性时看到的模式。

就在它运行一个程序之前(在你的例子中,stty),bash 将终端放回规范模式,在那里你只有一些操作系统提供的特殊编辑字符,例如退格和 Control-W,基本上是程序只有在您键入 Enter 后才能获取输入。

当 bash 重新获得控制权时,比如程序完成或暂停后,它将再次将终端置于一次一个字符模式。