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您只會看到它.?~不是因為它只是省略了^,而是因為任何非優先字元都顯示為?。嘗試touchctrl+ VEnterfooEnter,然後ls。您將看到的文件將是?foo.然後ls -b就會顯示\rfoo.

因此,當您輸入時,rm .?~它是匹配的,因為在這種情況下,?您鍵入的內容被 shell 解釋為匹配任何單個字元的通配符,而不是具體的實際問號。您已rm使用別名,rm -i因此它會確認您的操作,並且當它確認時,它會顯示 C 樣式轉義代碼。

答案2

該檔案名稱中的奇怪字元(如 所示rm)是字元0177( 0x7Fh / 127d )。這就是Del角色。

Bash 自動補全似乎無法一致地處理它。 ls列印?不可列印字元的 a (預設)。嘗試:

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

rm是有幫助的並列印它的八進制值。

答案3

當您按 TAB 時,shell 會進行某種檔案名稱猜測,它會列印兩個字元:“^”和“?”對於八進位 177 的位元組。 (一次三個鍵)用於測試。

檔案名稱不是點插入號問號波浪號,而是點八進位 177 波浪號。不同的程式選擇不同的方式來表示八進位 177 值位元組。

相關內容