如果我打开一个终端(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
然后我就有一大堆终端属性。够好了。如果我看看我正在使用什么终端:
$ tty
/dev/pts/0
然后,在我的终端的一个新选项卡上(该新选项卡恰好是 /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
值得注意的是,这里的原始终端似乎不处于规范模式,它没有字面上的下一个特殊字符......
那么为什么会发生这种情况呢?我希望能够查看类似的内容,例如,现代是否ed
使用规范模式,但如果从另一个终端查看它存在海森堡问题,我不知道该怎么做。
所以,我的两个主要问题:
- 当我从另一个终端查看该终端时,该终端是否看起来具有不同的属性? (例如,我的第一个终端是否仍处于规范模式,但
stty -a -F
返回了错误的信息?) - 如果终端有真的当我切换到另一个终端时更改属性,它如何知道?当我不直接查看第一个终端时,是否会以某种方式通知它?
PS:我也在 Linux 控制台上尝试过这个,只是为了确保它不是一个伪终端。结果相同。
答案1
Bash 在等待您输入命令行时需要将终端设置为一次字符模式,以便您可以使用 emacs 或类似 vi 的编辑字符来编辑命令行。这就是您在示例中从另一个终端查看终端属性时看到的模式。
就在运行程序之前(在您的示例中,stty
),bash 将终端恢复到规范模式,在该模式下,操作系统仅提供一些特殊的编辑字符,例如退格键和 Control-W,并且基本上是程序仅在输入 Enter 后才获取输入。
当 bash 重新获得控制权时,例如程序完成或暂停后,它会将终端再次置于一次字符模式。