用户定义的 bash_completion.d 脚本的标准位置?

Car*_*ala 68 bash bashrc user-profile

我有用户访问权限(无 root)到 Linux (Suse) 机器,我在那里开发了一些 bash 脚本和相应的 bash 自动完成规则。

由于脚本仅属于我的用户,因此我只需要对我来说“活动”的完整规则(部分原因是我没有 root 写入权限),将我的 bash_completion 脚本放入/etc/bash_completion.d/文件夹不是一个选项。

目前我命名我的文件.bash_completion.myscript并直接从我的.bashrc.

例如,创建一个文件夹/home/myuser/.bash_completion.d/

Rus*_*aue 64

对于非 XDG 环境和 bash-completion <= 2.8

以下是本地用户如何拥有工作~/.bash_completion.d/目录。

  1. 编辑文件:nano ~/.bash_completion,添加以下内容:
for bcfile in ~/.bash_completion.d/* ; do
  . $bcfile
done
Run Code Online (Sandbox Code Playgroud)
  1. 制作目录: mkdir ~/.bash_completion.d
  2. 编辑文件:~/.bash_completion.d/myscript,添加以下内容:
_myscript_tab_complete () {
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    words="-f -h --etc"

    COMPREPLY=( $(compgen -W "${words}" -- ${cur}) )
    return 0
}
complete -F _myscript_tab_complete myscript
Run Code Online (Sandbox Code Playgroud)
  1. 源.bash_completion: . ~/.bash_completion

预计空 ~/.bash_completion.d/ 目录

如果您预计会有一个空~/.bash_completion.d/目录,并希望避免看到错误消息bash: /home/<username>/.bash_completion.d/*: No such file or directory,请添加一个带有[ -f "$bcfile" ].

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done
Run Code Online (Sandbox Code Playgroud)

对于 XDG 环境和 bash-completion <= 2.8 版

(要查看版本:rpm -qa | grep bash-completion

请注意,bash-completion 2.8 README 文档仍然推荐~/.bash_completion,请参阅https://github.com/scop/bash-completion/tree/2.8

如果xdg-usr-dir命令存在并返回您的主目录,您知道您的 linux 环境是 XDG ,并且您的环境变量包括XDG_*;执行:env | grep XDG

对于 XDG 环境和 bash-completion >= 2.9 版

根据从 2.9 版https://github.com/scop/bash-completion/tree/2.9(2019 年4 月 27 日)开始的 bash-completion README ,现在可以识别工作本地用户 bash_completion 目录。此外,多个先前版本已支持备用 bash_completion 配置文件。

  • ~/.bash_completion.d -> ${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion
  • ~/.bash_completion -> ${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion

要使用此配置实施,请使用上面的步骤 3,4 完成前面的步骤$XDG_DATA_HOME/bash-completion- 您不应$XDG_CONFIG_HOME/bash_completion按照步骤 1 中的描述进行修改,但您可能需要创建$XDG_DATA_HOME/bash-completion目录。

注意:从 CentOS 8.2 和 Fedora 32 开始,安装了 bash-completion <= 2.8。


Den*_*son 43

使用~/.bash_completion文件。

来自Bash 完成常见问题解答

问:如何在
每次发布新版本时插入我自己的本地完成而不必重新插入它们?

A. 将它们放在 ~/.bash_completion 中,在
主完成脚本的末尾解析。另请参阅下一个问题。

问:我创作/维护包 X 并希望
为这个包维护我自己的完成代码。我应该把它放在哪里以确保
交互式 bash shell 会找到它并获取它?

A. 将其安装在
bash-completion 的 pkgconfig 文件变量指向的目录之一中。有两种
选择:推荐的一种是“completionsdir”(通过
“pkg-config --variable=completionsdir bash-completion”获取),
根据调用的命令的名称按需加载完成,
因此请确保命名您的相应地完成文件,并包括
例如符号链接,以防文件
为多个命令提供完成。出于
向后兼容性原因而存在的另一个是“compatdir”(使用
“pkg-config --variable=compatdir bash-completion”获取它)

  • 可能要指定`.bash_completion` 是一个文件而不是一个目录。由于`bash_completion.d` 是一个目录,我假设我可以只`scp` 我的本地`bash_completion.d` 并在远程服务器上重命名它,但在下次登录时它告诉我它必须是一个文件。 (4认同)
  • @NobleUplift [Bash 完成常见问题解答](https://github.com/scop/bash-completion/blob/master/README.md) 已更改,现在包含有关根据需要从目录加载用户的 Bash 完成的方法的信息. 这似乎至少适用于 bash-completion 版本 2.8,但不适用于 2.1。目录中的文件应该与它们所使用的命令完全一样命名,或者可以为此使用符号链接。 (3认同)
  • 虽然由于“/usr/share/bash-completion/bash_completion”中的向后兼容性,这个答案仍然有效,但它已被弃用,以支持[这个答案](https://serverfault.com/a/1013395/102407),其中命令“myscript”的自动完成脚本将保存到“~/.local/share/bash-completion/completions/myscript”(尾部也可以是“myscript.bash”或“_myscript”)。这样你的脚本就被组织起来并且只能动态加载。 (2认同)

小智 9

FAQ已更新。现在有一个用于本地完成的标准位置。

问:我应该在哪里安装我自己的本地完成?

A. 将它们放在 $BASH_COMPLETION_USER_DIR 的完成子目录中(默认为 $XDG_DATA_HOME/bash-completion 或 ~/.local/share/bash-completion 如果未设置 $XDG_DATA_HOME)以按需加载它们。有关这些文件名称的注意事项,另请参阅下一个问题的答案,它们也适用于此处。或者,您可以直接在 ~/.bash_completion 中编写它们,它由我们的主脚本急切加载。

  1. 如果它不存在,则在~/.local/share/bash-completion/completions(或$XDG_DATA_HOME/bash-completion/completions)处创建一个目录。
$ mkdir -p ~/.local/share/bash-completion/completions
Run Code Online (Sandbox Code Playgroud)
  1. 将您的完成放在新目录中。
$ cp <your_completions_file> ~/.local/share/bash-completion/completions
Run Code Online (Sandbox Code Playgroud)

请注意,完成文件应与它为其提供完成的命令具有相同的名称。(例如,完成文件git应称为“git”。)


小智 6

一个更简单的解决方案是使用 nullglob 选项。虽然这不可移植,但 bash 补全也不可移植。所以便携性并不重要。

另外,在采购时您需要在变量周围使用引号。这可以处理文件包含空格和其他特殊字符的情况。

shopt -s nullglob

for f in ~/.bash_completion.d/*; do
  [ -f "$f" ] && . "$f"
done
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,有关所显示内容(即“nullglob”)的解释(或链接到文档)对读者很有帮助。 (2认同)

jar*_*rno 5

至少 bash-completion 2.8 及更高版本启用选项将本地 Bash 完成放在目录中

${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions
Run Code Online (Sandbox Code Playgroud)

完成文件名或符号链接名必须与相应的命令名匹配。这些完成仅按需加载。存储在文件 ~/.bash_completion中的完成总是被加载。

参考:请参阅“Q. 我应该在哪里安装我自己的本地完成?” 在https://github.com/scop/bash-completion/blob/master/README.md

  • 请注意,“~/.bash_completion”也可以使用“$BASH_COMPLETION_USER_FILE”进行配置 (2认同)