Como posso descobrir quais códigos de escape meu terminal está enviando para determinados códigos especiais que cat não serão exibidos?

Como posso descobrir quais códigos de escape meu terminal está enviando para determinados códigos especiais que cat não serão exibidos?

Eu queria descobrir o que meu terminal está enviando para Ctrl+Backspace e Alt+Backspace, a maneira padrão de fazer isso é rodar catno terminal e digitar coisas geralmente funciona, mas com certas saídas como essas, os resultados são complicados.

Estou supondo que Alt+Backspace está enviando \x1b\x7f(ou seja, escape backspace), mas o que acontece se eu executar cate digitar Ctrl+V e Alt+Backspace, ou apenas Alt+Backspace, o que acontece é que o escape será "digitado" e então imediatamente ele é removido com backspace para parecer que nada está acontecendo. Só fui informado disso uma vez, ao ver meu computador renderizar um único quadro da ^[fuga.

Até agora não tenho certeza de como descobrir o que Ctrl+Backspace está enviando. não é Ctrl+W, embora ambos excluam uma palavra no prompt do bash, porque abaixo catdele não há nada enquanto Ctrl+W exclui uma palavra!

Responder1

Basta usar este comando:

showkey -a

Responder2

Com zsh:

$ STTY='raw -echo min 0 time 40' cat -vte
^[^?

Ou com bash:

$ s=$(stty -g); stty raw -echo min 0 time 40; cat -vte; stty "$s"
^[^?

Você verá a entrada do terminal bruta conforme ela é enviada e renderizada por cat -vte. Não digite nada por 4 segundos (40 decisegundos) para parar.

Você pode substituir cat -vtepor od -An -w1 -tu1 -tx1 -to1 -ta(assumindo GNU odou compatível), por exemplo, para ver cada valor de byte em decimal, hexadecimal, octal ou como caractere.

  27
  1b
 033
 esc
 127
  7f
 177
 del

Responder3

Encontrei um truque em outro lugar para mostrar um único caractere no bash usando read -rsn1 key && echo "$key" | xxd. Isso foi 90% do caminho, mas fiquei preso nisso por um tempo porque simplesmente voltaria 0x1b (Escape), o que não era o quadro completo.

Então eu mudei para read -rsn2 key && echo "$key" | xxde isso aumenta para quantos caracteres sua sequência de escape tiver, um pouco de experimentação resolve. Então, no meu terminal eu tinhaambosCtrl+ e Alt+Backspace mapeados para 0x1b, 0x7f (meta-backspace se preferir) no passado por motivos de conveniência. Estou seguindo esse caminho em primeiro lugar porque quero configurar um novo emulador de terminal para me permitir excluir palavras com ambos os combos, mas apenas um deles funciona. O read -rsnin bash é uma boa ferramenta para executar um nível mais baixo de depuração de saída do que o cat.

informação relacionada