Bash

未知命令名稱的 Bash 補全(具有通用前綴)

  • April 29, 2022

我處於需要為一系列應用程序設置 bash 完成的情況,這些應用程序的二進製文件都以相同的前綴開頭——我們稱之為blargh…。我不知道也無法知道blargh*使用此完成程序的人將在他們的機器上擁有哪些應用程序(儘管在我的情況下,前綴足夠獨特,不會干擾其他命令的正常操作)。

也就是說,我想做一些類似的事情:

complete -F _function_name "blargh*" "./blargh*"

現在,我得到的是一個非常普通的完成程序:

# blargh-completions.bash

_blargh_completions () {
   COMPREPLY=...
}

_blargh_init_completions () {
   local blargh
   for blargh in blarghABC blarghXYZ blargh123 blarghXXX-debug blarghARGH ; do
       complete -F _blargh_completions "$blargh"
       complete -F _blargh_completions "./$blargh"
   done
}

_blargh_init_completions

我對應用程序名稱有一個不錯的初步猜測,但我仍然必須指示使用者仔細檢查腳本並for根據需要更新其本地副本的循環,這並不理想。

此外,我有點不清楚在哪里安裝處理多個程序的完成腳本。所有選項都有缺點:

  • 我可以把它放在compatdir中(例如/etc/bash_completion.d/):這讓腳本可以使用多個命令,但同時所有文件都建議這個位置已被棄用,不應使用。
  • 我可以把它放在completionsdir(例如/usr/share/bash-completion/completions/)中:除了腳本必須與這個目錄中的命令同名,所以我不知道如何讓它在這種情況下工作。
  • 我可以將它附加到使用者的~/.bash_completion文件中,除非自動更新/解除安裝變得困難。

所以我的問題是:我如何(如果可能的話)編寫和安裝一個適用於萬用字元名稱模式的完成腳本,比如blargh*在不提前知道確切的命令名稱的情況下?

不幸的是,該complete命令不支持命令名稱萬用字元/前綴。

但是,您可以引入一個名為的包裝函式blargh,它帶有一個後綴(我假設是一個子命令名稱),然後為它創建一個 bash 完成函式:


blargh() {
   command "blargh$@"
}

_blargh_completion() {
   ((COMP_CWORD >= 1)) || return
   local subcommand="${COMP_WORDS[1]}"
   if ((COMP_CWORD == 1)); then
       # ${subcommand} is a prefix
       # emit subcommand names that start with it
   else
       # complete arguments for the ${subcommand}
   fi
}

complete -F _blargh_completion blargh

這種方式,blarghcreate ...也可以呼叫 asblargh create ...並且後一種呼叫方式可以自動完成。然後可以將其放入,/usr/share/bash-completion/completions/blargh因為從技術上講,它是blargh命令的完成。:-)

引用自:https://unix.stackexchange.com/questions/625448