Bash / Terminalがそれらを理解できるように、特殊文字を入力する方法は?


18

フォルダーにというファイルがあるとしますNäyttökuva.png(興味がある人のために、それはフィンランド語で「スクリーンショット」です)。これが起こることです:

$ ls
Näyttökuva.png

$ ls N*
Näyttökuva.png

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

これは、タブの自動補完にも影響します。入力を開始ls Nして押すtabと、に正しく展開されls Näyttökuva.pngます。しかし、ls Näタブ入力を開始しても何も起こりません。

どうすればいいですか:

  • 特殊文字を理解できるようにbash / terminalを設定します
  • bash / terminalがそれらを理解できるように特殊文字を入力しますか?

ターミナルのエンコーディングは、[設定]タブでUTF-8に設定されており、[エンコーディング]タブはデフォルト状態になっています。UTF-8、Mac OS Roman、ISO Latin 1、ISO Latin 9、Windows Latin 1、ASCII、NextStep +アジアの一部のコーディングが有効になっています。


見知らぬ人でも(質問にはおそらく必須ではありませんが):

を入力した場合ls N、を押してtab、読み終わるまで文字を最後から削除してもう一度ls Nä押すtabと、コマンドはls Nättökuva.png[sic]に展開されます。

2回目に文字を削除してls NäTabキーを押すと、文字が展開されls Nätökuva.pngます。3回目の実行はに展開されls Näökuva.pngます。

何らかの理由で、4回目の実行でls Nä̈kuva.png(ウムラウトよりもウムラウトに注意してください)。Tabキーを押すたびにls Nä̈与えls Nä̈kuva.pngます。それにもかかわらず、それは動作します:

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

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

回答:


23

bashはアクセント文字の処理方法のいくつかの異常につまずいていると思います。ポップコーンをつかむことをお勧めします。これは少し技術的になるからです...

Unicodeでは、いくつかのアクセント付き文字をいくつかの異なる方法で表すことができます。アクセント付き文字を表す「コードポイント」として、またはアクセントのない文字のアクセントなしバージョンを表す一連のコードポイントとして。たとえば、「ä」はU + 00E4(UTF-8 0xc3a4、分音記号付きラテン小文字1)として事前に構成するか、U + 0061 U + 0308(UTF-8 0x61cc88、分音記号付きラテン小文字a +)として分解できます。 )。

OS XのHFS +ファイルシステムでは、すべてのファイル名を完全に分解された形式の UTF-8表現で保存する必要があります。HFS +ファイル名では、「ä」は0x61cc88としてエンコードされなければならず、「ö」は0x6fcc88としてエンコードされなければなりません。

ここで何が起こっているのかは、コマンドラインで「Näyttökuva.png」と入力すると、事前に構成された形式で文字を「入力」していることと確信しています。ファイルが作成されると、ファイルシステムは文字を分解して保存します。これまでのところ、すべて順調です。しかし、「Nä」で始まるタブ補完を使用しようとすると、bashは一致を検索する前に「ä」を分解できず、もちろん何も見つかりません。

違いを説明するために、コマンドラインで「Näyttökuva.png」と入力したときと、ファイル名として保存し、タブ補完を使用して入力するときに何を使用するかで、どのエンコードが使用されるかの例を示します。

$ 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

さて、削除してタブを完了するときに文字が失われるという問題については、それは密接に関連していると思います。具体的には、bashは削除キーを押すごとに1つのコードポイントを「削除」するが、押すたびにターミナルウィンドウから1文字を消去すると思います。削除された文字の1つ(今回は "ö")は2つのコードポイントで構成されていましたが、1つの文字のみであったため、ターミナルの表示は同期しなくなります。ファイル名全体をタブ補完し、それを「Näytt」に戻し、再タブ補完します:bashは、「ö」全体ではなく、結合分音記号のみが削除されたと思われるので、結合分音記号を再度追加します、しかし今回は「t」にアタッチします:

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

Returnキーを押すと、bashには実際にファイル名全体が含まれていることに注意してください。混乱したのは、ターミナルディスプレイだけです。

TL; DR bashには、分解可能なアクセント付き文字を処理するいくつかのバグがあります。

編集:いくつかの検討の後、唯一の完全な解決策はbashを修正することだと思います(/開発者が修正するのを待ちます)。分解された形式で文字を入力する方法もありますが、それがどうなるかはわかりません。しかし、私はいくつかの部分的な回避策を見つけました:

  1. Finderからファイルをドラッグアンドドロップすると、正しい形式で貼り付けられます。Finderはファイルシステムからファイル名を取得するため、すでに分解されているため、機能します。

  2. 実際に、アクセント記号付きの文字自体をタブ補完することができます。たとえば、「Na」と入力してからTabキーを押すと、「ä」の標準分解が「a」で始まるため、「Näyttökuva.png」と一致します。しかし、同じディレクトリに「Narwal.gif」という名前のファイルがある場合、それはあまり役に立ちません...

  3. これはテストしていませんが、tabをcompleteではなくmenu-completeにバインドすると、一致する可能性のあるものをタブで移動できるので、次の文字を入力できない場合でも必要なものを選択できます。(または、別のキーストロークにバインドすることができるため、必要な場合にのみ使用できます。)

  4. ターミナルディスプレイが同期しなくなる問題を修正するには、何かをredraw-current-lineにバインドします。これにより、問題の発生を防ぐことはできませんが、ディスプレイを再同期する方法が得られます。


ありがとう、ポップコーンを楽しんだ。あなたは問題の原因を突き止めたと思う:結果を使う$ echo -e "N\xC3\xA4*" | ls(エコーが与えるNä*Näyttökuva.png。この問題は、Mac OSの他のシェルにも存在します。そして、例えばzsh ls Nがオートコンプリートされるls Na<0308>ytto<0308>kuva.png
ヤリ・ケイネン

またls Nä*、Xubuntuでオートコンプリートとbashを試してみましたが、正常に動作したため、キーボードとOS Xとターミナルの間のどこかにバグがありました。Bootcampパーティション内でもテストしましたが、問題は解決しません(つまり、HFS +ファイルだけでは発生しません)。
ヤリケイネン

(今、回避策に関する編集を見ました)少なくとも最初の2つの作業。オートコンプリート:#2は興味深いですNa動作しますが、Nay実際にそこにあるので、それは理解できるもののんではない(¨ay。でXubuntuのは、ls Na*仕事(ただしはありませんNä*、それは本当に問題な作品ではありませんので)ワイルドカードについては-一つの他の回避策がある可能性があります。ä&に置き換えöa?o?例えばls Na?y*。もちろん、これはあいまいさを増しますが、場合によっては便利になるかもしれません
JariKeinänen11年

2
Xubuntuで機能する理由は、ファイルシステムが端末インターフェイスと同じ形式を使用しているためかもしれません。そうした場合ls N* | xxdのXubuntuで、それは構成または分解された文字を与えるのでしょうか?
ゴードンデイヴィソン

Xubuntuが合成された形式でファイル名を保存すると仮定して、コマンドtouch $'Na\xcc\x88ytto\xcc\x88kuva.png'を実行して何が起こるか試してみてください-私の推測では、非常によく似た名前で新しいファイルを作成します。
ゴードン

4

これは古い質問であり、明確な答えはありません。ただ回避策。

しかし、私はこの古いガイドからいくつかの情報を組み合わせ、ここで提案され、指示されたように

Snow Leopardに新しいbashをインストールしました。それをインストールした後、bashの完了は正しく機能します!(Snow Leopardは3.2.48(1)とともに出荷され、MacPortsは4.2.45_1がインストールされています)。変更/etc/shellsを実行することを忘れないでくださいchsh

また、他のいくつかの指示のために、私は持ってい.inputrcます:

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

適切な操作に必要かどうかはわかりません。


その通りです:bash 4.2は完了します(構成済みの場合ä)がNäyttökuva.png、bash 3.2は完了しません。
Lri

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.