为什么 "$" 会执行文件名补全操作?
为什么 "$" 会执行文件名补全操作?
在尝试配置可编程补全时,我遇到了一个我不理解的行为。根据这三种补全的情况,这是我的理解:
$
行首 --> 使用complete -E
--> 如果不存在,则使用complete -D
--> 如果不存在,则使用默认的Bash补全 --> 行上没有单词 --> 使用命令补全。
$com
尝试补全第一个单词 --> 使用命令补全。
$command argu
行上至少有一个单词 --> 尝试补全一个参数 --> 使用给定命令的complete
--> 如果不存在,则使用complete -D
--> 如果不存在,则使用默认的Bash补全 --> 行上已经至少有一个单词,所以不使用命令补全 --> 不以$
、~
或@
开头,所以执行文件名补全。
我的问题是,为什么在这种情况下,即使行上还没有单词,却执行了文件名补全而不是命令补全:
$
更令人困惑的是,下面的命令补全按预期执行:
$com
我很可能误解了手册,对于任何解释,我将非常感激。
注意:
$
表示提示符,而不是字面的美元符号。
在Bash shell中,当一行以空格开头时,这告诉shell该命令不应该进入命令历史记录。可以通过设置HISTCONTROL
环境变量来配置,该变量可以在.bashrc
、.profile
或其他文件中设置,并应该是默认行为(参见How to prevent commands to show up in bash history?)。
因此,除了不将此命令记录到历史记录中外,以空格开头的命令执行方式与其他命令相同。因此,代码补全的行为也是相同的。
对不起,我不确定我是否理解了你的问题。因此,因为有一个空格,所以补全不会处理命令,因为空格意味着你不想将它们记录在命令历史记录中等等?那么为什么$<SPACE>com<TAB><TAB>
能够正常工作,即使其中也有一个空格?
我相信我稍微误解了你的问题。也许这会对你有所帮助:unix.stackexchange.com/questions/205360/…根据(2)说明,你不在命令补全的上下文中(因为你还没有开始一个单词,但已经输入了一个字符),因此Bash尝试自动补全文件名。希望这能给你一些指导 🙂