我正在为命令行工具编写 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
and --out
,bash 应该自动补全文件路径。
现在我正在使用“$(ls)
" 这只完成当前工作路径中的文件名。有什么建议吗?
您可以使用compgen -f
完成文件名,如下所示:
if [[ ${prev} == --*file ]] || [[ ${prev} == --out ]]; then
COMPREPLY=( $(compgen -f -- ${cur}) )
elif ...
然而,compgen -f
不太擅长完成文件名,因为它不支持文件名中的空格。
更好的方法是使用_filedir
功能可用于bash 完成库 https://salsa.debian.org/debian/bash-completion。它可能已经在您的系统上可用(输入:declare -f _filedir
去检查)。
Using _filedir
,你的补全函数就变成:
if [[ ${prev} == --*file ]] || [[ ${prev} == --out ]]; then
_filedir
elif ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)