我正在尝试为我自己的命令集开发自动完成或制表符完整功能.
例如,假设foo是我的二进制文件:
CLI>> foo [TAB] [TAB]
Run Code Online (Sandbox Code Playgroud)
它应该显示主要命令configure
和show
.
然后如果我选择configure
,它应该显示子命令CM
,DSP
并且NPU
:
CLI>> foo configure [TAB] [TAB]
DSP NPU CM`
Run Code Online (Sandbox Code Playgroud)
我只知道如何完成并显示第一级 - 如何获得第二级?
我会把它放进去/etc/completion.d
.
我的代码:
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
words=("${COMP_WORDS[@]}")
cword=$COMP_CWORD
opts="configure show"
}
Run Code Online (Sandbox Code Playgroud)
我很卡如何添加子命令CM
DSP
NPU
下configure
.
在编写bash脚本时,我喜欢编写自包含函数,这些函数接受参数并基于那些/那些参数执行操作,而不是在代码中的几个不同位置声明全局变量,从而降低可读性.
当您有一个需要使用多个变量的函数时,就会出现问题.将10个变量之类的函数传递给函数只是简单的丑陋,因此可以使用简单的关联数组.
如果我们想在外部文件上声明这些变量,那么"source"命令允许您将它们全部导入.
然后问题变成了,如何列出在此文件中仅声明的变量,以便我可以用它们构建我的关联数组?我已经能够使用"compgen"和循环的组合来构建变量列表中的关联数组,但是如何只列出文件中找到的变量,无论它们被调用什么,所以我可以循环他们并建立我的阵列?
我想以编程方式获取 Windows 命令提示符 ( cmd.exe
)中所有可用命令的列表。compgen -c
在 Bash 中是否有类似的东西,但对于 Windows?
compgen -d -- $cur
将建议仅对 pwd 中的目录进行补全吗?
我可以让它在另一个目录中建议某些目录的目录完成吗?
例如。如果我在/curr_dir
,并且我想为/other_dir
我做什么生成目录完成?我如何指定它compgen
,这样我就不需要去/other_dir
在我的 bash-completion 函数中,我尝试cd
在调用之前对该目录执行 a操作,compgen
但是在按下<Tab>
.
我是新手compgen
,想将它用于我正在编写的脚本。该脚本可以将“命令”和“选项”作为参数,如下所示:
script add "value"
script --path "/a/file/path" add "value"
# and others
Run Code Online (Sandbox Code Playgroud)
我写了一个完成脚本,如下所示:
_script_completions() {
arg_index="${COMP_CWORD}"
if [[ "${arg_index}" -eq 1 ]]; then
COMPREPLY=($(compgen -W "--path add" "${COMP_WORDS[1]}"))
fi
}
complete -F _script_completions script
Run Code Online (Sandbox Code Playgroud)
该脚本对于“add”命令运行良好,但在“--path”选项上失败。例如:当我输入:
$ script --p<TAB>
Run Code Online (Sandbox Code Playgroud)
我得到:
$ ./script --pbash: compgen: --: invalid option
compgen: usage: compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [word]
Run Code Online (Sandbox Code Playgroud)
如何正确添加我自己的脚本选项的补全?