为什么 "$" 会执行文件名补全操作?

7 浏览
0 Comments

为什么 "$" 会执行文件名补全操作?

在尝试配置可编程补全时,我遇到了一个我不理解的行为。根据这三种补全的情况,这是我的理解:


$

行首 --> 使用complete -E --> 如果不存在,则使用complete -D --> 如果不存在,则使用默认的Bash补全 --> 行上没有单词 --> 使用命令补全。


$com

尝试补全第一个单词 --> 使用命令补全。


$command argu

行上至少有一个单词 --> 尝试补全一个参数 --> 使用给定命令的complete --> 如果不存在,则使用complete -D --> 如果不存在,则使用默认的Bash补全 --> 行上已经至少有一个单词,所以不使用命令补全 --> 不以$~@开头,所以执行文件名补全。


我的问题是,为什么在这种情况下,即使行上还没有单词,却执行了文件名补全而不是命令补全:

$

更令人困惑的是,下面的命令补全按预期执行:

$com

我很可能误解了手册,对于任何解释,我将非常感激。


注意:

$表示提示符,而不是字面的美元符号。

0
0 Comments

在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尝试自动补全文件名。希望这能给你一些指导 🙂

0