如何使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会话中,不是吗?