Terminal

為什麼終端屬性看起來與終端外部不同?

  • March 5, 2018

如果我打開一個終端(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使用規範模式,但如果從另一個終端查看它存在海森堡問題,我不知道我會怎麼做。

所以,我的兩個主要問題:

  1. 當我從另一個終端查看終端時,終端是否似乎具有不同的屬性?(例如,我的第一個終端是否仍處於規範模式,但stty -a -F返回的資訊不正確?)
  2. 如果我切換到另一個終端時終端確實改變了屬性,它怎麼知道?當我不直接查看第一個終端時,是否會以某種方式通知它?

PS:我也在 Linux 控制台上試過這個,只是為了確保它不是一個偽終端的東西。結果相同。

Bash 在等待您輸入命令行時需要將終端置於一次字元模式,以便您可以使用 emacs 或類似 vi 的編輯字元來編輯命令行。這就是您在範例中從另一個終端查看終端屬性時看到的模式。

就在它執行程序之前(在您的範例中,stty),bash 將終端重新置於規範模式,在該模式下,您只有幾個特殊的編輯字元可用作業系統提供,例如退格鍵和 Control-W,基本上是程序僅在您鍵入 Enter 後才獲得輸入。

當 bash 重新獲得控制權時,例如在程序完成或暫停後,它將再次將終端置於一次字元模式。

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