O que é Ctrl + x em um terminal Linux, exatamente?
(tl; dr: longa investigação. Classifique as perguntas no final.)
Acabei de notar que quando pressiono super+ algumas letras (por exemplo, command + n, ou windowsKey + a, etc), obtenho uma lista do meu arquivo de hosts em um formato estranho e uma nova linha com duas letras.
Por exemplo:
user@host $ <here i press Super+n>
::1 localhost test.com
test2.com test3.com
user@host $sn
se eu iniciar meu editor de texto e pressionar as mesmas teclas, vejo: @sne nada mais.
$ hexdump x
0000000 7340 0a6e
0000004
o que não parece certo, já que nada aconteceria se fosse isso que aquela combinação de teclas estava enviando. Portanto, deve estar faltando alguma informação. Vamos tentar outra coisa
$ cat `tty` | hexdump
^X@sn
0000000 4018 6e73 000a
0000005
Vou supor que 000aé a consequência de eu ter que inserir uma nova linha e pressionar ctrl + D para sair do tty e permitir o redirecionamento para hexdump. Então, vamos ignorar isso.
Fico com o resto dos valores hexadecimais, que estariam na ordem correta:
18: CAN cancel
40: @
73: s
6E: n
Não consegui encontrar o que CAN char faz. não está listado emstty -a
$ stty -a
speed 38400 baud; rows 33; columns 151; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; 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 -flusho -extproc
Não há ^Xlugar nenhum . Mas foi legal catmostrá-lo mapeado como tal, senão eu estaria muito perdido.
A Wikipedia sobre o caractere de controle de cancelamento não explica o que está acontecendo. Mas confirma o ^Xmapeamento.
Agora que sabemos que CAN é ^X, posso digitar: ^X(que deixa o terminal em um estado estranho e sem eco, muito parecido com START, que mostra correto como ^Q) e, em seguida, pressionar @mostra a mesma lista de hosts de antes!
OK, ^Xpode ser um recurso de algo além do terminal. Isso deixa Bash. o que me levou a esta resposta (que ironicamente aponta para informações excluídas da wikipedia e não é a resposta escolhida). O manual do bash mostra ^X(com a notação C-x), é usado em todo o lugar:
C-x @é usado para possíveis conclusões de nome de host (Cx @)
Não tem nada a ver com Cancel Control Character, mas se sttynão sabe que esse char é ^ X, o que faz o mapeamento? ou seja, se eu digitar, ^V ^Xobtenho o caractere 0x18.
Portanto, toda a investigação me deixa com algumas perguntas:
O que é responsável pelo caractere Control+ x= cancelar (ascii 0x18) mapeando o terminal? por que não está listado
stty -a? Mascatsabe disso, como? Por que posso digitar Cancelar Char com^V ^X?por que pressionar super + algumas letras resultam em
^X@s+ letra? (esta é a única parte que só acontece no konsole do KDE, todo o resto funciona no xterm também. Eu não tenho nenhuma tecla de atalho especial configurada em lugar nenhum) (editar: própria pergunta mais detalhada aqui )
Respostas
Como você disse, C-x @é usado para conclusões de nomes de host possíveis. Se você procurar isso no link do manual do bash que você forneceu, está na seção "Permitindo que o Readline digite para você".
Readline é uma biblioteca que permite edição de linha e outras coisas, como completar tabulação. É usado no bash, mas também em outros programas.
Portanto, readline dentro do bash, com uma configuração particular para o bash, é responsável por mostrar a lista de hosts. Isso não tem nada a ver com stty, que é parte das configurações do tty, em uma parte do unix que surgiu muito antes da biblioteca readline.
A interpretação das configurações de tty ocorre muito antes de readline ver qualquer uma delas.
cat não "sabe" de nada disso.
Quanto ao porquê, Superjunto com algumas outras chaves, produzir esta sequência: No meu sistema não, e eu não tenho ideia do porquê no seu sistema. O primeiro lugar que procuro é o emulador de terminal (você não disse qual usa, eu uso xterm). O segundo lugar é o seu gerenciador de desktop / gerenciador de janelas.