Por que “head / bin / ls” reinicia o terminal?

4

Se você fizer algo bobo como cat /var/log/wtmp , seu terminal pode ficar confuso, como mostra a imagem. Eu sei que existem várias maneiras de corrigir isso . Uma das maneiras não mencionadas nesse post, sobre a qual me falaram anos atrás, é executar o comando destacado em uma caixa vermelha na imagem.

head /bin/ls

Isso funciona.

Por quê?

    
por John Oxley 05.04.2016 / 18:00

2 respostas

7

Os terminais são controlados por sequências de escape enviadas em linha com os dados de caracteres a serem exibidos. É assim que, por exemplo, echo -e '\e[34m' transformará o texto em muitos terminais em azul. Ele está ecoando alguns caracteres para o terminal - eles são uma seqüência de escape que define a cor do primeiro plano.

O terminal ficou bagunçado ao ser instruído a mudar para algum conjunto de caracteres alternativos (e possivelmente mais coisas). Ele fez isso porque /var/log/wtmp continha as seqüências de escape usadas para alternar conjuntos de caracteres. Tecnicamente, não é realmente confuso - está operando exatamente como foi projetado. (Tente tput smacs para atrapalhar o seu terminal sob demanda; tput rmacs para alterar esse parâmetro de volta.)

reset , etc. funcionam enviando seqüências de escape redefinindo vários parâmetros para seus padrões. Isso "consertou" o terminal.

Esse truque head /bin/ls está funcionando porque seu /bin/ls (ou pelo menos a parte impressa por head ) contém uma sequência de escape que altera os parâmetros do terminal novamente. Isso não é de todo portátil - ele não funciona aqui, por exemplo - e provavelmente faz um trabalho muito menos minúsculo redefinindo padrões do que reset , etc.)

    
por 05.04.2016 / 18:32
3

Na verdade, a imagem não mostra nenhum caractere de desenho de linha. Executar reset normalmente ajudaria com isso . Mas reset também repara os modos de terminal, um pouco mais confiáveis que stty sane :

  • Se você usar stty sane , isso corrigirá problemas com os modos de terminal para eco e retorno de carro, mas em plataformas Unix (ou seja, AIX, HPUX e Solaris) que define o caractere de apagamento como um valor que você provavelmente não desejaria, por exemplo, ^? ou # em vez de ^H .
  • O comando reset (pelo menos aquele fornecido por ncurses) melhora essas configurações e envia a sequência de inicialização do terminal. Isso geralmente redefine o conjunto de caracteres alternativos (mas alguns terminais podem diferir, já que isso também é um recurso às vezes ignorado nas descrições de terminal do Unix).

Se você exibia caracteres de desenho de linha, provavelmente seria porque havia um caractere de controle shift-out (não uma seqüência de escape):

SO        Shift Out (Ctrl-N) -> Switch to Alternate Character Set.  This
          invokes the G1 character set.

Aqui está uma captura de tela mostrando os caracteres de desenho de linha, que fiz por

ls
tput smacs
ls -l

Ocasionalmente,alguémmostraumaimagemcomlixobináriomisturadocomcaracteresdedesenhodelinha,masnemessaperguntanemaoutramencionada(ab)usamesserecurso.Emvezdisso,oqueelesilustramsãodoisoutrosrecursos:

  • nemtodososcaracteressãoimprimíveis(considereasgrandesáreasembranconaimagem)e
  • algumasseqüênciasdebytesnãoformamUTF-8legalesãomostradasporemuladoresdeterminalcommarcasespeciais,porexemplo, Caractere de substituição Unicode .

Leitura adicional:

por 06.04.2016 / 01:17