Comment saisir des caractères spéciaux pour que Bash / Terminal les comprenne?

18

Disons qu'un dossier a un fichier appelé Näyttökuva.png(pour ceux qui sont intéressés, c'est «capture d'écran» en finnois). Voici ce qui se passe:

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

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

Cela affecte également la complétion automatique des onglets. Si je commence à taper ls Net à appuyer sur, tabil est correctement développé ls Näyttökuva.png. Mais si je commence à taper, la ls Nätabulation ne fait rien.

Comment puis-je soit:

  • configurer bash / terminal pour qu'il comprenne les caractères spéciaux
  • taper les caractères spéciaux pour que bash / terminal les comprenne?

Dans le terminal, l'encodage est défini sur UTF-8 dans l'onglet Paramètres – et l'onglet Encodage – est dans son état par défaut, c'est-à-dire. UTF-8, Mac OS Roman, ISO Latin 1, ISO Latin 9, Windows Latin 1, ASCII, NextStep + certains codages asiatiques sont activés.


Encore plus étrange (mais probablement pas essentiel pour la question):

Si je tape ls N, appuyez sur tab, supprimez les caractères de la fin jusqu'à ce qu'il soit lu ls Näet appuyez à tabnouveau, la commande se développe en ls Nättökuva.png[sic].

Si j'essaie de supprimer les lettres une deuxième fois ls Näet d'appuyer sur l'onglet, il se développe ls Nätökuva.png. La troisième exécution s'étend à ls Näökuva.png.

Pour une raison quelconque, la 4ème exécution donne ls Nä̈kuva.png(notez les trémas sur les trémas). Tabuler le ls Nä̈donne à ls Nä̈kuva.pngchaque fois. Néanmoins, cela fonctionne:

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

$ history 2
518  ls Näyttökuva.png 
519  history 2
Jari Keinänen
la source

Réponses:

23

Je pense que bash trébuche sur certaines anomalies dans la façon dont les caractères accentués sont traités. Vous voudrez peut-être attraper du pop-corn, car cela va devenir technique un peu ...

Unicode permet à certains caractères accentués d'être représentés de plusieurs manières différentes: comme un "point de code" représentant le caractère accentué, ou comme une série de points de code représentant la version non accentuée du caractère, suivi par le ou les accent (s). Par exemple, "ä" pourrait être représenté soit précomposé en U + 00E4 (UTF-8 0xc3a4, minuscule latine 1 avec tréma) ou décomposé en U + 0061 U + 0308 (UTF-8 0x61cc88, minuscule latine a + tréma combinant ).

Le système de fichiers HFS + d'OS X nécessite que tous les noms de fichiers soient stockés dans la représentation UTF-8 de leur forme entièrement décomposée . Dans un nom de fichier HFS +, "ä" DOIT être codé en 0x61cc88 et "ö" DOIT être codé en 0x6fcc88.

Je suis sûr que ce qui se passe ici, c'est que lorsque vous tapez "Näyttökuva.png" sur la ligne de commande, c'est "taper" les caractères sous une forme précomposée. Lorsque le fichier est créé, le système de fichiers décompose les caractères pour le stockage. Tout va bien jusqu'à présent. Mais lorsque vous essayez d'utiliser la tabulation commençant par "Nä", je pense que bash ne parvient pas à décomposer le "ä" avant de rechercher des correspondances, et bien sûr il n'en trouve pas.

Pour illustrer la différence, voici un exemple de l'encodage utilisé lorsque je tape simplement "Näyttökuva.png" sur la ligne de commande, par rapport à ce qui est utilisé lorsque je le stocke en tant que nom de fichier et utilise la complétion de tabulation pour le remplir:

$ 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

Maintenant, en ce qui concerne la perte de personnages lors de la suppression et de la ré-tabulation, je suppose que c'est étroitement lié. Plus précisément, je pense que bash "supprime" un point de code par pression sur la touche Suppr, mais efface un caractère de la fenêtre Terminal par pression. Étant donné que l'un des caractères supprimés ("ö" cette fois) était composé de deux points de code, mais d'un seul caractère, l'affichage du terminal n'est plus synchronisé. Essayez de compléter le nom de fichier par tabulation, en le supprimant de nouveau à "Näytt", puis de compléter la tabulation: bash semble penser que seule la trame de combinaison a été supprimée, pas le "ö" entier, donc il ajoute à nouveau la tréma de combinaison , mais cette fois il s'attache au "t":

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

Notez que lorsque j'appuie sur Entrée, bash contient en fait le nom de fichier entier; c'est juste l'affichage du terminal qui était confus.

TL; DR bash a quelques bugs qui gèrent les caractères accentués décomposables.

EDIT: après quelques réflexions, je pense que la seule solution complète est de corriger bash (/ attendre que ses développeurs le corrigent). Il pourrait également y avoir un moyen de saisir des caractères sous forme décomposée, mais je n'ai aucune idée de ce que ce serait. Mais j'ai trouvé quelques solutions de contournement partielles:

  1. Glissez-déposez un fichier à partir des pâtes du Finder dans sa forme correcte. Étant donné que le Finder obtient le nom de fichier du système de fichiers, il est déjà décomposé, donc cela fonctionne.

  2. Vous pouvez en fait compléter par tabulation le caractère accentué lui-même. Par exemple, si vous tapez "Na" puis tabulation, cela correspondra à "Näyttökuva.png" car la décomposition canonique de "ä" commence par "a". Mais si vous avez un fichier nommé "Narwal.gif" dans le même répertoire, cela ne sera pas très utile ...

  3. Je n'ai pas testé cela, mais si vous liez tab à menu-complete au lieu de complete, cela devrait vous permettre de parcourir les correspondances possibles afin que vous puissiez sélectionner celle que vous voulez même si vous ne pouvez pas taper la lettre suivante. (Ou vous pouvez le lier à une frappe différente, vous ne pouvez donc l'utiliser que lorsque vous en avez besoin.)

  4. Pour résoudre le problème de non-synchronisation de l'affichage du terminal, vous pouvez lier quelque chose à redessiner la ligne actuelle - cela n'empêchera pas le problème de se produire, mais cela vous donnera un moyen de resynchroniser l'affichage.

Gordon Davisson
la source
Merci, j'ai apprécié le pop-corn. Je pense que vous avez identifié la cause du problème: utiliser $ echo -e "N\xC3\xA4*" | ls(l'écho donne Nä*) des résultats Näyttökuva.png. Le problème existe également avec les autres shells sous Mac OS; et avec par exemple zsh ls Nobtient l'auto-complétion pourls Na<0308>ytto<0308>kuva.png
Jari Keinänen
J'ai également essayé l'auto-complétion et ls Nä*bash dans Xubuntu et cela a fonctionné correctement, donc ça bogue quelque part entre le clavier & OS X & Terminal. J'ai également testé cela dans la partition Bootcamp, mais le problème persiste (c'est-à-dire qu'il ne se produit pas uniquement avec les fichiers HFS +).
Jari Keinänen
(Vous avez maintenant vu votre modification concernant les solutions de contournement) Au moins les deux premiers travaux. Le # 2 est intéressant: la saisie semi-automatique Nafonctionne, mais Nayne fonctionne pas (bien que cela soit compréhensible car il y a en fait ¨entre le aet y. Dans Xubuntu ls Na*ne fonctionne pas (bien que Nä*fonctionne donc ce n'est vraiment pas un problème). remplacer ä& öavec a?et o?par exemple ls Na?y*. Bien sûr, cela augmente l'ambiguïté, mais cela peut être utile dans certains cas.
Jari Keinänen
2
La raison pour laquelle cela fonctionne dans Xubuntu est peut-être simplement que le système de fichiers utilise la même forme que l'interface du terminal. Si vous le faites ls N* | xxddans Xubuntu, cela donne-t-il des personnages composés ou décomposés?
Gordon Davisson
En supposant que Xubuntu stocke le nom de fichier sous forme composée, essayez d'exécuter la commande touch $'Na\xcc\x88ytto\xcc\x88kuva.png'et voyez ce qui se passe - je suppose que cela créera un nouveau fichier avec un nom très très similaire.
Gordon Davisson
4

C'est une vieille question, et aucune réponse définitive. Juste des contournements.

Cependant, j'ai combiné certaines informations de cet ancien guide, et comme suggéré et instruit ici :

J'ai installé un nouveau bash dans mon Snow Leopard. Après l'avoir installé, la complétion bash fonctionne correctement! (Snow Leopard livré avec 3.2.48 (1) et MacPorts installé 4.2.45_1). N'oubliez pas de faire les changements dans /etc/shellset en cours d'exécution chsh.

De plus, à cause d'autres instructions, j'ai dans .inputrc:

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

Je ne sais pas s'ils sont nécessaires ou non pour un bon fonctionnement.

Pingouin sauvage
la source
Vous avez raison: bash 4.2 se termine (où äest précomposé) Näyttökuva.pngmais bash 3.2 ne le fait pas.
Lri