2014-11-20 210 views
2

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

$ 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目录?

+0

是否'GLOBIGNORE = backup'帮助吗?同样设置那些变量会流入主shell会话中,不是吗? – 2014-11-20 17:27:47

回答

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 
}