我有 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
文件。
问:如何插入我自己的本地完成内容,而不必在
每次发布新版本时重新插入它们?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/
目录的示例。
- 编辑文件:
nano ~/.bash_completion
,添加以下内容:
for bcfile in ~/.bash_completion.d/* ; do . $bcfile done
- 创建目录:
mkdir ~/.bash_completion.d
- 编辑文件:
~/.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
- 源.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,我们的主脚本会立即加载它。
- 如果不存在,则在
~/.local/share/bash-completion/completions
(或$XDG_DATA_HOME/bash-completion/completions
)创建一个目录。
$ mkdir -p ~/.local/share/bash-completion/completions
- 将您完成的内容放入新目录中。
$ 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