簡體   English   中英

bash 自動完成不在 PATH 中的二進制文件

[英]bash auto complete binary file which is not in PATH

我正在嘗試在我的 CLI package 上制作自定義 bash 自動完成腳本。

當我像下面這樣安裝我的 package 時,我的命令安裝在 $PATH (/usr/local/bin) 中,

$ ./configure
$ make
$ sudo make install

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

但是,當我在本地安裝 package 時,然后嘗試從安裝位置執行二進制文件,如下所示,

$ ./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來做到這一點嗎?

+

在本地安裝 package,而不是添加 PATH 不是一個選項,因為我想讓這個 bash 自動完成功能不管安裝位置。 我想在安裝點使用此功能。

文檔中,除非使用“智能”完成加載器,否則這是不可能的:

首先,識別命令名稱。 [...] 如果命令詞是完整路徑名,則首先搜索完整路徑名的 compspec。 如果未找到完整路徑名的 compspec,則嘗試為最后一個 slash 后面的部分查找 compspec

我強調(或粗體)應該適用的部分: bash 將能夠完成完整路徑(例如: /usr/mycommand甚至./mycommand )但它無法解析mycommand除非它是在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM