Terminal
為什麼終端屬性看起來與終端外部不同?
如果我打開一個終端(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 控制台上試過這個,只是為了確保它不是一個偽終端的東西。結果相同。
Bash 在等待您輸入命令行時需要將終端置於一次字元模式,以便您可以使用 emacs 或類似 vi 的編輯字元來編輯命令行。這就是您在範例中從另一個終端查看終端屬性時看到的模式。
就在它執行程序之前(在您的範例中,
stty
),bash 將終端重新置於規範模式,在該模式下,您只有幾個特殊的編輯字元可用作業系統提供,例如退格鍵和 Control-W,基本上是程序僅在您鍵入 Enter 後才獲得輸入。當 bash 重新獲得控制權時,例如在程序完成或暫停後,它將再次將終端置於一次字元模式。