![特定的 bash 完成文件在 /usr/share/bash-completion/completions 中不起作用,但在 /etc/bash_completion.d 中工作正常](https://linux22.com/image/210505/%E7%89%B9%E5%AE%9A%E7%9A%84%20bash%20%E5%AE%8C%E6%88%90%E6%96%87%E4%BB%B6%E5%9C%A8%20%2Fusr%2Fshare%2Fbash-completion%2Fcompletions%20%E4%B8%AD%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%8C%E4%BD%86%E5%9C%A8%20%2Fetc%2Fbash_completion.d%20%E4%B8%AD%E5%B7%A5%E4%BD%9C%E6%AD%A3%E5%B8%B8.png)
我有一个 git 存储库,其中保存了一些静态链接的二进制文件以及相关的 man 文件和 bash 完成文件,这些文件都是使用“安装”的GNU 斯托制作符号链接。
我之前已经将 bash 完成文件的符号链接放入,/etc/bash_completion.d
没有任何问题,但最近我开始将它们放入/usr/share/bash-completion/completions
,因为我认为这对它们来说是一个更正确的位置,因为二进制文件正在进入,/usr/local/bin
而 man 文件也在/usr/local/share/man
。
除了四个特定的 bash 完成文件之外,一切都像以前一样工作,当放置在这个新位置时,这些文件不再工作。这些都是:
fzf 的这两个:
我还有其他 20 个可以正常工作的 bash 补全文件。这些特定的 bash 完成文件是什么让它们在 in 时/etc/bash_completion.d
没有问题但在 时却不能工作/usr/share/bash-completion/completions
?
编辑:
他们也不在~/.local/share/bash-completion/completions
其中任何一个工作。
附加信息:
这些文件源自标准 Debian/Ubuntu.bashrc
系列:
# Enable programmable completion features
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
在这两个位置中,源不是目录中的内容,而是这两个文件:
/usr/share/bash-completion/bash_completion
如果 NOT ,则第二个文件仅指向第一个文件shopt -oq posix
。在我的设置上:
$ if ! shopt -oq posix; then echo "not posix"; fi
not posix
我想答案一定是在/usr/share/bash-completion/bash_completion。
更多的:
我尝试更换bash_completion
为最新版本,但这也不起作用。
https://github.com/scop/bash-completion
还..
这些文件放置在其中任何一个中都不起作用~/.local/share/bash-completion/completions
。
答案1
为了向后兼容,/etc/bash_completion.d
总是立即获取中的完成文件。另一方面,目录延迟地获取其中的脚本,也就是说,直到请求该命令的完成时才获取特定的完成文件bash_completion
。completions
源文件由其名称决定,因此它必须与您尝试获取补全的命令具有相同的名称。因此,例如,tmux.completion.bash
应该符号链接为completions/tmux
和 not completions/tmux.completion.bash
。
最后,当您将其他所有内容都放在 下时/usr/local
,请注意,您也可以将完成脚本放在那里:/usr/local/share/bash-completion/completions
。