我有一个简单的bash_completion
代码。它唯一做的事情就是当我输入grcat
然后 时Tab,它会提供从/etc/grcat
.
_grcat() {
local word
COMPREPLY=()
if [ 1 -eq "$COMP_CWORD" ]; then
pushd /etc/grcat &>/dev/null || return 1
word="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=($(compgen -f "$word"))
popd &>/dev/null
fi
}
complete -F _grcat grcat
我需要修改它,以便它列出/etc/grcat
除 之外的所有文件/etc/grcat/README
。
我怎样才能bash_completion
忽略一个特定的文件?
答案1
您还可以使用-X
以下选项compgen
:
_grcat() {
local word
COMPREPLY=()
if [ 1 -eq "$COMP_CWORD" ]; then
pushd /etc/grcat &>/dev/null || return 1
word="${COMP_WORDS[COMP_CWORD]}"
local filterpat='README'
COMPREPLY=($(compgen -f -X "$filterpat" -- "$word"))
popd &>/dev/null
fi
}
complete -F _grcat grcat
compgen
接受大多数与complete
、-p
和相同的选项-r
。
compgen
还生成结果,将匹配写入标准输出。complete
仅存储规则以供将来使用。
答案2
从这里,我看到您正在寻找的变量是FIGNORE
。您可以执行以下操作:
export FIGNORE=$FIGNORE:/etc/grcat/README
看来您也可以使用Complete
命令来完成您想要做的事情。我看到有关Complete
命令使用的信息这里和这里。
您实际上可以尝试修改complete
脚本中的命令,例如,
complete -f -X '/etc/grcat/README' grcat
从 的手册页来看complete
,
-X filterpat filterpat 是用于文件名扩展的模式。它应用于由前面的选项和参数生成的可能完成列表,并且每个
与filterpat匹配的完成都将从列表中删除。领先!在filterpat中否定模式;在这种情况下,任何不匹配 filterpat 的补全都会被删除。