Come inserire caratteri speciali in modo che Bash / Terminal li capisca?


18

Diciamo che una cartella ha un file chiamato Näyttökuva.png(per coloro che sono interessati, è "screenshot" in finlandese). Questo è ciò che succede:

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

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

Ciò influisce anche sul completamento automatico delle schede. Se inizio a digitare ls Ne premo tab, viene espanso correttamente in ls Näyttökuva.png. Ma se comincio a digitare ls Nätabbing non fa nulla.

Come posso:

  • configura bash / terminal in modo che comprenda caratteri speciali
  • digitare i caratteri speciali in modo che bash / terminal li capisca?

Nella codifica del Terminale è impostato UTF-8 nella scheda Impostazioni e la scheda Codifica è nel suo stato predefinito, vale a dire. UTF-8, Mac OS Roman, ISO Latin 1, ISO Latin 9, Windows Latin 1, ASCII, NextStep + alcune codifiche asiatiche sono abilitate.


Anche straniero (anche se probabilmente non essenziale per la domanda):

Se digito ls N, premo tab, elimino i caratteri dalla fine fino a quando non viene letto ls Näe premo di tabnuovo, il comando si espande in ls Nättökuva.png[sic].

Se provo a cancellare le lettere una seconda volta ls Näe premo tab, si espande ls Nätökuva.png. La terza corsa si espande a ls Näökuva.png.

Per qualche motivo, la quarta corsa dà ls Nä̈kuva.png(notare le umlaut sopra le umlaut). Tabing il ls Nä̈ls Nä̈kuva.pngogni volta. Tuttavia, funziona:

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

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

Risposte:


23

Penso che bash stia inciampando su alcune anomalie nel modo in cui vengono gestiti i personaggi accentati. Potresti prendere dei popcorn, perché questo diventerà tecnico per un po '...

Unicode consente di rappresentare alcuni caratteri accentati in diversi modi: come un "punto di codice" che rappresenta il carattere accentato o come una serie di punti di codice che rappresentano la versione non accentata del carattere, seguita dall'accento / i. Ad esempio, "ä" potrebbe essere rappresentato precomposto come U + 00E4 (UTF-8 0xc3a4, lettera minuscola latina 1 con diaeresi) o scomposto come U + 0061 U + 0308 (UTF-8 0x61cc88, lettera minuscola latina a + combinando diaeresi ).

Il filesystem HFS + di OS X richiede che tutti i nomi dei file siano archiviati nella rappresentazione UTF-8 della loro forma completamente decomposta . In un nome file HFS +, "ä" DEVE essere codificato come 0x61cc88 e "ö" DEVE essere codificato come 0x6fcc88.

Sono abbastanza sicuro che ciò che sta accadendo qui è che quando si digita "Näyttökuva.png" alla riga di comando, si sta "digitando" i caratteri in forma precomposta. Quando viene creato il file, il filesystem decompone i caratteri per l'archiviazione. Finora tutto bene. Ma quando provi a usare il completamento della scheda a partire da "Nä", penso che bash non riesca a scomporre "ä" prima di cercare le corrispondenze, e ovviamente non ne trova.

Per illustrare la differenza, ecco un esempio di quale codifica viene utilizzata quando digito semplicemente "Näyttökuva.png" nella riga di comando, rispetto a ciò che viene utilizzato quando lo memorizzo come nome file e utilizzo il completamento della scheda per compilarlo:

$ 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

Ora, per quanto riguarda la questione dei personaggi che si perdono quando si eliminano e si ri-completano le schede, sospetto che sia strettamente correlato. In particolare, penso che bash stia "cancellando" un punto di codice per pressione del tasto Elimina, ma cancellando un carattere dalla finestra Terminale per stampa. Poiché uno dei caratteri eliminati ("ö" questa volta) consisteva in due punti di codice, ma solo un carattere, il display del Terminale non è più sincronizzato. Prova a completare con tabulazione l'intero nome del file, eliminandolo di nuovo in "Näytt", quindi ripeti il ​​completamento del tab: bash sembra pensare che sia stata eliminata solo la diaeresi combinata, non l'intero "ö", quindi aggiunge nuovamente la diaeresi combinata , ma questa volta si attacca alla "t":

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

Nota che quando premo return, bash ha effettivamente l'intero nome file lì; è solo il display del Terminale che era confuso.

TL; DR bash ha alcuni bug che gestiscono caratteri accentati scomponibili.

EDIT: dopo alcuni rimuginare, penso che l'unica soluzione completa sia riparare bash (/ attendere che i suoi sviluppatori lo risolvano). Potrebbe esserci anche un modo per inserire caratteri in forma scomposta, ma non ho idea di cosa sarebbe. Ma ho trovato alcune soluzioni parziali:

  1. Trascina e rilascia un file dalle paste del Finder nella sua forma corretta. Poiché il Finder ottiene il nome file dal filesystem, è già decomposto, quindi funziona.

  2. Puoi effettivamente completare il tab con il carattere accentato stesso. Ad esempio, se digiti "Na" e quindi tab, corrisponderà a "Näyttökuva.png" perché la decomposizione canonica di "ä" inizia con "a". Ma se hai un file chiamato "Narwal.gif" nella stessa directory, non sarà molto utile ...

  3. Non l'ho provato, ma se si lega la scheda al menu completo anziché a quello completo, dovrebbe consentire di scorrere le possibili corrispondenze in modo da poter selezionare quella desiderata anche se non è possibile digitare la lettera successiva. (Oppure potresti associarlo a una diversa pressione dei tasti, quindi puoi usarlo solo quando è necessario.)

  4. Per risolvere il problema con la visualizzazione del Terminale fuori sincronia, è possibile associare qualcosa a ridisegnare la linea corrente - non impedirà che si verifichi il problema, ma ti darà un modo per risincronizzare il display.


Grazie, mi sono piaciuti i popcorn. Penso che tu abbia inchiodato la causa del problema: usando $ echo -e "N\xC3\xA4*" | ls(l'eco dà Nä*) risultati Näyttökuva.png. Il problema esiste anche con le altre shell in Mac OS; e con ad esempio zsh ls Nviene completato automaticamentels Na<0308>ytto<0308>kuva.png
Jari Keinänen il

Ho anche provato il completamento automatico e ls Nä*in bash in Xubuntu e ha funzionato correttamente, quindi bug da qualche parte tra tastiera e OS X e Terminale. L'ho anche provato all'interno della partizione Bootcamp, ma il problema persiste (cioè non succede solo con i file HFS +).
Jari Keinänen,

(Ora ho visto la tua modifica relativa alle soluzioni alternative) Almeno le prime due opere. Il numero 2 è interessante: il completamento automatico Nafunziona, ma Naynon funziona (anche se è comprensibile perché in realtà c'è ¨tra il ae y. In Xubuntu ls Na*non funziona (anche se Nä*funziona quindi non è davvero un problema). Per quanto riguarda i caratteri jolly, un altro trucco potrebbe essere sostituendo ä& öcon a?ed o?es ls Na?y*. Naturalmente questo aumenta l'ambiguità, ma in alcuni casi potrebbe tornare utile
Jari Keinänen

2
Il motivo per cui funziona in Xubuntu potrebbe essere solo che il filesystem utilizza la stessa forma dell'interfaccia del terminale. Se lo fai ls N* | xxdin Xubuntu, fornisce caratteri composti o decomposti?
Gordon Davisson,

Supponendo che Xubuntu memorizzi il nome del file in forma composta, prova a eseguire il comando touch $'Na\xcc\x88ytto\xcc\x88kuva.png'e vedi cosa succede: suppongo che creerà un nuovo file con un nome molto simile.
Gordon Davisson,

4

Questa è una vecchia domanda e nessuna risposta definitiva. Solo soluzioni alternative.

Tuttavia, ho combinato alcune informazioni di questa vecchia guida e, come suggerito e indicato qui :

Ho installato un nuovo bash nel mio Snow Leopard. Dopo averlo installato, il completamento della bash funziona correttamente! (Snow Leopard fornito con 3.2.48 (1) e MacPorts installati 4.2.45_1). Ricordarsi di apportare le modifiche /etc/shellse in esecuzione chsh.

Inoltre, a causa di alcune altre istruzioni, ho in .inputrc:

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

Non sono sicuro se sono necessari o meno per il corretto funzionamento.


Hai ragione: bash 4.2 completa (dove äè precomposto) Näyttökuva.pngma bash 3.2 no.
Lri,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.