【问题标题】:Why does "$<space><tab><tab>" perform filename completion?为什么 "$<space><tab><tab>" 执行文件名完成?
【发布时间】:2018-06-24 19:28:36
【问题描述】:

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

鉴于这三个完成场景,我是这样理解它们的:


$<TAB><TAB>

行首 --> 使用complete -E --> 如果不存在,使用complete -D --> 如果不存在,使用默认Bash补全 --> 没有单词就行了 --> 使用命令完成。


$com<TAB><TAB>

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


$command argu<TAB><TAB>

行中至少有一个单词 --> 试图完成一个参数 --> 使用complete 作为给定的命令 --> 如果它不存在,使用@ 987654328@ --> 如果不存在,使用默认的 Bash 补全 --> 行中已经至少有一个单词所以不要使用命令补全 --> 不以$ 开头,@ 987654330@ 或 @ 所以执行文件名完成。


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

$<SPACE><TAB><TAB>

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

$<SPACE>com<TAB><TAB>

我很可能误解了手册,如果能得到任何解释,我将不胜感激。


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

【问题讨论】:

  • $ 文字(您手动输入的命令的一部分),还是仅使用它来表示命令行提示符?对我来说(使用bash-completion),文字$&lt;tab&gt;&lt;tab&gt; 显示了我可以完成的变量列表。 $&lt;space&gt;&lt;tab&gt;&lt;tab&gt; 假定 $ 是一个没有任何已知参数的命令,因此默认以文件名完成。
  • @AdamKatz 在那里表示提示。我明白为什么这可能会产生误导,并将相应地编辑问题。谢谢。
  • 输入complete -p会得到什么

标签: bash tab-completion bash-completion


【解决方案1】:

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

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

【讨论】:

  • 我不确定我是否理解,抱歉。所以因为有一个空格,完成不会处理命令,因为空格意味着你不希望它们出现在命令历史记录等中?还有,$&lt;SPACE&gt;com&lt;TAB&gt;&lt;TAB&gt; 怎么还有空间呢?
  • 我相信我稍微弄错了你的问题。也许这对您有更多帮助:unix.stackexchange.com/questions/205360/… 根据(2),您不在命令完成的上下文中(因为您还没有开始一个单词但已经输入了一个字符),因此 Bash 尝试自动完成文件名.希望这能给你一些指导:)
猜你喜欢
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多