2014-11-20 199 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 
}