Bash
未知命令名稱的 Bash 補全(具有通用前綴)
我處於需要為一系列應用程序設置 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
命令的完成。:-)