如何使bash完成忽略某些目录?

时间:2014-11-20 17:10:58

标签: bash autocomplete

我正在尝试编写一个忽略以*.bak结尾的文件名以及名为backup的目录的完成函数。除此之外,它应该像默认的Readline完成一样工作(例如用于ls命令的那个)。这是我的第一次尝试:

$ cat setup.sh
_compTest() {
    local cur
    FIGNORE='bak:backup'
    cur="${COMP_WORDS[$COMP_CWORD]}"
    compopt -o filenames
    COMPREPLY=( $(compgen -f "$cur") )
}

complete -F _compTest aaa

采购后:

$ . setup.sh

我可以输入

$ aaa <tab><tab>

我得到一个不包含*.bak个文件的完成列表,但遗憾的是不是backup个目录。

如何扩展此功能以从完成列表中排除backup目录?

1 个答案:

答案 0 :(得分:0)

这可以通过对compgen

返回的数组进行后处理来完成
_compTest() {
    local cur words
    cur="${COMP_WORDS[$COMP_CWORD]}"
    compopt -o filenames
    words=( $(compgen -f "$cur") )
    COMPREPLY=()
    for val in "${words[@]}" ; do
        name=$(basename "$val")
        if [[ $name == *.bak || $name == "backup" ]] ; then
            continue
        fi
        COMPREPLY+=( "$val" )
    done
}