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

mic*_*ckp 6 bash tab-completion bash-completion

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

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


$<TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

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


$com<TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

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


$command argu<TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

该行至少有一个单词 - >试图完成一个参数 - >使用complete给定的命令 - >如果它不存在,使用complete -D- >如果它不存在,使用默认的Bash完成 - >行上至少有一个单词,所以不要使用命令完成 - >不能启动$,~或者@执行文件名完成.


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

$<SPACE><TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

由于下面的命令完成按预期执行,因此更加令人困惑:

$<SPACE>com<TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

我很可能误解了手册,我会非常感谢任何解释.


注意: $表示提示,而不是文字美元符号.

Arn*_*ous 2

当 Bash shell 中的一行以空格开头时,这会告诉 shell 该命令不应进入命令历史记录。这可以通过HISTCONTROL在您的 或任何您想要的文件中设置 env 变量来配置.bashrc.profile并且应该是默认行为(另请参阅如何防止命令显示在 bash 历史记录中?)。

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

  • 我相信我有点误解了你的问题。也许这对您有更多帮助:https://unix.stackexchange.com/questions/205360/how-does-bash-auto-completion-work#205409 根据(2),您位于命令完成的上下文之外(因为你还没有开始一个单词但已经输入了一个字符),因此 Bash 尝试自动完成文件名。希望这能给您一些指导:) (2认同)