Bashオートコンプリートはlsとは異なるファイル名を提供します。

Bashオートコンプリートはlsとは異なるファイル名を提供します。

とても奇妙なことが起こりました。太字がひどくてこう書いています。

cp filename.xsl .^?~

はい、そうです。ドット - カラット - 疑問符 - チルダ!真実はフィクションよりも見慣れない。

状況がさらに奇妙になります。私が入力している間

cat .

それからクリックTABすると

./    ../    .^?~

しかし、私がそうすればls -a、私は得ます。

.    ..    .?~

最後に私がやったとき

rm .?~

削除コマンドは、次のメッセージを表示します。

rm: remove write-protected regular file `.\177~'?

正常に削除される前に。カラットの存在が減少するのはなぜですか?

答え1

キャレットは通常、押されたctrlキーを表すために使用されるか、または制御文字であるためです。

実際に入力するキーシーケンスは次のとおりです。

cp filename.xsl .ctrl+Vbackspace~Enter

ファイルをホームディレクトリ(~)にコピーしようとしている可能性があります。ctrl+と入力してこの操作を繰り返すことができますVbackspace^?画面に印刷されたものが表示されます。

印刷されていない文字が変換されたファイルを表示できます。C型次のようにエスケープしてください(-b重要なフラグですが、ファイルはドットで始まるので、次のものも必要です-a

$ ls -ab
.  ..  .\177~

それ以外の場合は、単に省略されたためではなく、優先順位以外の文字が で表示されるため-b表示されます。 +を試してから。これは表示されるファイルです。.?~^?touchctrlVEnterfooEnterls?fools -b\rfoo

したがって、入力するとrm .?~一致するものです。これは、?入力した内容が特定の実際の疑問符ではなく単一の文字に一致するワイルドカードとしてシェルによって解釈されるためです。rmエイリアスを使用したので、操作を確認しrm -i、確認するとCスタイルのエスケープコードが表示されます。

答え2

このファイル名の奇妙な文字(図参照rm)は文字01770x7Fh / 127d)です。これがDel役割です。

Bashのオートコンプリートが一貫して処理できないようです。印刷できない文字については、aをls印刷します?(デフォルト)。努力する:

$ echo a > .$'\x7f'~
$ ls -b .??
.\177~

rm役に立ち、8進値を印刷します。

答え3

Tabキーを押すと、シェルは一種のファイル名を推測し、8進数の177バイトに対して「^」と「?」の2文字を印刷します。 Ctrl-Vを押してからShift-Ctrl-?を押すと、その値のバイトを含むファイル名を取得できます。 (一度に3つのキー)テスト用です。

ファイル名は、ドットカラット疑問符のチルダではなく、ドット8進数177チルダです。さまざまなプログラムは、8進数177値バイトを表すさまざまな方法を選択します。

関連情報