18 votos

Cómo introducir caracteres especiales para que Bash/Terminal entiende?

Digamos que en una carpeta que contiene 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 a la pestaña de auto-realización. Si empiezo a teclear ls N y pulse ficha es correctamente ampliado a ls Näyttökuva.png. Pero si empiezo a teclear ls Nä de tabulación no hace nada.

¿Cómo puedo:

  • configurar bash/terminal por lo que entiende los caracteres especiales
  • escriba los caracteres especiales por lo que bash/terminal entiende?

En la Terminal de la codificación se establece a UTF-8 en la Configuración de la ficha y la Codificación de la ficha está en su estado por defecto, es decir,. UTF-8, Mac OS Romano, ISO Latin-1, ISO latina 9, Windows latina 1, ASCII, NextStep + algunos Asiáticos codificaciones están habilitados.


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

Si escribo ls N, pulse la ficha, borrar los caracteres desde el final hasta que lee ls Nä y pulse ficha de nuevo, el comando se expande a ls Nättökuva.png [sic].

Si trato de borrar las letras por segunda vez de vuelta a ls Nä y presione la tecla tab se expande a ls Nätökuva.png. Tercera carrera se expande a ls Näökuva.png.

Por alguna razón, la 4ª carrera da ls Nä̈kuva.png (aviso de la diéresis sobre la diéresis). Tabulación 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

23voto

Nate Puntos 220

Creo que bash es tropezar con algunas anomalías en la forma en caracteres acentuados se manejan. Usted puede ser que desee tomar algunas palomitas de maíz, porque esto se va a poner técnicos para un poco...

Unicode permite que algunos caracteres acentuados para ser representado 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 representa la no acentuada versión del personaje, seguido por el acento(s). Por ejemplo, "ä" podría ser representado, ya sea precompuesta U+00E4 (UTF-8 0xc3a4, letra a minúscula latina 1 con diéresis) o descomponerse como U+0061 U+0308 (UTF-8 0x61cc88, letra a minúscula latina + combinación con diéresis).

OS X sistemas de ficheros HFS+ requiere que todos los archivos se almacenan en el formato UTF-8 representación de sus descompone totalmente formulario. En un HFS+ nombre de archivo, "ä" DEBE ser codificada como 0x61cc88, y "ö" DEBE ser codificada como 0x6fcc88.

Estoy bastante seguro de lo que está sucediendo aquí es que cuando se escribe "Näyttökuva.png" en la línea de comandos, es "escribir" los personajes en forma precompuesta. Cuando se crea el archivo, el sistema de ficheros, se descompone en los personajes para el almacenamiento. Todo está bien hasta el momento. Pero cuando intenta utilizar el autocompletado de partida con "Nä", creo que bash es no descomponer la "ä" antes de buscar los partidos, y por supuesto no encontrar ninguna.

Para ilustrar la diferencia, aquí un ejemplo de lo que se utiliza la codificación cuando acabo de tipo "Näyttökuva.png" en la línea de comandos, frente a lo que se utiliza cuando puedo guardarlo como un nombre de archivo y usar la tecla tab para rellenar:

$ 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 perderse al borrar y re-ficha-completar, sospecho que está estrechamente relacionado. Específicamente, creo que bash es "eliminar" un punto de código por pulsación de la tecla suprimir, pero el borrado de un carácter de la ventana de la Terminal por la prensa. Porque uno de los caracteres eliminados ("ö" en este momento), que consiste de dos puntos de código, pero sólo uno de los personajes, la pantalla del Terminal se pone fuera de sincronización. Tratar de tab-completar todo el nombre de archivo, eliminarlo de vuelta a la "Näytt", a continuación, re-ficha-completar: bash parece pensar que sólo la combinación de diéresis fue eliminado, no toda la "ö", por lo que re-añade la combinación de diéresis, pero esta vez se une a la "t":

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

Tenga en cuenta que cuando yo presione la tecla de retorno, bash en realidad tiene el nombre del archivo completo no; es simplemente la pantalla del Terminal que estaba confundido.

TL;DR bash tiene algunos errores de manejo descomponible caracteres acentuados.

EDIT: después de meditar un rato, creo que la solución no es bash (/espere a que sus desarrolladores para solucionarlo). También podría ser una manera de caracteres de entrada en descomponerse de forma, pero no tengo idea de lo que sería. Pero encontré algunas soluciones parciales:

  1. Arrastrar-y-droping un archivo desde el Finder pega en la forma correcta. Desde el Buscador obtiene el nombre de archivo del sistema de archivos, ya descompuesto, así que simplemente funciona.

  2. Usted puede en realidad ficha completa el carácter acentuado en sí. Por ejemplo, si escribe "Na" y, a continuación, la ficha, que va a coincidir con "Näyttökuva.png" debido a la descomposición canónica de la "ä" comienza con "a". Pero si usted tiene un archivo llamado "Narwal.gif" en el mismo directorio, que no va a ser muy útil...

  3. Yo no he probado este, pero si se unen ficha menú completo en lugar de completar, debe hacerle la ficha a través de partidos posibles para que pueda seleccionar el que desee, incluso si usted no puede escribir la siguiente letra. (O podría enlazar a una pulsación de tecla diferentes, por lo que solo se pueden usar cuando se necesita.)

  4. Para solucionar el problema con la pantalla del Terminal de salir de la sincronización, puede enlazar algo de redibujo de la corriente de línea -- no va a evitar que el problema ocurra, pero voy a dar una forma para volver a sincronizar la pantalla.

4voto

Ari Raju Puntos 21

Esta es una vieja cuestión, y no hay una respuesta definitiva. Sólo soluciones.

Sin embargo he combinado alguna información de esta guía de edad, y como sugirió e instrucciones aquí:

He instalado una nueva fiesta en mi Snow Leopard. Después de la instalación de bash finalización funciona correctamente! (Snow Leopard se entregan con 3.2.48(1) y MacPorts instalado 4.2.45_1). Recuerde hacer los cambios en /etc/shells y en ejecución 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 o no necesarios para el correcto funcionamiento.

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: