在哪里安装树外包的 bash 完成脚本?

在哪里安装树外包的 bash 完成脚本?

我正在安装ripgrep在Ubuntu上。它不存在于官方存储库或私有 PPA 上,因此我按照项目的说明将其安装为树外包:https://github.com/BurntSushi/ripgrep#installation

我设法了解到这些包应该存在于/usr/local

  • /usr/local/bin对于二进制文件
  • /usr/local/share/doc/<package_name>用于文档
  • /usr/local/share/man用于手册页

bash 完成怎么样?据我所知,这比其他类别稍微不太标准化,并且可能特定于每个Bash安装。在Ubuntu下有什么方法可以做到这一点?

答案1

根据我在大量阅读后收集到的信息,特别是他们的官方文档/usr/share/doc/bash-completion/README.Debian、 以及来源​​本身:

  • /etc/bash_completion.d/是个遗产dir,完成的位置热切地已加载,即在主脚本运行时立即获取所有内容。只有少数软件包仍然安装在那里,大多数已经迁移到新标准。

  • /usr/share/bash-completion/completions/是完成文件的目录动态加载一经请求经过bash-completion。他们只是来源什么时候需要(而且,最重要的是,如果需要),通过不加载您永远不会使用的命令的无数补全来节省大量资源。


关于您的这条评论/etc

它将与 apt 控制的包混合在一起......我希望有一个单独的路径

处的文件/etc并不完全“易于控制”,至少不是以相同的方式/usr/bin/usr/share方式。[1]他们是配置文件,他们是意思是由本地管理员(您)修改。包在安装时创建它们,通常包含默认值,然后您应该根据需要修改它们。

有些软件包更进一步简化了维护,而不是(或与配置一起)文件他们还创建一个(空)配置目录对于“直接插入”,需要额外的自定义文件。所以而不是修改一个配置文件来更改某些设置,这是一项困难且容易出错的任务,使用grepsed和等工具awk,您只需创造(或删除)覆盖所需设置的“配置片段”文件。

查看/etc/{,*/}*.d/系统中的所有目录。您的软件包是否想要安装自定义存储库,例如 Google Chrome?不要编辑/etc/apt/sources.list,将文件拖放到/etc/apt/sources.list.d/。新服务?/etc/systemd/system/。系统设置?/etc/sysctl.d/(顺便说一句,请参阅其自述文件)。

容易多了,而且不再踩对方的脚趾。

中的某些目录的/usr/share行为也类似于:您的.desktop文件转到/usr/share/applications/,新的 mimetype 转到/usr/share/mime/packages/,等等。不同的/etc是,你,管理员,不应该调整也不删除您没有自己创建/安装的文件。

情况正是如此/usr/share/bash-completion/completions/


也就是说,我有好消息和坏消息要告诉你:

坏消息是...如果您想安装在他们的 github 存储库中完成,这不是 bash 完成,而是zsh完成文件!不,bash 和 zsh 是完全地关于完成情况不兼容。

别担心,因为好消息是:ripgrep在 apt 存储库上可用从 Ubuntu 18.10 开始!耶! :D

sudo apt install ripgrep

你猜怎么着?它包含一个bash补全文件!当然是安装在/usr/share/bash-completion/completions/rg.

是时候高兴了,朋友!


[1]: 说实话,你可以说他们“很贴切”被监控“,不受控制。阅读关于 conffiles 您需要了解的一切:由 dpkg 管理的配置文件更多细节。

答案2

根据常见问题手册~/.local/share/bash-completion/completions/,如果是您自己的本地补全,则通常应该将补全文件放入其中。如果该目录不存在,您mkdir -p当然可以使用它。

将它们放入completions子目录$BASH_COMPLETION_USER_DIR(默认为$XDG_DATA_HOME/bash-completion~/.local/share/bash-completion如果$XDG_DATA_HOME未设置),则在完成相应命令时根据需要自动加载它们。

文件名是有意义的。

完成文件名命令foo在此目录中应该是foo, 或者foo.bash。 (下划线前缀 _foo 也可以工作,但保留用于 bash 完成内部用作弃用/后备标记。)

答案3

发行版补全脚本通常会加载用户补全(如果找到)。例如在 Ubuntu 上,/etc/bash_completion来源/usr/share/bash-completion/bash_completion.. 和~/.ssh/..从和获取脚本~/.bash_completion(在我的例子中是 resources ~/local/etc/bash_completion.d/*)。

所以如果你有~/.bash_completion这样的设置(参见https://stackoverflow.com/a/12426672/274318对于获取目录中所有文件的方法),您可以将ripgrep完成安装到本地完成目录。

答案4

我想补充一点,虽然很大程度上没有记录,但/usr/local/share/bash-completion/completions也加载了脚本。看这个问题。我也亲自用 和 进行了测试和RHEL8验证Bash 4.4.20

因此,如果您在本地安装软件/usr/local/bin,这可能是您想要放置完成脚本的位置(而不是/usr/share/bash-completion/completions由包管理器管理的 )。

默认情况下该目录可能不存在,因此只需创建它:

mkdir -p /usr/local/share/bash-completion/completions

将脚本放入其中并重新启动 shell 后,您的自定义完成应该可以工作,而不需要额外的配置。

相关内容