我正在为命令行工具编写bash完成脚本:
_plink()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--1 --23file --a1-allele --a2-allele --adjust --aec"
if [[ ${cur} == --*file ]] || [[ ${cur} == --out ]]; then
COMPREPLY=( $(compgen -W "$(ls)" -- ${cur}) )
elif [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _plink plink1.9
我们的想法是,在选项--*file
和--out
之后,bash应该自动填充文件路径。
现在我正在使用" $(ls)
"它只完成当前工作路径中的文件名。有什么建议吗?
答案 0 :(得分:8)
您可以使用compgen -f
完成文件名,如下所示:
if [[ ${prev} == --*file ]] || [[ ${prev} == --out ]]; then
COMPREPLY=( $(compgen -f -- ${cur}) )
elif ...
但是,compgen -f
在完成文件名时并不是很好,因为它不会尊重文件名中的空格。
更好的方法是使用bash-completion-lib中提供的_filedir
功能。它可能已经在您的系统上可用(键入:declare -f _filedir
来检查)。
使用_filedir
,您的完成功能变为:
if [[ ${prev} == --*file ]] || [[ ${prev} == --out ]]; then
_filedir
elif ...
答案 1 :(得分:0)
或者,如果您没有bash-completion-lib,我查看了_filedir()函数的source ,并且能够使用comptopt -o
和{{1}完成bash的完整搜索}}:
compgen -f
但是,您没有得到_filedir()提供的解析〜用户名或不区分大小写的功能。