我正在 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 中执行此操作的方法是什么?
经过大量阅读后我可以收集到的信息,特别是他们的官方文档,
/usr/share/doc/bash-completion/README.Debian
以及来源本身:/etc/bash_completion.d/
是遗留目录,其中完成被急切地加载,即,当主脚本运行时,所有源一次。只有少数软件包仍然安装在那里,大多数已经迁移到新标准。/usr/share/bash-completion/completions/
是由.按需动态加载的完成文件的目录bash-completion
。它们仅在需要时提供(最重要的是,如果需要),通过不为您永远不会使用的命令加载大量完成来节省大量资源。关于你的这个评论
/etc
:文件
/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你猜怎么着?它包含一个bash 完成文件!当然,安装在
/usr/share/bash-completion/completions/rg
.是时候高兴了,伙计!
[1]:老实说,你可以说它们是“受监控的”,而不是受控制的。阅读您需要了解的关于 conffiles 的所有信息:由 dpkg 管理的配置文件以获取更多详细信息。
根据FAQ手册,你应该把完成文件放在
~/.local/share/bash-completion/completions/
你自己本地完成的情况下。如果该目录不存在,您mkdir -p
当然可以使用它。文件名是有意义的。
如果找到,发行版完成脚本通常会加载用户完成。例如在 Ubuntu 上,sources
/etc/bash_completion
../usr/share/bash-completion/bash_completion
并且从and获取脚本(在我的例子中是 source )。~/.ssh/..
~/.bash_completion
~/local/etc/bash_completion.d/*
因此,如果您进行
~/.bash_completion
了这样的设置(有关获取目录中所有文件的方法,请参阅https://stackoverflow.com/a/12426672/274318),您只需将ripgrep
完成安装到本地完成目录即可。我想补充一点,虽然大部分没有记录,但其中的脚本
/usr/local/share/bash-completion/completions
也被加载了。看到这个问题。RHEL8
我还亲自使用and进行了测试和验证Bash 4.4.20
。因此,如果您在 中本地安装软件
/usr/local/bin
,这可能是您想要放置完成脚本的位置(而不是/usr/share/bash-completion/completions
由包管理器管理的)。默认情况下,该目录可能不存在,因此只需创建它:
将脚本放入其中并重新启动 shell 后,您的自定义完成应该可以工作而无需额外配置。