【问题标题】:bash auto complete binary file which is not in PATHbash 自动完成不在 PATH 中的二进制文件
【发布时间】:2021-05-18 11:05:13
【问题描述】:

我正在尝试在我的 CLI 包上制作自定义 bash 自动完成脚本。

当我像下面这样安装我的包时,我的命令安装在 $PATH (/usr/local/bin) 中,

$ ./configure
$ make
$ sudo make install

所以我的bash-autocomplete.sh 中的complete -o filenames -F _mycommand mycommand 可以正常工作。 (因为命令mycommand 在 $PATH (/usr/local/bin) 中

但是,当我在本地安装我的包,然后尝试从安装位置执行二进制文件时,如下所示,

$ ./configure --prefix=$HOME/usr
$ make
$ make install

complete -o filenames -F _mycommand mycommand 不起作用,因为操作系统不知道mycommand 的位置。

$ ~/uftrace$ $HOME/usr/bin/mycommand [TAB]
Command 'command' not found,

我的问题是这样的:

如何使用本地二进制文件创建 bash 补全功能? (不在 PATH 中) 我可以通过修复Makefileconfigurebash-autocomplete.sh 来做到这一点吗?

+

在本地安装包,而不是添加 PATH 不是一个选项,因为我想让这个 bash 自动完成功能不管安装位置。我想在安装点使用此功能。

【问题讨论】:

  • 请发帖minimal reproducible example。特别是,_mycommand 中的内容是什么?
  • @KangMinchul :complete 怎么可能知道,您将命令安装到了哪个目录?今天,你把它放到 ~/bin,明天可能放到 ~/local 或其他地方。
  • complete -o filenames -F _mycommand "$HOME"/usr/bin/mycommand?

标签: linux bash shell


【解决方案1】:

来自documentation,除非使用“智能”完成加载器,否则这是不可能的:

首先,识别命令名称。 [...] 如果命令字是完整路径名,则完整路径名的 compspec 是 首先搜索。 如果未找到完整路径名的 compspec,则 试图为决赛之后的部分寻找一个compspec 斜线

我强调(或粗体)应该适用的部分:bash 将能够完成完整路径(例如:/usr/mycommand 甚至 ./mycommand)但它无法解析 @987654325 @ 除非它在 ​​PATH 中找到并且某些完成可以解决问题。

最后,您可以注册一个完成加载器,例如查看命令(使用${1##*/} 获取基本名称):

_completion_loader() {
  if [[ "${1}" == mycommand || "${1##*/}" == mycommand ]]; then
    complete -o filenames -F _mycommand "$1"
    return 124
  fi
  return 1 # 
}
complete -D -F _completion_loader -o bashdefault -o default

我不会在 Linux 上这样做,因为 bash-completion 已经开始并自行提供完成:您可以检查 bash-completion 因为他们可能有办法处理您的完成,例如通过保存/etc/bash_completion.d/<yourcommand>.bash.

【讨论】:

    猜你喜欢
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2015-04-16
    • 2018-06-06
    相关资源
    最近更新 更多