bash默认情况下是否在/usr/local/etc/bash_completion.d中提供bash完成文件?

时间:2019-05-31 05:14:14

标签: bash bash-completion

我在

中有一堆bash完成文件

/usr/local/etc/bash_completion.d

其中的大多数脚本在其底部都具有以下内容:

complete -F _tmux tmux

以上是针对tmux的。

我的问题是-默认情况下,这些文件看起来不像bash吗? 我在网上看到一些有关执行以下操作的说明:

for f in '/usr/local/etc/bash_completion.d/'*; do
   source "$f"
done;

我需要手动执行此操作吗,还是bash应该立即执行此操作?

1 个答案:

答案 0 :(得分:2)

这取决于您的平台和/或 bash 和 bash-completion 的版本。例如:

Ubuntu

在 Ubuntu 20.04 上,文件 /etc/bash_completion 执行以下操作:

. /usr/share/bash-completion/bash_completion

在那个文件中我找到

for dir in ${XDG_DATA_DIRS:-/usr/local/share:/usr/share}; do
    dirs+=( $dir/bash-completion/completions )
done

这表明 /usr/local/share/bash-completion/completions 扫描完成脚本。实证实验支持这一点。

MacOS/Brew

我在 MacOS 11.2.3 上的 /etc/usr/share 中找不到任何有关 bash 补全的信息。这表明裸达尔文没有 bash 完成,这是有道理的,因为 Apple 由于许可而将 Bash 保留在 3.2。可能有 zsh,不过,我没看。

您引用的

/usr/local/etc/bash-completion.d/usr/local 下 Homebrew 安装的一部分。在那里我找到了一些完成脚本,但没有找到激活脚本。您不必自己明确激活这些。

我确实从 /usr/local/share/bash-completion 中找到了 Homebrew,它有脚本 bash_completion。其中与 Ubuntu 相同,这也是有道理的,因为 Homebrew 是一个完整的“GNU”,但在 /usr/local 之下。但它也引用了目录 /usr/local/etc/bash-completion.d。 Sourcing /usr/local/share/bash-completion/bash_completion 也从该目录添加了完成。

但是 /usr/local/share/bash-completion/bash_completion 默认不会执行,因此您必须将其添加到 ~/bash_profile~/profile 中,如 here 所述。它还描述了如何处理 zshfish

Cygwin

Cygwin 是另一个具有 bash 补全功能的 Posix 兼容环境。 (不过,我还没有检查 bash 补全是否属于 Posix 标准的一部分)安装 bash-completion 软件包后,Ubuntu 和 Homebrew 就有了 /usr/share/bash-completion/bash_completion。这里没有 /etc/bash_completion 并且因为我(很久以前生成)的 ~/.bashrc 只寻找这个补全没有被激活。

总结

许多类似 GNU 的环境都支持 bash_completion,但您可能必须

  • 安装软件包
  • 确保它在您登录时是来源的,默认情况下并非总是如此

如果它在您的环境中默认未激活,您可以通过从您的 {{1 }}、/etc 或类似内容。

我猜测 YMMV 适用于所有其他可能的平台(其他 Linux 发行版、MSYS2 等),但以上内容可能会帮助您弄清楚如何启用完成。这在可用时真的很有帮助。