Qual é o caminho certo para manejar consistentemente o terminal bash?

5

Estou no OSX 10.11.1 e, ocasionalmente, meu terminal do bash é mutilado. Muitas vezes acontece quando eu acidentalmente cat um arquivo binário. O resultado pode ser visto na imagem abaixo. A saída se torna estranha e não consigo mais digitar caracteres ascii.

Emboraissoaconteçaocasionalmente,nãoconseguiencontrarumamaneiradereproduzirconsistentementeoproblema.Apesquisaon-linerecomendafazercat/bin/*,masissofuncionaesporadicamente,somenteapósalgumasdúziasdetentativas.

Euquerofazerissoparaqueeupossaencontrarumasoluçãofácilparalidarcomissoemtmux.

Comofaçoconsistentementemeembriagarcomumestado"destroçado"? Existe algum personagem mágico unicode que pode fazer isso?

    
por Bruno Sutic 09.11.2015 / 15:13

2 respostas

10

Isso parece com o conjunto de caracteres gráficos especiais DEC .

Lendo os documentos de seqüências de controle xterm , soa como o terminal usa aqueles ao receber ESC ( 0 .

Então você deve conseguir reproduzir usando

printf '3(0'

ou

printf '3(0' > corrupt-my-terminal
cat corrupt-my-terminal

E volte a usar

printf '3(B'

que, de acordo com a mesma página, seleciona USASCII.

Outras maneiras de restaurar o estado incluem

tput sgr0  # resets all terminal attributes to their defaults

e

reset      # reinitializes the terminal

Você pode usar tput sgr0 no seu PROMPT_COMMAND (bash) ou precmd (zsh) para garantir que ele seja redefinido automaticamente.

Ou você pode apenas usar less , vim ou algo diferente de cat para exibir um arquivo.

Para que less aja como cat e saia automaticamente se o arquivo tiver menos de uma página, execute less -FX ou export LESS=-FX .

Ou, se você não quiser usar sempre as opções less , crie um novo alias, por exemplo,

alias c='less -FX'
    
por 27.11.2015 / 00:07
2

A maneira mais comum para o conjunto de caracteres gráficos em um emulador VT100 ser selecionado acidentalmente é recebendo um caractere Control-N , também conhecido como shift-out. Se você cat um arquivo binário e houver um byte nele com o valor '\ 14', isso pode fazer com que o emulador de terminal mude para o conjunto de caracteres gráficos. É desfeito ao receber um caractere Control-O , shift-in (ou por uma seqüência de controle que reconfigura o terminal). É independente do bash ou de qualquer outro shell que possa estar em execução no emulador de terminal.

Para um emulador de terminal em execução dentro de um emulador de terminal, a semântica pode ser um pouco complexa. Por exemplo, aqui está como a tela lida com ela:

When the boolean ‘G0’ capability is present in the termcap entry for the terminal on which screen has been called, the terminal emulation of screen supports multiple character sets. This allows an application to make use of, for instance, the VT100 graphics character set or national character sets. The following control functions from ISO 2022 are supported: ‘lock shift G0’ (‘SI’), ‘lock shift G1’ (‘SO’), ‘lock shift G2’, ‘lock shift G3’, ‘single shift G2’, and ‘single shift G3’. When a virtual terminal is created or reset, the ASCII character set is designated as ‘G0’ through ‘G3’. When the ‘G0’ capability is present, screen evaluates the capabilities ‘S0’, ‘E0’, and ‘C0’ if present. ‘S0’ is the sequence the terminal uses to enable and start the graphics character set rather than ‘SI’. ‘E0’ is the corresponding replacement for ‘SO’. ‘C0’ gives a character by character translation string that is used during semi-graphics mode.

    
por 28.11.2015 / 12:49