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: 列出所有已定义的变量。-Aaction: 通过标准动作生成补全,如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 可高效生成精确的补全候选集,是构建强大命令行工具的底层基础。
3260

被折叠的 条评论
为什么被折叠?



