Los símbolos hash (#) se convirtieron en símbolos de libra (£) después de atrapar un binario


42

Así es como se veía mi indicador de bash.

viejo aviso de bash

Luego hice algo que probablemente no fue tan inteligente, lo hice cat /bin/bash. Y ahora mi indicador de bash se ve así, con un símbolo de libra (£) en lugar de un símbolo de hash (#). Incluso afecta a los símbolos hash dentro de los archivos, vea aquí:

símbolos de libra en archivos

¿Alguna idea de cómo revertir esto?

Editar: Esta pregunta no pregunta "¿Cómo cambiar mi aviso de bash?", Sino "mi aviso de bash cambió por sí mismo, ¿cómo puedo restaurarlo?"

Completo.bashrc para aquellos que estén interesados.



1
(Me tomé la libertad de editar un poco el título para mencionar lo que causó el problema. Edite o revierta como desee.)
ilkkachu

99
El símbolo, archivo, etc. todavía contienen el código de caracteres para #, \x23; es solo que el terminal ahora interpreta \x23como £.
deltab

44
Lo interesante es que "libra" es otro nombre para el símbolo hash en inglés americano (¿y posiblemente en otras nacionalidades?) ... =)
jpmc26

1
¿En qué programa terminal se hizo esto?
SnoringFrog

Respuestas:


102

El terminal acepta y ejecuta un montón de secuencias de caracteres diferentes como comandos de control. Por ejemplo, todo el movimiento del cursor se realiza utilizando esos. Algunos de los códigos realizan cambios permanentes, como configurar colores o decirle a la terminal que use un juego de caracteres alternativo. Los archivos ejecutables y otros archivos binarios pueden contener bytes que representan esos comandos, por lo que descargar archivos binarios al terminal puede tener efectos secundarios molestos. Vea, por ejemplo, aquí algunos de los códigos de control.

El trasfondo histórico de esto es que originalmente, los terminales eran dispositivos bastante tontos con una pantalla y un teclado , y se conectaban a la computadora real a través de un puerto serie. Antes de eso, eran impresoras con teclados. No había mucho protocolo para separar los bytes de datos de los bytes del comando, por lo que los comandos se dieron al terminal "en línea". (O más bien, los códigos de escape y los caracteres de control eran el protocolo). Se podría suponer que si el sistema se diseñó hoy, habría una separación más clara entre los datos y los comandos.

En lugar de simplemente cerrar la ventana del terminal o eliminar el emulador, puede usar el resetcomando , que envía un comando similar (o varios) para restablecer el terminal a sus valores predeterminados.

No sé qué haría exactamente que el hash golpeara el cambio. (Pero @ Random832 sí, vea su respuesta .) Estoy más familiarizado con el "conjunto de caracteres alternativo", que puede cambiar todos los caracteres en glifos de dibujo lineal. Incluso si eso sucede, la entrada del teclado generalmente no cambia, por lo que la escritura resetEnteraún funciona incluso si los caracteres se muestran como basura o no. (En comparación con su solicitud que se convirtió en un montón de líneas, solo obtuvo un efecto menor).


1
Gracias por la explicación detallada. Voy a votar tan pronto como tenga la reputación necesaria.
lhermann

2
Cuando probé por primera vez cat /dev/urandomen la consola de instalación de Debian (resoluciones de pantalla que recuerdan el hardware bloqueado), pensé que había desencadenado un desbordamiento y rápidamente me dirigí al botón "abandonar todos los cambios, reiniciar la máquina". Ahora sé que es una "característica prevista".
wizzwizz4

2
Es una característica históricamente deseada que no es deseable ahora. Algunos emuladores de terminal (todos buenos) deben deshabilitar los escapes de conmutadores de conjuntos de caracteres heredados cuando se ejecutan en un entorno UTF-8, pero si lo hacen y cómo se activa la opción de hacerlo si no es predeterminado, está mal documentado y varía
R ..

78

Para el registro, para responder por qué sucedió esto y cómo podría haberse solucionado sin cerrar el terminal (y si resetfalló):

Muchos terminales admiten, como una característica de los terminales VT220 que están emulando, una serie de juegos de caracteres de reemplazo nacionales basados ​​en ISO 646 e ISO 2022 . En particular, es muy común por alguna razón, incluso si los demás no son compatibles, para que admitan el conjunto de caracteres británico, que tiene el símbolo de la libra en la misma posición donde ASCII tiene el signo de número.

Entonces, cuando imprimiste un archivo binario en el terminal, por alguna coincidencia, la secuencia salió ESC ( A[o quizás ESC ) Ay ^N] al terminal. Esto se puede deshacer manualmente imprimiendo la secuencia que lo establece en el estado normal:

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

Adiviné algo como esto, sin saber los detalles. Gracias por la explicación. ¡Qué bueno tener gente como tú!
lhermann

1
Oh querido, las gaviotas en lugar de Ä y Ö ... Y Terminal en OS X incluso admite ese reemplazo, en 2016. Si solo tuviera otro voto a favor.
ilkkachu

@ilkkachu algunos terminales que de otro modo los admiten (conozco Putty, y creo que también la consola Linux) los rechazan cuando UTF-8 está en uso, porque ISO 2022 dice que otras secuencias (que ESC % @no sean) no serán compatibles mientras estén en el estado eso se usa para soportar UTF-8. Por lo tanto, podrían desvanecerse eventualmente a medida que más aplicaciones se vean obligadas a usar UTF-8 para el dibujo lineal [que es el uso real más utilizado de esta función, los otros juegos de caracteres se incluyen principalmente porque es "gratuito" cuando tiene implementado el mecanismo ]
Random832

20
Es fácil recordar estas secuencias de escape: "A" significa británico, "B" significa "estadounidense": D
egmont

8
@egmont Me enteré de esto, ya que resulta que están asignados secuencialmente en el orden en que se registraron con la ISO. La primera es la antigua versión de referencia internacional [con ¤for $] es @, y luego la versión británica llegó antes que la estadounidense. itscj.ipsj.or.jp/itscj_english/index.html para obtener una lista de todos ellos.
Random832

30

Cierre la terminal y abra una nueva.


19
No deberías La pregunta es valida. Tal vez alguien explicará por qué sucedió esto en detalle. Esto debe ser un agujero en Bash. £se encuentra bajo la misma clave que #solo se llama con Alt. De alguna manera se Altquedaron en Bash. De todos modos, puede esperar una explicación adecuada, o si está satisfecho con mi respuesta, haga clic en el cheque para aceptarla.
Tomasz

1
O más bien no en Bash, sino en el programa terminal. Intenté lo mismo en una línea de comando fuera de la GUI y se repite para siempre.
Tomasz

55
@Xalorous, los estados de interrogación que el problema apareció cuando cated /bin/bashal terminal.
ilkkachu

2
Random832 dio una buena explicación de lo que realmente sucedió
lhermann

16
Esto es excesivo: ¿qué pasa si tiene algún estado en su sesión que desea mantener? ¿Qué pasa si es una consola en lugar de una terminal X? resetes la herramienta adecuada para el trabajo.
pericynthion


9

stty saneparecía solucionar el problema tan bien como lo resethizo.


7

¡No hay necesidad de cerrar y volver a abrir o restablecer su terminal! Aunque resetear funcionará, ¡esta no es la forma correcta!

Solo necesita borrar / borrar el búfer de desplazamiento hacia atrás del terminal . Para hacerlo, solo use el siguiente comando:

$ echo -ne '\0033\0143'

1
¿Tienes una explicación para este milagro?
Tomasz

1
@tomas Sí, amigo seguro. cuando -eesté en efecto, reconocerá algunas secuencias sobre las que puede leer ejecutando man echo, una de ellas es la \0NNNque significa byte con valor octal NNN. De hecho, no necesita RESTABLECER su sesión de terminal, solo necesita BORRAR su búfer de desplazamiento. Y el comando que dije hará el trabajo requerido. Por ejemplo, si está usando MacOS X, hay una barra Editar en el menú mientras usa la terminal, y hay una opción como "Borrar desplazamiento o ⌥⌘K".
FarazX

55
La secuencia \033\143es ESC c, Restablecer al estado inicial : "Restablece el VT100 a su estado inicial, es decir, el estado que tiene después de que se enciende. Esto también provoca la ejecución de la autocomprobación de encendido y la señal INIT H a ser afirmado brevemente ".
deltab

1
@deltab Olvidé mencionar sobre ESC, gracias un millón de amigos.
FarazX

1
@tomas Cada vez que intente mostrar un archivo que no se supone que debe mostrarse, por ejemplo, archivos binarios, el terminal actuará de forma extraña e incómoda. Muchos usuarios de Linux hacen el reinicio, pero esa no es la mejor opción, ya que no es necesario restablecer la sesión de terminal, y es necesario borrar el búfer de desplazamiento.
FarazX
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.