unix系统管理员工具包: 充分利用 zsh
2007-05-11 08:12:58 来源:WEB开发网清单 25. 获得可用文件列表zsh$ cd barney
barney* barney.c barney.o
同样的完成过程也适用于目录和路径。zsh 在完成功能方面做了进一步的优化。
自定义完成功能
标准形式的完成功能的局限性在于,它只能在您从命令行上执行输入时完成文件和路径(包括命令)。然而,在其他许多领域,您可能也希望能够完成命令而不必完成所有的输入。例如,源代码控制系统 Subversion 提供了许多二级命令,您在输入其他参数之后另外输入这些命令。例如,若要将更改提交回 Subversion 存储库中,您可以使用 commit 命令:$ svn commit。或者,若要更新,您可以使用 update 命令: $ svn update.
但您必须人工执行这些输入。通过使用 zsh 中的自定义完成控制,您可以作为完成过程的一部分来将这些子命令添加到 svn。完成控制是非常复杂(并且有时非常混淆)的系统,但是其基本原理是相当容易理解的。
完成功能是通过许多命令来控制的,但是最主要的命令为 compctl。此命令为基本的完成功能提供了一个简单接口。可以全局地应用完成功能(换句话说,就如文件和路径),或者可将其应用于特定的命令。
存在一系列可用的选项和格式,但是为了延续 Subversion 思想,您可以使用 -k 选项来提供一组单词,充当 svn 命令的潜在完成目标(请参见清单 26)。
清单 26. 使用 -k 选项zsh$ compctl -k '(commit checkout update status)' svn
现在,当您在命令开头输入 svn 时,您需要按 TAB 来完成该命令(请参见清单 27)。
清单 27. 按 TAB 来完成命令zsh$ svn com <TAB>
zsh$ svn commit
完成系统包括标准的功能和完成特性——例如,系统上的有效用户、主目录、主机、网络等对象的查找。您还可以自己添加和扩展这些功能来产生自定义的完成结果。
例如,您可以创建一个名为 activeusers 的自定义功能,用于返回用户命令产生的输出: zsh$ function activeusers { reply =(`users`) }。
您现在可以使用此功能作为另一个命令的完成目标,例如 chat 命令: zsh$ compctl -K activeusers chat。
现在,当您在命令行上输入 chat 时,可以获得仅返回当前登录用户列表的完成列表。
自定义完成系统的可用选项和可能性实在太多了,无法在此进行一一介绍。有关可用选项的官方文档,请参见参考资料。
总结
zsh 整合了一系列旨在简化用户与 Shell 环境间交互的功能。相关扩展包括替换命令和针对不同进程重定向信息的更好方法。单凭这些选项就可使您能够将其他 Shell 中需要的许多命令转换为 zsh 中的单个命令行条目。
zsh 与其他 Shell(甚至是诸如 bash 等 Shell 中提供的最新改进)之间的真正区别在于,zsh 能够自定义完成系统以处理文件名和路径以外的更多内容。扩展该功能以支持现有命令的附加参数只是其中一个示例,但是该系统是如此灵活,您几乎可以完成任何命令或命令行元素。
更多精彩
赞助商链接