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

如何使bash完成忽略某些目录?,bash,autocomplete,Bash,Autocomplete,我正在尝试编写一个完成函数,该函数忽略以*.bak结尾的文件名以及名为backup的目录。除此之外,它还应该像默认的Readline完成一样工作(例如用于ls命令的完成)。这是我的第一次尝试: $ cat setup.sh _compTest() { local cur FIGNORE='bak:backup' cur="${COMP_WORDS[$COMP_CWORD]}" compopt -o filenames COMPREPLY=( $(compg

我正在尝试编写一个完成函数,该函数忽略以
*.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>
aaa美元
我得到了一个完成列表,不包括
*.bak
文件,但不幸的是没有
备份
目录


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

这可以通过对
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
}

GLOBIGNORE=backup
是否有帮助?同样设置这些变量也会渗入到主shell会话中,不是吗?