¿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 pasa:

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

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

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

¿Cómo puedo:

  • configurar bash / terminal para que comprenda caracteres especiales
  • escriba los caracteres especiales para que bash / terminal los entienda?

En Terminal, la codificación 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.


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

Si escribo ls N, presiono tab, borro caracteres del final hasta que se lee ls Näy presiono tabnuevamente, el comando se expande a ls Nättökuva.png[sic].

Si intento borrar las letras por segunda vez ls Näy presiono la tecla, se expande a ls Nätökuva.png. La tercera carrera se expande a ls Näökuva.png.

Por alguna razón, la cuarta carrera da ls Nä̈kuva.png(observe las diéresis sobre diéresis). Tabbing the ls Nä̈da ls Nä̈kuva.pngcada vez. Sin embargo, funciona:

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

$ history 2
518  ls Näyttökuva.png 
519  history 2

Respuestas:


23

Creo que bash está tropezando con algunas anomalías en cómo se manejan los caracteres acentuados. Es posible que desee tomar algunas palomitas de maíz, porque esto se volverá técnico por un momento ...

Unicode permite que algunos caracteres acentuados se representen de varias maneras 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 personaje, seguido del acento (s). Por ejemplo, "ä" podría representarse como precompuesto como U + 00E4 (UTF-8 0xc3a4, letra pequeña latina 1 con diéresis) o descomponerse como U + 0061 U + 0308 (UTF-8 0x61cc88, letra pequeña 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 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 escribe "Näyttökuva.png" en la línea de comando, está "escribiendo" los caracteres en forma precompuesta. Cuando se crea el archivo, el sistema de archivos descompone los caracteres para su almacenamiento. Todo está bien hasta ahora. Pero cuando intenta utilizar la finalización de tabulación comenzando con "Nä", creo que bash no puede descomponer la "ä" antes de buscar coincidencias y, por supuesto, no encuentra ninguna.

Para ilustrar la diferencia, aquí hay un ejemplo de qué codificación se usa cuando solo escribo "Näyttökuva.png" en la línea de comando, frente a lo que se usa cuando lo almaceno como un nombre de archivo y uso la finalización de tabulación para completarlo:

$ 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 pestaña, sospecho que está estrechamente relacionado. Específicamente, creo que bash está "eliminando" un punto de código por cada pulsación de la tecla Eliminar, pero borrando un carácter de la ventana Terminal por cada pulsación. Debido a que uno de los caracteres eliminados ("ö" esta vez) constaba de dos puntos de código, pero solo un carácter, la pantalla del Terminal se desincroniza. Intente completar con pestañas el nombre de archivo completo, eliminándolo de nuevo a "Näytt", luego vuelva a completar con pestañas: bash parece pensar que solo se eliminó la diéresis combinada, no toda la "ö", por lo que vuelve a agregar la diéresis combinada , pero esta vez se une a la "t":

$ echo Näytkuva.png 
Näyttökuva.png

Tenga en cuenta que cuando presiono Intro, bash en realidad tiene el nombre de archivo completo allí; Es solo la pantalla de la Terminal la que estaba confundida.

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

EDITAR: después de reflexionar un poco, creo que la única solución completa es arreglar bash (/ esperar a que sus desarrolladores lo arreglen). 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. Como el Finder obtiene el nombre de archivo del sistema de archivos, ya está descompuesto, por lo que simplemente funciona.

  2. En realidad, puede 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, eso no será muy útil ...

  3. No he probado esto, pero si vincula la pestaña al menú completo en lugar de completar, debería permitirle pasar por posibles coincidencias para que pueda seleccionar la que desee, incluso si no puede escribir la siguiente letra. (O bien, puede vincularlo a una combinación de teclas diferente, por lo que puede usarlo solo cuando lo necesite).

  4. Para solucionar el problema de la sincronización de la pantalla del Terminal, puede vincular algo a redraw-current-line : no evitará que ocurra el problema, pero le dará una forma de resincronizar la pantalla.


Gracias, disfruté las palomitas de maíz. Creo que has identificado la causa del problema: usando $ echo -e "N\xC3\xA4*" | ls(el eco da Nä*) resultados Näyttökuva.png. El problema también existe con los otros shells en Mac OS; y con, por ejemplo, zsh ls Nse completa automáticamente parals Na<0308>ytto<0308>kuva.png
Jari Keinänen

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

(Ahora vi tu edición sobre soluciones alternativas) Al menos las dos primeras funcionan. El # 2 es interesante: el autocompletado Nafunciona, pero Nayno lo hace (aunque es comprensible porque en realidad existe ¨entre el ay y. En Xubuntu ls Na*no funciona (aunque Nä*funciona, así que realmente no es un problema). reemplazar ä& öcon a?y o?por ejemplo, por ls Na?y*supuesto, esto aumenta la ambigüedad, pero puede ser útil en algunos casos
Jari Keinänen

2
La razón por la que funciona en Xubuntu puede ser que el sistema de archivos usa la misma forma que la interfaz del terminal. Si lo haces ls N* | xxden Xubuntu, ¿da caracteres compuestos o descompuestos?
Gordon Davisson

Suponiendo que Xubuntu almacena el nombre de archivo en forma compuesta, intente ejecutar el comando touch $'Na\xcc\x88ytto\xcc\x88kuva.png'y vea qué sucede; supongo que creará un nuevo archivo con un nombre muy muy similar.
Gordon Davisson

4

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

Sin embargo, combiné información de esta antigua guía, y como sugerí e instruí aquí :

Instalé una nueva fiesta en mi Snow Leopard. Después de instalarlo, la finalización de bash funciona correctamente. (Snow Leopard se envió con 3.2.48 (1) y MacPorts instalado 4.2.45_1). Recuerde hacer los cambios en /etc/shellsfuncionamiento 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 adecuado.


Tienes razón: bash 4.2 completa (donde äestá precompuesto) Näyttökuva.pngpero bash 3.2 no.
Lri

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.