¿Cómo ingresar caracteres especiales para que Bash / Terminal los entienda?

18

Digamos que una carpeta tiene un archivo llamado Näyttökuva.png (para aquellos que estén interesados, es "captura de pantalla" en finlandés). Esto es lo que sucede:

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

$ ls Nä*
ls: Nä*: No such file or directory

Esto también afecta la finalización automática de la pestaña. Si comienzo a escribir ls N y presiono tab , se expandirá correctamente a ls Näyttökuva.png . Pero si empiezo a escribir ls Nä , la tabulación no hace nada.

¿Cómo puedo:

  • configure bash / terminal para que entienda los caracteres especiales
  • escribe los caracteres especiales para que bash / terminal los entienda?

En la codificación de la Terminal se establece en UTF-8 en la pestaña Configuración y la pestaña Codificación está en su estado predeterminado, es decir. UTF-8, Mac OS Roman, ISO Latin 1, ISO Latin 9, Windows Latin 1, ASCII, NextStep + algunas codificaciones asiáticas están habilitadas.

Incluso un extraño (aunque probablemente no sea esencial para la pregunta):

Si escribo ls N , presiona pestaña , borra los caracteres del final hasta que lea ls Nä y presione pestaña nuevamente, el comando se expande a ls Nättökuva.png [sic].

Si intento eliminar las letras por segunda vez de nuevo a ls Nä y presiono la pestaña, se expandirá a ls Nätökuva.png . La tercera ejecución se expande a ls Näökuva.png .

Por alguna razón, la cuarta ejecución proporciona ls Nä̈kuva.png (observe las diéresis sobre las diéresis). Tabular el ls Nä̈ da ls Nä̈kuva.png cada vez. Sin embargo, funciona:

$ ls Nä̈kuva.png
Näyttökuva.png

$ history 2
518  ls Näyttökuva.png 
519  history 2
    
pregunta Jari Keinänen 19.03.2011 - 15:33

3 respuestas

23

Creo que bash está analizando algunas anomalías en la forma en que se manejan los caracteres acentuados. Es posible que desee tomar algunas palomitas de maíz, porque esto va a ser un poco técnico ...

Unicode permite que algunos caracteres acentuados se representen de diferentes maneras: como un "punto de código" que representa el carácter acentuado, o como una serie de puntos de código que representan la versión no acentuada del personaje, seguido del acento (s). Por ejemplo, "ä" se puede representar precompuesto como U + 00E4 (UTF-8 0xc3a4, letra latina en minúscula 1 con diéresis) o descompuesto como U + 0061 U + 0308 (UTF-8 0x61cc88, minúscula latina a + diéresis combinada ).

El sistema de archivos HFS + de OS X requiere que todos los nombres de archivos se almacenen en la representación UTF-8 de su forma completamente descompuesta . En un nombre de archivo HFS +, "ä" DEBE codificarse como 0x61cc88, y "ö" DEBE codificarse como 0x6fcc88.

Estoy bastante seguro de que lo que está sucediendo aquí es que cuando escribes "Näyttökuva.png" en la línea de comandos, es "escribir" los caracteres en forma precompuesta. Cuando se crea el archivo, el sistema de archivos descompone los caracteres para el almacenamiento. Todo está bien hasta ahora. Pero cuando intentas usar la tabulación que comienza con "Nä", creo que bash no puede descomponer la "ä" antes de buscar coincidencias y, por supuesto, no encuentra ninguna.

Para ilustrar la diferencia, este es un ejemplo de la codificación que se usa cuando escribo "Näyttökuva.png" en la línea de comandos, en comparación con lo que se usa cuando lo almaceno como un nombre de archivo y uso la finalización de tabulación para completar:

$ printf Näyttökuva.png | xxd    # This time I pasted the it in from this web page
0000000: 4ec3 a479 7474 c3b6 6b75 7661 2e70 6e67  N..ytt..kuva.png
$ touch Näyttökuva.png           # Also pasted from the web
$ printf Näyttökuva.png | xxd    # This time I tab-completed it after N
0000000: 4e61 cc88 7974 746f cc88 6b75 7661 2e70  Na..ytto..kuva.p
0000010: 6e67                                     ng

Ahora, en cuanto a la cuestión de los caracteres que se pierden al eliminar y volver a completar la tabulación, sospecho que está estrechamente relacionado. Específicamente, creo que bash está "eliminando" un punto de código por pulsación de la tecla de borrado, pero borrando un carácter de la ventana de Terminal por pulsación. Debido a que uno de los caracteres eliminados ("ö" esta vez) consistía en dos puntos de código, pero solo un carácter, la pantalla del terminal pierde la sincronización. Intente completar el nombre completo de la pestaña, eliminarlo de nuevo en "Näytt", luego volver a completar la pestaña: bash parece pensar que solo se eliminó la diéresis combinada, no toda la "ö", por lo que se vuelve a agregar la diéresis combinada , pero esta vez se adjunta a la "t":

$ echo Näytẗkuva.png 
Näyttökuva.png

Tenga en cuenta que cuando presiono regresar, bash tiene el nombre completo allí; es solo la pantalla del terminal que se confundió.

TL; DR bash tiene algunos errores que manejan caracteres acentuados descomponibles.

EDIT: después de algunas reflexiones, creo que la única solución completa es corregir el bash (/ esperar a que los desarrolladores lo solucionen). También podría haber una forma de ingresar caracteres en forma descompuesta, pero no tengo idea de lo que sería. Pero encontré algunas soluciones parciales:

  1. Arrastrar y soltar un archivo desde el Finder pega en su forma correcta. Dado que el Finder obtiene el nombre de archivo del sistema de archivos, ya está descompuesto, por lo que simplemente funciona.

  2. En realidad puedes completar con tabulación el propio carácter acentuado. Por ejemplo, si escribe "Na" y luego la pestaña, coincidirá con "Näyttökuva.png" porque la descomposición canónica de "ä" comienza con "a". Pero si tiene un archivo llamado "Narwal.gif" en el mismo directorio, no será de mucha ayuda ...

  3. No he probado esto, pero si enlaza la pestaña con menu-complete en lugar de completo, debería permitirle revisar posibles coincidencias para que pueda seleccionar la que desea, incluso si no puede escribir la siguiente letra. (O puede vincularlo a una pulsación de tecla diferente, de modo que solo puede usarlo cuando lo necesite).

  4. Para solucionar el problema con el hecho de que la pantalla de la Terminal no está sincronizada, puede enlazar algo con redraw-current-line : no evitará que ocurra el problema, pero le dará una forma de volver a sincronizar la pantalla.

respondido por el Gordon Davisson 19.03.2011 - 17:16
4

Esta es una pregunta antigua, y no hay una respuesta definitiva. Solo soluciones.

Sin embargo, combiné parte de la información de esta guía anterior, y como se sugirió e instruyó aquí :

Instalé un nuevo bash en mi Snow Leopard. Después de instalarlo, bash terminación funciona correctamente! (Snow Leopard se envió con 3.2.48 (1) y MacPorts instalado 4.2.45_1). Recuerde realizar los cambios en /etc/shells y ejecutar chsh .

También, debido a algunas otras instrucciones, tengo en .inputrc :

set meta-flag on
set input-meta on
set output-meta on
set convert-meta off

No estoy seguro de si son necesarios o no para un funcionamiento correcto.

    
respondido por el Wild Penguin 10.09.2013 - 21:50
0

iconv es la solución que funcionó para mí:

ls 'echo 'Näytẗkuva.png' | iconv -t UTF8-MAC'

vea enlace

    
respondido por el Matthias M 08.07.2016 - 14:49

Lea otras preguntas en las etiquetas