ええと...私はとても混乱しています。なぜなら、私の場合、唯一の本当の問題は、アポストロフィ (') だからです。
状況:PATH 変数を展開すると、追加パスにアポストロフィがあったかどうかに基づいて単語の補完に影響します。
例:適切な exe 権限を持つ exe ファイル (「deadbeef」という名前) があり、そのパスには 2 つのアポストロフィが含まれています。
/home/mallniya/hard'n'soft/soft/gnu-linux/portable/deadbeef-0.6.0
実験のために同じファイルを
/home/mallniya/hardnsoftaa/soft/gnu-linux/portable/deadbeef-0.6.0
最初のパスを変数$PATHにエクスポートすると、bashでは自動補完は行われませんが、2番目のケースでは行われます。ターミナルでエクスポートされたディレクトリのプログラムの最初の文字を入力すると、
死んだ[TAB]
最初のケースでは補完は行われませんが、2番目の条件で同じ単語にTABを使用すると機能します。
ただし、最初のケースでコマンド「deadbeef」を手動で入力すると、これも実行されます。
さらに、どれのそしてタイプコマンドは、exe ファイルが両方のケースに存在することを示しています。
それでは、何が問題なのでしょうか? bash はなぜこのようにアポストロフィを処理するのでしょうか?
答え1
アポストロフィは、ほとんどすべてのシェルで特殊文字です (シェルは、コマンド ライン インタープリターを指す用語で、入力した内容を読み取り、適切なものを実行するプログラムです)。
短い答え: そうしないでください。スペースの場合と同様に、特別な意味を持つファイル名や特殊な文字を含むファイル名は避けたほうがよいでしょう。
長い答え: アポストロフィを使用する場合は、「引用" と入力します (シェルが解釈しないようにする特殊文字を使用します)。必要に応じて、自動補完によって自動的に引用符が付けられます... 例:
(0)samsung-romano:~/tmp/try% touch "hard'n'soft"
一重引用符を二重引用符で囲む方法の 1 つは、二重引用符を使用することです。(その逆も可能ですが、これより複雑です)。
(0)samsung-romano:~/tmp/try% ls
hard'n'soft
次のように書いcat hard
て押すとTAB
:
(0)samsung-romano:~/tmp/try% cat hard\'n\'soft
バックスラッシュは、後続の文字を引用する別の形式です。
答え2
さて、bash_completion チームのアドバイスに従って、私はこの動作を bash チームに報告しました。彼らの回答は次のとおりです。
「報告ありがとうございます。これは bash-4.3 で修正される予定です。」
バグはすでに知られているようなので、待つしかないようです。
答え3
アポストロフィを含むパスを拡張するには、パスの前に " を追加します。
cd "/home/mallniya/hard
タブ拡張で問題なく拡張されます。