Bash 补全

Bash里可以通过 Tab 补全命令以及相关的参数。

这篇总结是如何实现下面这个例子的:

>>> foo
alpha   number
>>> foo alpha
a  b  c
>>> foo number
1  2  3

代码

_foo()
{
    local cur prev opts
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="number alpha"

    case "${prev}" in
        number)
        COMPREPLY=( 1 2 3)
            return 0
            ;;
        alpha)
        COMPREPLY=( a b c )
            return 0
            ;;
        \*)
        ;;
    esac

    COMPREPLY=( $(compgen -W "${opts}" ${cur}) )
}
complete -F _foo foo

解释

  1. 实现补全不一定需要一个真实的命令。是字符串就行。

    下面这个话的意思是:使用 _foo函数 处理对 字符串foo 的补全

complete -F _foo foo
  1. 具体实现补全的是内置的compgen命令。

    -W 处理指定字符串,也有其他参数是针对文件、目录、函数和别名等等

    >>> compgen -W “11 12 21 22” 1
    11
    12
  2. COMPREPLY规定是一个数组。_foo通过它传递结果给背后的机制。

COMPREPLY=( $(compgen -W "${opts}" ${cur}) )
  1. COMP_WORDS和COMP_CWORD分别是目前命令行的所有单词和当前的索引。

    通过判断前个单词,可以实现不同选项对应不同参数的效果

cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"

补充

-o 是设置一些补齐选项。 default和bashdefault的意思是如果没有补齐内容产生,就使用默认的其他补齐。

>>> complete -o default -o bashdefault -F _autojump_files cp mv meld diff kdiff3

Table Of Contents

Previous topic

脚本片段记录

Next topic

Bash常识

This Page