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

iva*_*van 3 bash autocomplete

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

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

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

vlink plug foo
Run Code Online (Sandbox Code Playgroud)

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

因为仅存在三个可能的命令(plug/ unplug/replug)和一组特定的第三个参数可能的目录名,我想为它提供了一些选项卡完成。

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

mur*_*uru 5

这可能有效:

_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
Run Code Online (Sandbox Code Playgroud)

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

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

所以,我们使用compgen

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

  • 这就是我的意思。那么命令没有独立的方法来设置自己的自动完成吗? (2认同)