我正在安装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]他们是配置文件,他们是意思是由本地管理员(您)修改。包在安装时创建它们,通常包含默认值,然后您应该根据需要修改它们。
有些软件包更进一步简化了维护,而不是(或与配置一起)文件他们还创建一个(空)配置目录对于“直接插入”,需要额外的自定义文件。所以而不是修改一个配置文件来更改某些设置,这是一项困难且容易出错的任务,使用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 是完全地关于完成情况不兼容。
别担心,因为好消息是: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 后,您的自定义完成应该可以工作,而不需要额外的配置。