为什么“ $ <space> <tab> <tab>”执行文件名完成?

时间:2018-06-24 19:28:37

标签: bash tab-completion bash-completion

在尝试配置可编程完成时,我遇到了一个我不了解的行为。

鉴于这三种完成方案,这是我对它们的理解方式:


$<TAB><TAB>

该行的开头->使用complete -E->如果不存在,请使用complete -D->如果它不存在,请使用默认的Bash补全->行上没有单词->使用命令完成。


$com<TAB><TAB>

尝试完成第一个单词->使用命令完成。


$command argu<TAB><TAB>

行上至少有一个单词->试图完成一个参数->给定的 command 使用complete->如果不存在,使用complete -D->如果不存在,请使用默认的Bash补全->行上至少已经有一个单词,因此请不要使用命令补全->不能以{开头{1}},$~,请执行文件名补全。


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

@

更令人困惑的是,以下命令的完成是按预期执行的:

$<SPACE><TAB><TAB>

我很可能会误解本手册,对于任何解释我将不胜感激。


注意:  $<SPACE>com<TAB><TAB> 表示提示,而不是字面的美元符号。

1 个答案:

答案 0 :(得分:2)

当Bash Shell中的一行以空白开头时,这告诉Shell该命令不应进入命令历史记录。可以通过在HISTCONTROL.bashrc或您想要的任何文件中设置.profile env变量进行配置,这应该是默认行为(另请参见How to prevent commands to show up in bash history?)。

因此,当该行的前导空格为空白时,命令执行是相同的,只是该命令不会进入历史记录。因此,代码完成的行为也相同。