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/目录。
nano ~/.bash_completion,添加以下内容:Run Code Online (Sandbox Code Playgroud)for bcfile in ~/.bash_completion.d/* ; do . $bcfile done
mkdir ~/.bash_completion.d~/.bash_completion.d/myscript,添加以下内容:Run Code Online (Sandbox Code Playgroud)_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.d/ 目录
如果您预计会有一个空~/.bash_completion.d/目录,并希望避免看到错误消息bash: /home/<username>/.bash_completion.d/*: No such file or directory,请添加一个带有[ -f "$bcfile" ].
Run Code Online (Sandbox Code Playgroud)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命令存在并返回您的主目录,您知道您的 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文件。
问:如何在
每次发布新版本时插入我自己的本地完成而不必重新插入它们?A. 将它们放在 ~/.bash_completion 中,在
主完成脚本的末尾解析。另请参阅下一个问题。问:我创作/维护包 X 并希望
为这个包维护我自己的完成代码。我应该把它放在哪里以确保
交互式 bash shell 会找到它并获取它?A. 将其安装在
bash-completion 的 pkgconfig 文件变量指向的目录之一中。有两种
选择:推荐的一种是“completionsdir”(通过
“pkg-config --variable=completionsdir bash-completion”获取),
根据调用的命令的名称按需加载完成,
因此请确保命名您的相应地完成文件,并包括
例如符号链接,以防文件
为多个命令提供完成。出于
向后兼容性原因而存在的另一个是“compatdir”(使用
“pkg-config --variable=compatdir bash-completion”获取它)
小智 9
该FAQ已更新。现在有一个用于本地完成的标准位置。
问:我应该在哪里安装我自己的本地完成?
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
Run Code Online (Sandbox Code Playgroud)
$ 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)
至少 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