我编写了一个 Bash 脚本来帮助我管理一些符号链接。它是一些的包装斯托命令。
当我调用它时,我向它传递两个命令行参数:一个命令 ( plug
// )unplug
和replug
一个目录名称(只是它的基本名称,而不是路径)。
该脚本被称为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
对于第一个参数,从, 和给出的单词列表中生成匹配的单词- 对于第二个参数,从相关目录生成匹配的目录名称。