在bash
shell 中,为什么ls -l ~~
+Tab不显示以 开头的目录~~
,而是显示用户? (全部用户)。
这ls -l
只是一个例子。如果我在任何目录中键入~
+ Tab,我都会得到用户列表。
答案1
~
是 Bash 中可用的语法糖,旨在扩展到$HOME
. Bash 补全过去有很多怪癖,目前仍在开发中。例如,它过去无法自动完成许多带有特殊字符(例如换行符或星号)的文件名,并且看起来您发现了另一个怪癖。
我的 C-foo 不够强大,但看起来您正在寻找的答案应该就在眼前
/* We aren't done yet. We also support the "~user" syntax. */
答案2
对于 bash,man readline
解释:
Completing
complete (TAB)
Attempt to perform completion on the text before point.
The actual completion performed is application-specific.
Bash, for instance, attempts completion treating the text as a
variable (if the text begins with $),
username (if the text begins with ~),
hostname (if the text begins with @), or
command (including aliases and functions) in turn.
If none of these produces a match, filename completion is attempted.
用户名补全也可以由 触发M-~
。
...以及默认的文件名补全M-/
(Esc, /
或Alt-/
)
]# touch '~~ van tilde'
]# ls ~~\ van\ tilde
(和ls ~~Esc/
)
完成和扩张不要混淆。
之后touch \~ftp
,~f+TAB
我得到:
\~ftp/
这既不是也不是。反斜杠表示 bash 识别一个文件,斜杠来自扩展为/srv/ftp/
.