4

我有一个shell脚本,它的用法是:

foo.sh <name> <type> <*.tar.gz>

我只想设置一个完整的第三个参数。如果我按下第一个参数,只显示用法。

我可以使用 zsh 的 zshcomp 来完成这项工作吗?

例如:

foo.sh <tab>  # display usage
foo.sh a b <tab> # show files match with *.tar.gz

我可以遵循类似的脚本吗?

4

1 回答 1

6

要读的东西。

这是一篇讨论Z-Shell 完成系统的博文。

如需更深入的讨论,请阅读此 unix.stackexchange答案。

和往常一样,阅读手册页!.

编辑:忘记添加:echo $fpath将向您显示zsh使用的函数路径。在 OSX 上,我有:/usr/local/share/zsh/4.3.17/functions,(位置可能因您而异),其中包含所有 ZSH 完成功能。看看_ssh,_ls_tar- 它们都在那里,而且它们都有许多可以学习的漂亮特性。


解决问题:你应该走的方向。

不过,您要问的是可以实现的。有几个步骤。

  1. 您需要编写一个 z-shell 补全函数。它需要位于fpath; zsh用于完成系统功能的功能路径。(如果是小函数,放入~/.zshrc也可以,但不推荐)。

  2. 您希望在第三个参数上完成。为此,您的函数将如下所示:

    _arguments "3:<MENU>:<COMPLETION>"
    

    <MENU>菜单描述,如果您启用了菜单描述,您将看到它。(这是使用zstyle; 阅读手册页或链接页面以获取更多信息)。 <COMPLETION>是你可以完成的事情。例如,如果您使用:

    _arguments "3::(Foo Bar)"
    

    当您运行脚本并按下<TAB>时,您可以选择FooBar。[注意:<MENU>该示例中没有。如果您不需要菜单描述符,则可以省略它,如图所示]。

  3. 您希望完成*.tar文件。你可以打电话_files来做到这一点:

    _files -g \*.tar
    
  4. 显示第一个参数的用法:那将是一个没有参数的完成(即参数 1)。我不确定你为什么只希望完成第三个选项而不是前两个(典型的使用说明),所以我不知道如何回答这个问题。如果你的脚本应该像这样使用: script foo bar FILE.tar,你不想完成fooandbar参数吗?
    当脚本在没有参数的情况下运行时,也许更好的解决方案是显示使用情况。

完整的脚本如下所示:


#compdef myscript

_arguments "3:tar files:_files -g \*.tar"
于 2012-08-21T15:04:31.253 回答