Por que os atributos do terminal parecem diferentes de fora do terminal?

5

Se eu abrir um terminal (xfce4-terminal 0.6.3, mas duvido que seja importante) e eu ver quais atributos do terminal estão configurados (o BASH está rodando no terminal),

$ 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

então eu tenho um monte de atributos de terminal. Bem o suficiente. Se eu der uma olhada no terminal que estou usando:

$ tty
/dev/pts/0

então, em uma nova aba do meu terminal (que nova aba é / dev / pts / 1) eu olho para os atributos do terminal do meu primeiro terminal, parece ter um pouco diferente atributos do terminal:

$ 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

Notavelmente, o terminal original aqui parece não estar no modo canônico, ele não tem nenhum próximo caractere literal ...

Então, por que isso acontece? Eu gostaria de poder olhar coisas assim para ver, por exemplo, se o moderno ed usa o modo canônico, mas se há um problema de Heisenberg de olhar para ele de outro terminal, eu não sei como faça isso.

Então, minhas duas principais perguntas:

  1. O terminal parece ter atributos diferentes quando eu olho para outro terminal? (por exemplo, meu primeiro terminal ainda está no modo canônico, mas stty -a -F retorna informações incorretas?)
  2. Se o terminal realmente alterar os atributos quando eu alterno para o outro terminal, como ele sabe? O 1º terminal é de alguma forma informado quando eu não estou olhando diretamente para ele?

P.S: Eu tentei isso no console do Linux também, só para ter certeza de que não era uma coisa pseudo-terminal. Mesmos resultados.

    
por Scott Walls 30.08.2015 / 21:16

1 resposta

6

O Bash precisa colocar o terminal em modo de caractere por vez enquanto aguarda que você digite uma linha de comando, para que você possa editar a linha de comando usando emacs ou caracteres de edição semelhantes ao vi. Esse é o modo que você viu quando olhou para os atributos do terminal de outro terminal no seu exemplo.

Pouco antes de executar um programa (no seu exemplo, stty ), o bash coloca o terminal novamente no modo canônico, onde você tem apenas alguns caracteres de edição especiais disponíveis como cortesia do sistema operacional, como backspace e Control. W, e basicamente o programa recebe entrada somente depois que você digita Enter.

Quando o bash recupera o controle, digamos que após o programa ser finalizado ou suspenso, ele colocará o terminal novamente no modo de caractere por vez.

    
por 30.08.2015 / 21:25