如何实现Bash补全:匹配显示名称,选中插入关联ID
实现Bash命令补全:显示名称候选,选中后插入对应ID
要实现你描述的功能,我们可以利用Bash的可编程补全特性,自定义补全函数来关联名称与ID,控制补全时的显示内容和最终插入的文本。
步骤1:定义名称与ID的映射
首先用Bash关联数组存储名称到ID的对应关系:
declare -A name_id_map=( ["Barbara"]=1 ["Bart"]=2 ["Bob"]=3 )
步骤2:编写自定义补全函数
这个函数会处理补全逻辑:匹配输入前缀生成名称候选,唯一匹配时直接返回ID,多匹配时显示名称并补全公共前缀。
_example_completion() { # 获取当前命令行中待补全的词 local cur="${COMP_WORDS[COMP_CWORD]}" # 生成匹配当前输入的名称列表 local matches=($(compgen -W "${!name_id_map[*]}" -- "$cur")) if [[ ${#matches[@]} -eq 1 ]]; then # 唯一匹配:返回对应的ID作为补全结果 COMPREPLY=("${name_id_map[${matches[0]}]}") else # 多匹配:先返回所有匹配的名称用于显示 COMPREPLY=("${matches[@]}") # 计算并补全最长公共前缀 local common_prefix=$(printf "%s\n" "${matches[@]}" | awk ' NR==1 {prefix=$0; next} { for(i=1; i<=length(prefix); i++) { if(substr($0,i,1) != substr(prefix,i,1)) { prefix=substr(prefix,1,i-1); break } } } END {print prefix} ') # 如果公共前缀不等于当前输入,替换补全结果为公共前缀 if [[ -n "$common_prefix" && "$common_prefix" != "$cur" ]]; then COMPREPLY=("$common_prefix") fi fi }
步骤3:绑定补全函数到目标命令
将上面的函数绑定到example命令,让Bash在补全该命令时调用这个函数:
complete -F _example_completion example
测试场景验证
- 输入
example B按Tab:会列出所有以B开头的名称候选:Barbara Bart Bob - 输入
example Ba按Tab:匹配到Barbara和Bart,自动补全最长公共前缀Bar,命令行变为example Bar,同时显示两个候选 - 输入
example Bo按Tab:唯一匹配Bob,直接插入对应ID3,命令行变为example 3
适配menu-complete模式
如果你用bind 'TAB:menu-complete'开启循环补全模式:
- 输入
example B后按Tab,会循环选择Barbara、Bart、Bob,选中后命令行会先显示名称 - 再次按Tab,由于名称是完全匹配项,补全函数会自动将其替换为对应的ID(比如选中
Barbara后再按Tab,命令行变为example 1)
内容的提问来源于stack exchange,提问作者XDR
相关产品推荐
相关产品推荐

