`ls -l ~~`(两个波浪号)+选项卡不显示以 ~~ 开头的目录,但显示用户

`ls -l ~~`(两个波浪号)+选项卡不显示以 ~~ 开头的目录,但显示用户

bashshell 中,为什么ls -l ~~+Tab不显示以 开头的目录~~,而是显示用户? (全部用户)。

ls -l只是一个例子。如果我在任何目录中键入~+ Tab,我都会得到用户列表。

答案1

~是 Bash 中可用的语法糖,旨在扩展到$HOME. Bash 补全过去有很多怪癖,目前仍在开发中。例如,它过去无法自动完成许多带有特殊字符(例如换行符或星号)的文件名,并且看起来您发现了另一个怪癖。

我的 C-foo 不够强大,但看起来您正在寻找的答案应该就在眼前

/* We aren't done yet.  We also support the "~user" syntax. */

lib/readline/complete.c

答案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/.

相关内容