Bash

Bash 自動完成提供的文件名與 ls 不同

  • July 3, 2012

剛剛發生了一件不可思議的事情。由於一個嚴重的錯字,我輸入了

cp filename.xsl .^?~

是的,沒錯,點插入問號-波浪號!真實比虛構更離奇。

它變得更奇怪了。當我輸入

cat .

然後打TAB,我得到

./    ../    .^?~

但是當我做一個時ls -a,我得到

.    ..    .?~

最後,當我這樣做時

rm .?~

刪除命令這樣提示我:

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

在成功刪除它之前。為什麼插入符號存在的減少?

這是因為插入符號通常用於表示ctrl已按下的鍵,或者它是控製字元。

您實際鍵入的鍵序列是這樣的:

cp filename.xsl .``ctrl+V``backspace``~``Enter

您可能正試圖將文件複製到您的主目錄 ( ~)。ctrl您可以通過鍵入+來重複此操作V``backspace。你會看到^?列印在螢幕上。

您可以查看具有轉換為C 樣式轉義的非列印字元的文件,如下所示(這-b是重要的標誌,但由於您的文件以點開頭,您還需要-a

$ ls -ab
.  ..  .\177~

沒有 ,-b您只會看到它.?~不是因為它只是省略了^,而是因為任何非 pritable 字元都顯示為?. 嘗試touch``ctrl+V``Enter``foo``Enter然後ls。您將看到的文件將是?foo. 然後ls -b會顯示\rfoo

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

引用自:https://unix.stackexchange.com/questions/42268