我有 Linux (Suse) 机器的用户访问权限(无根),我在其中开发了一些 bash 脚本和相应的 bash 自动完成规则。
由于脚本只属于我的用户,因此我只需要对我“有效”的完整规则(部分原因是我没有根写入权限),将我的 bash_completion 脚本放入/etc/bash_completion.d/
文件夹不是一个选项。
目前我命名了我的文件.bash_completion.myscript
并直接从我的源文件中获取它.bashrc
,但我只是想知道是否有任何其他“标准”方法来实现这些结果,已经在 bash 实现中考虑过。
例如,创建一个文件夹/home/myuser/.bash_completion.d/
?
对于非 XDG 环境和 bash-completion <= 2.8
以下是本地用户如何拥有工作
~/.bash_completion.d/
目录。nano ~/.bash_completion
,添加以下内容:mkdir ~/.bash_completion.d
~/.bash_completion.d/myscript
,添加以下内容:. ~/.bash_completion
预计空 ~/.bash_completion.d/ 目录
如果您预计会有一个空
~/.bash_completion.d/
目录,并且希望避免看到错误消息bash: /home/<username>/.bash_completion.d/*: No such file or directory
,请添加一个文件类型测试[ -f "$bcfile" ]
。对于 XDG 环境和 bash-completion <= version 2.8
(要查看您的版本
rpm -qa | grep bash-completion
:)注意bash-completion 2.8 README文档仍然推荐
~/.bash_completion
,见https://github.com/scop/bash-completion/tree/2.8你知道你的 linux 环境是 XDG 如果
xdg-usr-dir
命令存在并返回你的主目录,你的环境变量包括XDG_*
; 执行:env | grep XDG
.对于 XDG 环境 & bash-completion >= version 2.9
根据从 2.9 版https://github.com/scop/bash-completion/tree/2.9(2019年 4 月 27 日)开始的 bash-completion 自述文件,现在可以识别一个工作的本地用户 bash_completion 目录。此外,以前的几个版本已经支持备用 bash_completion 配置文件。
~/.bash_completion.d
->${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion
~/.bash_completion
->${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion
要使用此配置实施,请使用
$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。
使用
~/.bash_completion
文件。来自Bash Completion FAQ:
常见问题已更新。现在有一个用于本地完成的标准位置。
~/.local/share/bash-completion/completions
(或$XDG_DATA_HOME/bash-completion/completions
)处创建一个目录。请注意,完成文件应与为其提供完成的命令同名。(例如,完成文件
git
应称为“git”。)至少 bash-completion 2.8 及更高版本启用将本地 Bash 完成放在目录中的选项
完成文件名或符号链接名必须与各自的命令名相匹配。这些完成仅按需加载。始终加载存储在文件 中的补全。
~/.bash_completion
参考:参见“Q. 我应该在哪里安装我自己的本地补全?” 在https://github.com/scop/bash-completion/blob/master/README.md
一个更简单的解决方案是使用 nullglob 选项。虽然这不可移植,但 bash 补全也不可移植。所以便携性并不重要。
此外,您需要在采购时对变量使用引号。这处理文件包含空格和其他特殊字符的情况。
Russell E Glaue的回答很好,但
~/.bash_completion
不完整。问题是什么时候
~/.bash_completion.d/
为空并随后for f in ~/.bash_completion.d/*
打印以下错误消息:最简单、可移植的解决方案是在目录为空时跳过循环: