21 votos

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

Digamos que una carpeta tiene un archivo llamado Näyttökuva.png (para los interesados, es "screenshot" en finés). Esto es lo que ocurre:

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

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

Esto también afecta al autocompletado del tabulador. Si empiezo a escribir ls N y pulse tab se amplía correctamente a ls Näyttökuva.png . Pero si empiezo a escribir ls Nä el tabulador no hace nada.

¿Cómo puedo:

  • configurar bash/terminal para que entienda caracteres especiales
  • ¿escribir los caracteres especiales para que bash/terminal los entienda?

En Terminal la codificación está establecida en UTF-8 en la pestaña Configuración y la pestaña Codificación está en su estado por defecto, 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.


Aún más extraño (aunque probablemente no esencial para la pregunta):

Si escribo ls N pulse tab suprima los caracteres del final hasta que se lea ls Nä y pulse tab de nuevo, el comando se expande a ls Nättökuva.png [sic].

Si intento borrar las letras por segunda vez vuelvo a ls Nä y pulsa tabulador se expande a ls Nätökuva.png . La tercera carrera se amplía a ls Näökuva.png .

Por alguna razón, la 4ª carrera da ls Näkuva.png (fíjese en las diéresis sobre diéresis). Al 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

29voto

Nate Puntos 220

Creo que bash tropieza con algunas anomalías en el tratamiento de los caracteres acentuados. Puede que quieras coger palomitas, porque esto se va a poner técnico un rato...

Unicode permite que algunos caracteres acentuados se representen de varias formas diferentes: 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 carácter, seguida del acento o acentos. Por ejemplo, la "ä" puede representarse precompuesta como U+00E4 (UTF-8 0xc3a4, letra minúscula latina 1 con diéresis) o descompuesta como U+0061 U+0308 (UTF-8 0x61cc88, letra minúscula latina a + diéresis combinada).

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

Estoy bastante seguro de que lo que ocurre aquí es que cuando escribes "Näyttökuva.png" en la línea de comandos, se están "tecleando" los caracteres en forma precompuesta. Cuando se crea el archivo, el sistema de archivos descompone los caracteres para su almacenamiento. Hasta aquí todo va bien. Pero cuando intentas usar el tabulador que empieza por "Nä", creo que bash está fallando al descomponer la "ä" antes de buscar coincidencias, y por supuesto no encuentra ninguna.

Para ilustrar la diferencia, he aquí un ejemplo de la codificación que se utiliza cuando escribo "Näyttökuva.png" en la línea de comandos, frente a la que se utiliza cuando lo almaceno como nombre de archivo y utilizo el tabulador para rellenarlo:

$ 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 al asunto de los caracteres que se pierden al borrar y volver a completar, sospecho que está estrechamente relacionado. Específicamente, creo que bash está "borrando" un punto de código por cada pulsación de la tecla suprimir, pero borrando un carácter de la ventana Terminal por cada pulsación. Como uno de los caracteres borrados ("ö" esta vez) consistía en dos puntos de código, pero sólo un carácter, la pantalla de la Terminal se desincroniza. Pruebe a completar con tabulador todo el nombre de archivo, borrarlo de nuevo a "Näytt", y luego volver a completar con tabulador: bash parece pensar que sólo se borró la diéresis combinada, no la "ö" entera, así que vuelve a añadir la diéresis combinada, pero esta vez se une a la "t":

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

Tenga en cuenta que cuando pulso return, bash realmente tiene el nombre de archivo completo allí; es sólo la pantalla de Terminal que se confundió.

TL;DR bash tiene algunos errores en el manejo de caracteres acentuados descomponibles.

EDIT: después de darle vueltas, creo que la única solución completa es arreglar bash (/esperar a que sus desarrolladores lo arreglen). También podría haber una manera de introducir caracteres en forma descompuesta, pero no tengo ni idea de lo que sería. Pero encontré algunas soluciones parciales:

  1. Al arrastrar y soltar un archivo desde el Finder, se pega en su forma correcta. Como el Finder obtiene el nombre del archivo del sistema de archivos, ya está descompuesto, así que funciona sin más.

  2. De hecho, puedes completar con tabulador el propio carácter acentuado. Por ejemplo, si escribes "Na" y luego tabulas, coincidirá con "Näyttökuva.png" porque la descomposición canónica de "ä" empieza por "a". Pero si tienes un archivo llamado "Narwal.gif" en el mismo directorio, eso no será muy útil...

  3. No lo he probado, pero si vinculas tabulador a menú-completo en lugar de completo, debería permitirte tabular las posibles coincidencias para que puedas seleccionar la que quieras aunque no puedas escribir la siguiente letra. (O podrías vincularlo a una pulsación de tecla diferente, para poder usarlo sólo cuando lo necesites).

  4. Para solucionar el problema de la desincronización de la pantalla del Terminal, puedes enlazar algo a redibujar-línea-actual -- no evitará que se produzca el problema, pero te dará una forma de resincronizar la pantalla.

1 votos

Gracias, disfruté de las palomitas. Creo que has dado en el clavo de la causa del problema: usar $ echo -e "N\xC3\xA4*" | ls (el eco da Nä* ) resultados Näyttökuva.png . El problema existe también con los otros shells en Mac OS; y con por ejemplo zsh ls N se autocompleta en ls Na<0308>ytto<0308>kuva.png

0 votos

También probé el autocompletado y ls Nä* en bash en Xubuntu y funcionó correctamente, por lo que los errores en algún lugar entre el teclado y OS X y Terminal. También probé que dentro de la partición Bootcamp, pero el problema persiste (es decir, no sucede sólo con archivos HFS +).

0 votos

(Ahora vi su edición sobre soluciones) Al menos los dos primeros funcionan. El #2 es interesante: autocompletar Na funciona, pero Nay no lo hace (aunque es comprensible porque en realidad hay ¨ entre el a y y . En Xubuntu ls Na* no funciona (aunque Nä* funciona así que realmente no es un problema). En cuanto a los comodines, otra solución podría ser sustituir ä & ö con a? y o? Por ejemplo ls Na?y* . Por supuesto, esto aumenta la ambigüedad, pero puede resultar útil en algunos casos.

4voto

Ari Raju Puntos 21

Se trata de una pregunta antigua, sin respuesta definitiva. Sólo soluciones.

Sin embargo combiné alguna información de esta vieja guía, y como se sugiere y se indica aquí :

He instalado un bash más reciente en mi Snow Leopard. Después de instalarlo, ¡la finalización de bash funciona correctamente! (Snow Leopard viene con 3.2.48(1) y MacPorts instaló 4.2.45_1). Recuerda hacer los cambios en /etc/shells y corriendo chsh .

Además, 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.

0 votos

Tienes razón: bash 4.2 completa (donde ä está precompuesta) a Näyttökuva.png pero bash 3.2 no.

1voto

Matthias M Puntos 135

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

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

véase https://stackoverflow.com/a/23226449/1909531

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X