Bash完成脚本在某些参数选项后完成文件路径

Bash完成脚本在某些参数选项后完成文件路径,bash,shell,autocomplete,Bash,Shell,Autocomplete,我正在为命令行工具编写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 ]] || [[ $

我正在为命令行工具编写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)
”,它只完成当前工作路径中的文件名。有什么建议吗?

您可以使用
compgen-f
来完成文件名,如下所示:

if [[ ${prev} == --*file ]] || [[ ${prev} == --out ]]; then
    COMPREPLY=( $(compgen -f -- ${cur}) )
elif ...
但是,
compgen-f
不擅长完成文件名,因为它不尊重文件名中的空格

更好的方法是使用中提供的
\u filedir
功能。它可能已经在您的系统上可用(键入:
declare-f\u filedir
进行检查)

使用
\u filedir
,您的完成功能变为:

if [[ ${prev} == --*file ]] || [[ ${prev} == --out ]]; then
    _filedir
elif ...

或者,如果您没有,我查看了_filedir()函数的函数名,并且能够使用
comptopt-o
以及
compgen-f
获得完整的bash完成:

if [[ ${prev} == --*file ]] || [[ ${prev} == --out ]]; then
    comptopt -o filenames 2>/dev/null
    COMPREPLY=( $(compgen -f -- ${cur}) )
elif ...

但是,您没有获得_filedir()提供的解析~用户名或区分大小写的功能。

compgen-o filenames-G“$cur*”
一个小错误:
s/comptopt/compopt/