2014-11-20 3 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' помочь? Кроме того, установка таких переменных, как это, истекает в основной сеанс оболочки, не так ли? –

ответ

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 
} 
Смежные вопросы