自定义命令行补全机制的核心工具之compgen
compgen
是 Bash shell 的内置命令,主要用于生成可匹配的自动补全候选词。它是实现自定义命令行补全机制的核心工具之一,与 complete
和 compopt
命令协同工作。
以下是关于 compgen
命令的详细解析:
1. 核心功能
根据提供的选项(option
)生成与指定单词(word
)可能匹配的补全项,并将结果输出到标准输出(stdout)。它通常用于可编程补全函数中,动态生成补全建议列表。
2. 语法格式
compgen [option] [word]
option
: 指定补全的类型或范围(见下文“常用选项”)。word
: 可选参数,用于过滤生成的补全项。若指定,则仅显示与word
前缀匹配的条目。
3. 常用选项
以下选项用于限定生成补全项的类型:
-a
: 列出所有别名(aliases)。-b
: 列出所有内建命令(built-in commands)。-c
: 列出所有可执行命令(commands)。-d
: 列出当前目录下的子目录。-e
: 列出所有环境变量。-f
: 列出当前目录下的文件(包含隐藏文件)。-g
: 按模式(glob pattern)匹配文件(需搭配-G
指定模式)。-j
: 列出后台任务(jobs)。-k
: 列出所有 Shell 关键字(如if
,for
)。-s
: 列出所有服务(service,如 systemctl 管理的服务)。-u
: 列出系统用户。-v
: 列出所有已定义的变量。-A
action: 通过标准动作生成补全,如file
(文件)、directory
(目录)等(更高级用法)。
注意:
- 选项
-p
和-r
对compgen
无效(它们是complete
命令的专属选项)。- 使用
-F
(函数)或-C
(命令)时,相关 Shell 变量(如COMP_WORDS
,COMP_CWORD
)的值不会影响输出,仅保留占位作用。
4. 典型用法示例
列出所有可执行命令:
compgen -c
列出以 "systemd" 开头的命令:
compgen -c systemd
列出当前目录的
.txt
文件:compgen -G "*.txt"
列出所有系统用户:
compgen -u
列出所有环境变量(以 "HO" 开头):
compgen -v HO # 输出如 HOME、HOSTNAME
5. 在可编程补全中的应用
compgen
通常与 complete
结合,用于自定义命令的补全行为。例如,定义一个函数为脚本生成补全选项:
_mycommand_complete() {local current="${COMP_WORDS[COMP_CWORD]}"COMPREPLY=( $(compgen -W "start stop restart --help" -- "$current") )
}
complete -F _mycommand_complete mycommand
- 当用户输入
mycommand [TAB]
时,会显示start
,stop
,restart
,--help
作为补全候选词。
6. 重要说明
- 补全逻辑独立性:
compgen
生成补全项的规则与可编程补全函数直接生成的逻辑完全一致,但自身不依赖上下文变量值。 - 输出用途:结果需赋值给
COMPREPLY
数组(如上述示例),再由 Bash 的补全机制处理显示。
通过灵活组合选项与过滤词,compgen
可高效生成精确的补全候选集,是构建强大命令行工具的底层基础。