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

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

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

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

此刻我命名了我的文件.bash_completion.myscript并直接从我的文件中获取它.bashrc,但我只是想知道是否有任何其他“标准”方法来实现这些结果,已经在 bash 实现中考虑过了。

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

答案1

使用~/.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 时从中加载
文件。

答案2

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

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

  1. 编辑文件:nano ~/.bash_completion,添加以下内容:
for bcfile in ~/.bash_completion.d/* ; do
  . $bcfile
done
  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
  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

适用于 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如果命令存在并返回您的主目录,并且您的环境变量包括XDG_*;执行:env | grep XDG,则您知道您的 linux 环境是 XDG。

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

根据 bash-completion 自述文件从 2.9 版开始https://github.com/scop/bash-completion/tree/2.9(2019 年 4 月 27 日) 现已识别出可用的本地用户 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。

答案3

常问问题已更新。现在有一个本地补全的标准位置。

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

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
  1. 将您完成的内容放入新目录中。
$ cp <your_completions_file> ~/.local/share/bash-completion/completions

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

答案4

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

此外,在获取变量时,您需要使用引号。这可以处理文件中有空格和其他特殊字符的情况。

shopt -s nullglob

for f in ~/.bash_completion.d/*; do
  [ -f "$f" ] && . "$f"
done

相关内容