如何为目录本地可执行文件提供 Bash 补全?

如何为目录本地可执行文件提供 Bash 补全?

我编写了一个 Bash 脚本来帮助我管理一些符号链接。它是一些的包装斯托命令。

当我调用它时,我向它传递两个命令行参数:一个命令 ( plug// )unplugreplug一个目录名称(只是它的基本名称,而不是路径)。

该脚本被称为vlink,因此调用将是,例如:

vlink plug foo

目录名称(foo在上面的示例中)需要是我的系统上其他位置的特定目录的子目录之一。

由于第三个参数只有三个可能的命令(plug/ unplug/ replug)和一组特定的可能目录名称,因此我想为其提供一些制表符完成功能。

我对编写 Bash 完成脚本有些熟悉,但是有没有办法为不在我的 $PATH 中且仅打算从其父目录运行的可执行文件提供完成命令?

答案1

这可能有效:

_vlink () {
    case $COMP_CWORD in
        1) COMPREPLY=( $(compgen -W "plug unplug replug" "$2") ) ;;
        2) local IFS=$'\n'
            COMPREPLY=( $(cd /some/dir && compgen -d "$2") ) ;;
    esac
}

complete -F _vlink vlink

替换/some/dir为包含感兴趣的子目录的目录。 (我假设您的目录名称中没有换行符。)

  • COMP_CWORD是正在完成的单词的索引(0 是命令名称)
  • 完成函数的第二个参数是正在完成的单词(第一个是命令名称,第三个是前一个单词)

所以,我们使用compgen

  • -W对于第一个参数,从, 和给出的单词列表中生成匹配的单词
  • 对于第二个参数,从相关目录生成匹配的目录名称。

相关内容