Os símbolos de hash (#) se transformaram em símbolos de libra (£) depois da criação de um binário


42

É assim que meu prompt do bash costumava ser.

prompt antigo do bash

Então fiz algo que provavelmente não era tão inteligente, fiz cat /bin/bash. E agora meu prompt do bash se parece com isso, com um símbolo de libra (£) em vez de um símbolo de hash (#). Até afeta símbolos de hash em arquivos, veja aqui:

símbolos de libra em arquivos

Alguma idéia de como reverter isso?

Edit: Esta pergunta não pergunta "Como alterar meu prompt do bash?", Mas "meu prompt do bash mudou por si só, como posso restaurá-lo?"

Completar.bashrc para aqueles que estão interessados.



1
(Tomei a liberdade de editar o título um pouco para trazer o que causou o problema Editar ou reverter como você gosta..)
ilkkachu

9
O prompt, arquivo etc. ainda contêm o código de caracteres para #, \x23; é só que o terminal agora interpreta \x23como £.
Deltab

4
A parte interessante é que "pound" é outro nome para o símbolo hash em Inglês Americano ... =) (e possivelmente outras nacionalidades?)
jpmc26

1
Em que programa terminal foi feito isso?
precisa saber é o seguinte

Respostas:


102

O terminal aceita e executa várias seqüências de caracteres diferentes como comandos de controle. Por exemplo, todo o movimento do cursor é feito usando esses. Alguns dos códigos fazem alterações permanentes, como definir cores ou dizer ao terminal para usar um conjunto de caracteres alternativo. Os executáveis ​​e outros arquivos binários podem conter bytes que representam esses comandos; portanto, o descarte de arquivos binários no terminal pode ter efeitos colaterais irritantes. Veja, por exemplo, aqui para alguns dos códigos de controle.

O pano de fundo histórico disso é que, originalmente, os terminais eram dispositivos bastante burros, com uma tela e um teclado , e se conectavam ao computador real por uma porta serial. Antes disso, eram impressoras com teclados. Não havia muito protocolo para separar os bytes de dados dos bytes de comando; portanto, os comandos foram dados ao terminal "inline". (Ou melhor, os códigos de escape e os caracteres de controle eram o protocolo.) Pode-se supor que, se o sistema fosse desenvolvido hoje, haveria uma separação mais clara entre dados e comandos.

Em vez de simplesmente fechar a janela do terminal ou interromper o emulador, você pode usar o resetcomando , que envia um comando semelhante (ou vários) para redefinir o terminal de volta aos padrões saudáveis.

Não sei exatamente o que causaria a alteração do hash. (Mas o @ Random832 faz, veja a resposta deles .) Estou mais familiarizado com o "conjunto de caracteres alternativo", que pode transformar todos os caracteres em glifos de desenho de linha. Mesmo que isso aconteça, a entrada do teclado geralmente permanece inalterada; portanto, a escrita resetEnterainda funciona mesmo que os caracteres sejam exibidos como lixo ou não sejam exibidos. (Comparado com o prompt sendo transformado em várias linhas, você só tem um efeito menor.)


1
Obrigado pela explicação detalhada. Eu votarei assim que tiver a reputação necessária.
Lhermann

2
Quando tentei pela primeira vez cat /dev/urandomno console de instalação da Debian (resoluções de tela que trazem à mente o hardware em blocos), pensei que havia acionado um estouro e naveguei rapidamente até o botão "abandonar todas as alterações, reiniciar a máquina". Agora eu sei que é um "recurso pretendido".
Wizzwizz4

2
É um recurso historicamente pretendido que é indesejável agora. Alguns emuladores de terminal (todos bons) devem desativar as escapes de comutação de conjunto de caracteres herdados ao executar em um ambiente UTF-8, mas, se o fazem, e como você ativa a opção de fazê-lo, se não for o padrão, está mal documentado e varia.
R ..

78

Para o registro, para responder por que isso aconteceu e como ele poderia ter sido corrigido sem fechar o terminal (e se resetfalhou):

Muitos terminais suportam, como um recurso dos terminais VT220 que estão emulando, vários conjuntos de caracteres de substituição nacionais baseados na ISO 646 e ISO 2022 . Em particular, é muito comum, por algum motivo, mesmo que os outros não sejam suportados, oferecer suporte ao conjunto de caracteres britânico, que tem o símbolo da moeda da libra na mesma posição em que ASCII possui o sinal numérico.

Portanto, quando você imprime um arquivo binário no terminal, por alguma coincidência gera a sequência ESC ( A[ou talvez ESC ) Ae ^N] para o terminal. Isso pode ser desfeito manualmente imprimindo a sequência que a define com o status normal:

printf '\e(B\e)0\x0f'

Imaginei algo assim, sem conhecer os detalhes. Obrigado pela explicação. Que bom ter pessoas como você por perto!
Lhermann

1
Oh, querida, as gaivotas no lugar de Ä e Ö ... E o Terminal no OS X até suporta essa substituição, em 2016. Se eu tivesse outro voto positivo para dar.
precisa saber é o seguinte

@ilkkachu Alguns terminais que os suportam (conheço Putty e também acho que o console do Linux) os rejeitam quando o UTF-8 está em uso, porque a ISO 2022 diz que outras sequências (exceto ESC % @) não devem ser suportadas enquanto estiverem no estado que é usado para suportar UTF-8. Portanto, eles podem desaparecer eventualmente, à medida que mais aplicativos são forçados a usar o UTF-8 para o desenho de linhas [que é o uso real mais amplamente usado desse recurso, os outros conjuntos de caracteres sendo incluídos principalmente porque fica "livre" quando o mecanismo é implementado ]
Random832

20
É fácil lembrar dessas seqüências de escape: "A" significa britânico, "B" significa "americano": D
egmont

8
@egmont Eu expliquei isso, como se vê, eles são atribuídos sequencialmente na ordem em que foram registrados na ISO. A primeira é a antiga versão internacional de referência [com ¤for $] é @ e, em seguida, a versão britânica chegou antes da americana. itscj.ipsj.or.jp/itscj_english/index.html para obter uma lista de todos eles.
usar o seguinte código

30

Feche o terminal e abra um novo.


19
Você não deveria. A pergunta é válida. Talvez alguém explique por que isso aconteceu em detalhes. Deve ser um buraco no Bash. £senta-se sob a mesma chave que #apenas é chamado com Alt. De alguma forma, o Altficou em Bash. De qualquer forma, você pode esperar por uma explicação adequada ou, se estiver satisfeito com a minha resposta, clique na verificação para aceitá-la.
Tomasz

1
Ou melhor, não no Bash, mas no programa do terminal. Eu tentei o mesmo em uma linha de comando fora da GUI e faz um loop para sempre.
Tomasz

5
@Xalorous, os questão afirma que o problema apareceu quando ele cated /bin/bashpara o terminal.
Ilkkachu

2
Random832 deu uma boa explicação do que realmente aconteceu
lhermann

16
Isso é um exagero - e se você tiver algum estado em sua sessão que deseja manter? E se for um console e não um terminal X? reseté a ferramenta certa para o trabalho.
pericynthion


9

stty sanepareceu resolver o problema tão bem quanto resetresolveu.


7

Não há necessidade de fechar e reabrir ou redefinir seu terminal! Embora a redefinição funcione, essa não é a maneira correta!

Você só precisa limpar / apagar o buffer de rolagem do terminal . Para fazer isso, basta usar o comando abaixo:

$ echo -ne '\0033\0143'

1
Você tem uma explicação para esse milagre?
Tomasz

1
@tomas Sim companheiro, com certeza. quando -eestiver em vigor, ele reconhecerá algumas seqüências que você pode ler executando man echo, uma delas é o \0NNNbyte com valor octal NNN. De fato, você não precisa RESTAURAR sua sessão de terminal, apenas LIMPAR seu buffer de rolagem. E o comando que eu disse fará o trabalho necessário. Por exemplo, se você estiver usando o MacOS X, há uma barra de menus Editar na barra de menus enquanto usa o terminal, e há uma opção como "Clear Scrollback ou ⌥⌘K".
precisa saber é

5
A sequência \033\143é ESC c, Redefinir para o estado inicial : "Redefina o VT100 para seu estado inicial, ou seja, o estado que ele tem depois de ser ligado. Isso também causa a execução do autoteste de inicialização e do sinal INIT H para ser afirmado brevemente ".
Deltab

1
esqueci de mencionar sobre ESC, obrigado um milhão de companheiros.
FarazX 11/08/16

1
@tomas Sempre que você tentar exibir um arquivo que não deve ser exibido - por exemplo, arquivos binários -, o terminal funcionará de maneira estranha e estranha. Muitos usuários de Linux fazem a redefinição, mas essa não é a melhor opção, pois não há necessidade de redefinir a sessão do terminal, e é necessário limpar o buffer de rolagem.
precisa saber é
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.