Bash 自动完成提供与 ls 不同的文件名

Kaz*_*ark 6 ls filesystems bash autocomplete filenames

刚刚发生了一件非常奇怪的事情。通过一个严重的错字,我进入

cp filename.xsl .^?~
Run Code Online (Sandbox Code Playgroud)

是的,没错,点插入符号-问号-代字号!真相比小说更离奇。

变得更奇怪了。当我打字

cat .
Run Code Online (Sandbox Code Playgroud)

然后点击TAB,我得到

./    ../    .^?~
Run Code Online (Sandbox Code Playgroud)

但是当我做一个时ls -a,我得到

.    ..    .?~
Run Code Online (Sandbox Code Playgroud)

最后,当我做

rm .?~
Run Code Online (Sandbox Code Playgroud)

remove 命令提示我:

rm: remove write-protected regular file `.\177~'?
Run Code Online (Sandbox Code Playgroud)

在成功删除它之前。为什么插入符号存在的递减性?

bah*_*mat 11

这是因为插入符号通常用于表示ctrl已按下的键,或者它是控制字符。

您实际键入的键序列是这样的:

cp filename.xsl .ctrl+Vbackspace~Enter

您可能试图将文件复制到您的主目录 ( ~)。您可以通过键入ctrl+重复此操作Vbackspace。你会看到^?打印在屏幕上。

您可以查看将非打印字符转换为C 样式转义的文件,如下所示(这-b是很重要的标志,但由于您的文件以点开头,因此您还需要-a:

$ ls -ab
.  ..  .\177~
Run Code Online (Sandbox Code Playgroud)

如果没有 ,-b您只会将其视为.?~不是因为它只是省略了^,而是因为任何非优先字符都显示为?. 尝试touchctrl+VEnterfooEnter然后ls。您将看到的文件将是?foo. 然后ls -b会显示\rfoo。

因此,当您rm .?~匹配时,因为在这种情况下,?您键入的内容会被 shell 解释为通配符以匹配任何单个字符,而不是具体的实际问号。您使用了rm别名,rm -i因此它正在确认您的操作,并且当它执行时它会显示 C 样式的转义代码。