剛剛發生了一件極為奇怪的事。由於嚴重的錯字,我輸入了
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
您只會看到它.?~
不是因為它只是省略了^
,而是因為任何非優先字元都顯示為?
。嘗試touch
ctrl+ VEnterfooEnter,然後ls
。您將看到的文件將是?foo
.然後ls -b
就會顯示\rfoo
.
因此,當您輸入時,rm .?~
它是匹配的,因為在這種情況下,?
您鍵入的內容被 shell 解釋為匹配任何單個字元的通配符,而不是具體的實際問號。您已rm
使用別名,rm -i
因此它會確認您的操作,並且當它確認時,它會顯示 C 樣式轉義代碼。
答案2
該檔案名稱中的奇怪字元(如 所示rm
)是字元0177
( 0x7F
h / 127
d )。這就是Del
角色。
Bash 自動補全似乎無法一致地處理它。
ls
列印?
不可列印字元的 a (預設)。嘗試:
$ echo a > .$'\x7f'~
$ ls -b .??
.\177~
rm
是有幫助的並列印它的八進制值。
答案3
當您按 TAB 時,shell 會進行某種檔案名稱猜測,它會列印兩個字元:“^”和“?”對於八進位 177 的位元組。 (一次三個鍵)用於測試。
檔案名稱不是點插入號問號波浪號,而是點八進位 177 波浪號。不同的程式選擇不同的方式來表示八進位 177 值位元組。