Wie gebe ich Sonderzeichen ein, damit Bash / Terminal sie versteht?

18

Angenommen, ein Ordner hat eine Datei mit dem Namen Näyttökuva.png(für Interessierte ist es ein „Screenshot“ in finnischer Sprache). Das ist, was passiert:

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

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

Dies wirkt sich auch auf die automatische Vervollständigung von Registerkarten aus. Wenn ich anfange zu tippen ls Nund drücke tab, wird es korrekt auf erweitert ls Näyttökuva.png. Aber wenn ich anfange zu ls Nätippen, tut das nichts.

Wie kann ich entweder:

  • Konfigurieren Sie bash / terminal so, dass es Sonderzeichen versteht
  • Geben Sie die Sonderzeichen ein, damit Bash / Terminal sie versteht.

In Terminal ist die Codierung auf der Registerkarte Einstellungen auf UTF-8 eingestellt, und die Registerkarte Codierung befindet sich in ihrem Standardzustand, d. H. UTF-8, Mac OS Roman, ISO Latin 1, ISO Latin 9, Windows Latin 1, ASCII, NextStep +. Einige asiatische Codierungen sind aktiviert.


Noch seltsamer (obwohl wahrscheinlich nicht wesentlich für die Frage):

Wenn ich tippe ls N, drücke tab, lösche die Zeichen am Ende, bis es liest, ls Näund drücke taberneut, der Befehl wird auf ls Nättökuva.png[sic] erweitert.

Wenn ich versuche, die Buchstaben ein zweites Mal zu löschen, ls Näund die Tabulatortaste drücke, wird sie auf erweitert ls Nätökuva.png. Dritter Lauf erweitert um ls Näökuva.png.

Aus irgendeinem Grund gibt der 4. Lauf ls Nä̈kuva.png(beachten Sie die Umlaute über Umlaute). Jedes Mal, wenn man das ls Nä̈gibt ls Nä̈kuva.png. Trotzdem funktioniert es:

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

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

Antworten:

23

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äytkuva.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:

  1. 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.

  2. 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 ...

  3. 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.)

  4. 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.

Gordon Davisson
quelle
Danke, ich habe das Popcorn genossen. Ich denke, Sie haben die Ursache des Problems gefunden: Verwenden von $ echo -e "N\xC3\xA4*" | ls(das Echo gibt Nä*) Ergebnissen Näyttökuva.png. Das Problem besteht auch bei den anderen Shells unter Mac OS. und mit zb ls Nwird zsh automatisch vervollständigt bisls Na<0308>ytto<0308>kuva.png
Jari Keinänen
Ich habe auch die Autovervollständigung und 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).
Jari Keinänen
(Habe jetzt deine Bearbeitung bezüglich Workarounds gesehen) Zumindest die ersten beiden funktionieren. Die # 2 ist interessant: Autocompleting Nafunktioniert, aber Naynicht (obwohl es verständlich ist, weil es tatsächlich ¨zwischen dem aund gibt y. In Xubuntu ls Na*funktioniert es nicht (obwohl es Nä*funktioniert, also ist es wirklich kein Problem). In Bezug auf Wildcards - könnte eine andere Problemumgehung sein Ersetzen von ä& ödurch a?und o?z ls Na?y*. B. Natürlich erhöht dies die Mehrdeutigkeit, aber es kann in einigen Fällen nützlich sein.
Jari Keinänen
2
Der Grund, warum es in Xubuntu funktioniert, ist möglicherweise, dass das Dateisystem dieselbe Form wie die Terminalschnittstelle verwendet. Gibt es ls N* | xxdin Xubuntu zusammengesetzte oder zerlegte Zeichen?
Gordon Davisson
Angenommen, Xubuntu speichert den Dateinamen in zusammengesetzter Form. Führen Sie den Befehl aus 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.
Gordon Davisson
4

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/shellsund auszuführen chsh.

Auch wegen einiger anderer Anweisungen habe ich in .inputrc:

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

Nicht sicher, ob sie für den ordnungsgemäßen Betrieb erforderlich sind oder nicht.

Wilder Pinguin
quelle
Sie haben Recht: Bash 4.2 wird abgeschlossen (wo äes vorkomponiert ist), Näyttökuva.pngBash 3.2 jedoch nicht.
Lri