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

Spi*_*dey 13 bash ubuntu autocomplete

我正在 Ubuntu 上安装ripgrep。它不存在于官方存储库或私人 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下有什么方法可以做到这一点?

Mes*_*ion 16

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

  • /etc/bash_completion.d/遗留目录,其中补全被急切地加载,即在主脚本运行时立即获取所有内容。只有少数软件包仍然安装在那里,大多数已经迁移到新标准。

  • /usr/share/bash-completion/completions/是按需动态加载的完成文件的目录bash-completion。它们仅在需要时才获取(最重要的是,如果需要的话),通过不加载您永远不会使用的命令的无数补全来节省大量资源。


关于您的这条评论/etc

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

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

有些软件包更进一步简化了维护,它们还为“插入”额外的自定义文件创建了一个(空)配置目录,而不是(或与)配置文件一起。因此,您只需创建(或删除)覆盖grep所需设置的“配置片段”文件,sed而不是使用 、 和 等工具修改配置文件来更改某些设置,这是一项困难且容易出错的任务。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在完成方面完全不兼容。

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

sudo apt install ripgrep
Run Code Online (Sandbox Code Playgroud)

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

是时候高兴了,朋友!


[1]:说实话,你可以说他们是“容易被监控”,而不是被控制。阅读您需要了解的有关 conffiles 的一切:由 dpkg 管理的配置文件以获取更多详细信息。


jin*_*ong 8

根据常见问题解答手册~/.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 完成内部用作弃用/后备标记。)