我有一个shell脚本,它的用法是:
foo.sh <name> <type> <*.tar.gz>
Run Code Online (Sandbox Code Playgroud)
我想只设置一个完整的第三个参数.如果按第一个参数,只显示用法.
我可以使用zsh的zshcomp来完成这项工作吗?
例如:
foo.sh <tab> # display usage
foo.sh a b <tab> # show files match with *.tar.gz
Run Code Online (Sandbox Code Playgroud)
我可以遵循类似的剧本吗?
这是一篇讨论Z-Shell完成系统的博客文章.
有关更深入的讨论,请阅读此unix.stackexchange答案.
并且,一如既往地阅读手册页!.
编辑:忘记添加:echo $fpath将显示使用的功能路径zsh.在OSX上,我有:/usr/local/share/zsh/4.3.17/functions,(位置可能因您而异),其中包含所有ZSH完成功能.看一看_ssh,_ls,_tar等等-他们都在那里,他们都有很多的,你可以借鉴漂亮的功能.
但是你所要求的是可以实现的.有几个步骤.
您需要编写一个z-shell完成函数.它需要位于fpath; zsh用于完成系统功能的函数路径.(如果它是一个小功能,将它放入~/.zshrc也会起作用,但不推荐).
您希望在第3个参数上完成.为此,您的函数将如下所示:
_arguments "3:<MENU>:<COMPLETION>"
Run Code Online (Sandbox Code Playgroud)
<MENU>是菜单说明,如果您启用了菜单说明,则会看到该说明.(已完成使用zstyle;阅读手册页或链接页面以获取更多信息).
<COMPLETION>是你可以完成的事情.例如,如果您使用:
_arguments "3::(Foo Bar)"
Run Code Online (Sandbox Code Playgroud)
当你运行你的脚本并按下时<TAB>,你可以选择Foo或者Bar.[注意:<MENU>该示例中没有.如果您不想要菜单描述符,可以省略它,如图所示].
你想要完成*.tar文件.你可以打电话_files来做到这一点:
_files -g \*.tar
Run Code Online (Sandbox Code Playgroud)显示第一个参数的用法:这是一个没有参数的完成(即参数1).我不确定为什么你只想要完成第三个选项而不是前两个选项(典型用法说明),所以我不知道如何回答这个问题.如果您的脚本应该像这样使用:script foo bar FILE.tar,您是否也想要完成foo和bar参数?
也许更好的解决方案是在没有参数的情况下运行脚本时显示用法.
完整脚本看起来如下所示:
#compdef myscript
_arguments "3:tar files:_files -g \*.tar"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1530 次 |
| 最近记录: |