Ich denke, dass Bash über einige Anomalien im Umgang mit Zeichen mit Akzenten stolpert. Vielleicht möchten Sie sich Popcorn schnappen, weil es für ein bisschen Zeit wird, es technisch zu machen ...
In Unicode können einige Zeichen mit Akzent auf verschiedene Arten dargestellt werden: als "Codepunkt", der das Zeichen mit Akzent darstellt, oder als eine Reihe von Codepunkten, die die nicht akzentuierte Version des Zeichens, gefolgt von den Akzenten, darstellt. Beispielsweise könnte "ä" entweder als U + 00E4 (UTF-8 0xc3a4, lateinischer Kleinbuchstabe 1 mit Diaeresis) oder als U + 0061 U + 0308 (UTF-8 0x61cc88, lateinischer Kleinbuchstabe a +, der Diaeresis kombiniert) vorkomponiert dargestellt werden ).
Das HFS + -Dateisystem von OS X erfordert, dass alle Dateinamen in der UTF-8-Darstellung ihrer vollständig zerlegten Form gespeichert werden . In einem HFS + -Dateinamen MUSS "ä" als 0x61cc88 und "ö" als 0x6fcc88 codiert sein.
Ich bin mir ziemlich sicher, dass, wenn Sie "Näyttökuva.png" in die Befehlszeile eingeben, die Zeichen in vorkompositionierter Form "eingegeben" werden. Wenn die Datei erstellt wird, zerlegt das Dateisystem die zu speichernden Zeichen. Bisher ist alles in Ordnung. Aber wenn Sie versuchen, die Tab-Vervollständigung zu verwenden, die mit "Nä" beginnt, kann bash das "ä" vermutlich nicht zerlegen, bevor nach Übereinstimmungen gesucht wird, und findet natürlich keine.
Um den Unterschied zu veranschaulichen, ist hier ein Beispiel für die verwendete Codierung, wenn ich nur "Näyttökuva.png" in die Befehlszeile eingebe.
$ 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
Was nun die Frage betrifft, ob beim Löschen und erneuten Vervollständigen von Tabs Zeichen verloren gehen, vermute ich, dass dies eng verwandt ist. Insbesondere denke ich, dass bash einen Codepunkt pro Drücken der Entf-Taste "löscht", aber ein Zeichen pro Drücken aus dem Terminal-Fenster löscht. Da eines der gelöschten Zeichen ("ö" dieses Mal) aus zwei Codepunkten bestand, jedoch nur aus einem Zeichen, ist die Terminalanzeige nicht mehr synchron. Versuchen Sie, den gesamten Dateinamen mit einem Tabulator zu vervollständigen, ihn wieder in "Näytt" zu löschen und ihn dann erneut mit einem Tabulator zu vervollständigen: Bash scheint zu glauben, dass nur die kombinierende Diaeresis gelöscht wurde, nicht das gesamte "ö", sodass die kombinierende Diaeresis erneut hinzugefügt wird , aber diesmal hängt es am "t":
$ echo Näytẗkuva.png
Näyttökuva.png
Beachten Sie, dass Bash, wenn ich die Eingabetaste drücke, tatsächlich den gesamten Dateinamen enthält. Es ist nur das Terminal-Display, das verwirrt war.
TL; DR bash hat einige Fehler bei der Behandlung von Zeichen mit zerlegbarem Akzent.
BEARBEITEN: Nach einigem Nachdenken denke ich, dass die einzige vollständige Lösung darin besteht, Bash zu reparieren (/ warten, bis die Entwickler das Problem behoben haben). Es könnte auch eine Möglichkeit geben, Zeichen in zerlegter Form einzugeben, aber ich habe keine Ahnung, was das sein würde. Aber ich habe einige teilweise Problemumgehungen gefunden:
Wenn Sie eine Datei aus dem Finder ziehen und ablegen, wird sie in der richtigen Form eingefügt. Da der Finder den Dateinamen aus dem Dateisystem abruft, ist er bereits zerlegt und funktioniert einfach.
Sie können das akzentuierte Zeichen auch per Tabulator vervollständigen. Wenn Sie beispielsweise "Na" und dann "tab" eingeben, entspricht dies "Näyttökuva.png", da die kanonische Zerlegung von "ä" mit "a" beginnt. Aber wenn Sie eine Datei mit dem Namen "Narwal.gif" im selben Verzeichnis haben, ist das nicht sehr hilfreich ...
Ich habe dies nicht getestet, aber wenn Sie tab an menu-complete anstatt an complete binden , sollten Sie damit durch mögliche Übereinstimmungen blättern, damit Sie die gewünschte auswählen können, auch wenn Sie den nächsten Buchstaben nicht eingeben können. (Oder Sie können es an einen anderen Tastendruck binden, sodass Sie es nur dann verwenden können, wenn Sie es benötigen.)
Um das Problem zu beheben, dass die Anzeige des Terminals nicht mehr synchron ist, können Sie etwas an die aktuelle Zeile neu zeichnen binden. Dies verhindert zwar nicht das Auftreten des Problems, gibt Ihnen jedoch die Möglichkeit, die Anzeige neu zu synchronisieren.
$ echo -e "N\xC3\xA4*" | ls
(das Echo gibtNä*
) ErgebnissenNäyttökuva.png
. Das Problem besteht auch bei den anderen Shells unter Mac OS. und mit zbls N
wird zsh automatisch vervollständigt bisls Na<0308>ytto<0308>kuva.png
ls Nä*
Bash in Xubuntu ausprobiert und es funktionierte einwandfrei, so dass es irgendwo zwischen Tastatur & OS X & Terminal Fehler gibt. Ich habe das auch in der Bootcamp-Partition getestet, aber das Problem besteht weiterhin (dh es tritt nicht nur bei HFS + -Dateien auf).Na
funktioniert, aberNay
nicht (obwohl es verständlich ist, weil es tatsächlich¨
zwischen dema
und gibty
. In Xubuntuls Na*
funktioniert es nicht (obwohl esNä*
funktioniert, also ist es wirklich kein Problem). In Bezug auf Wildcards - könnte eine andere Problemumgehung sein Ersetzen vonä
&ö
durcha?
undo?
zls Na?y*
. B. Natürlich erhöht dies die Mehrdeutigkeit, aber es kann in einigen Fällen nützlich sein.ls N* | xxd
in Xubuntu zusammengesetzte oder zerlegte Zeichen?touch $'Na\xcc\x88ytto\xcc\x88kuva.png'
und sehen Sie, was passiert. Ich vermute, es wird eine neue Datei mit einem sehr sehr ähnlichen Namen erstellt.Dies ist eine alte Frage und keine eindeutige Antwort. Nur Problemumgehungen.
Ich kombinierte jedoch einige Informationen aus diesem alten Führer, und wie vorgeschlagen und instruierte hier :
Ich habe eine neuere Bash in meinem Snow Leopard installiert. Nach der Installation funktioniert die Bash-Vervollständigung korrekt! (Snow Leopard wird mit 3.2.48 (1) und MacPorts 4.2.45_1 ausgeliefert.) Denken Sie daran, die Änderungen vorzunehmen
/etc/shells
und auszuführenchsh
.Auch wegen einiger anderer Anweisungen habe ich in
.inputrc
:Nicht sicher, ob sie für den ordnungsgemäßen Betrieb erforderlich sind oder nicht.
quelle
Nä
(woä
es vorkomponiert ist),Näyttökuva.png
Bash 3.2 jedoch nicht.iconv
ist die Lösung, die bei mir funktioniert hat:Siehe /programming//a/23226449/1909531
quelle