我无法在zsh中找到广泛使用的autoload
命令的文档。有人能用简单的英语解释吗?
更具体一点:模块的自动加载意味着什么,例如在这一行中:
autoload -Uz vcs_info
它做了什么?
我尝试了autoload --help
,man autoload
,谷歌搜索 - 没有成功。谢谢!
答案 0 :(得分:15)
{b}中没有autoload
功能,但它位于ksh
(korn shell)和zsh
中。在zsh
上man zshbuiltins
。
以与任何其他命令相同的方式调用函数。程序和函数之间可能存在名称冲突。 autoload
做的是将该名称标记为函数而不是外部程序。该函数必须独立于文件中,文件名与函数名称相同。
autoload -Uz vcs_info
-U
表示为自动加载标记函数vcs_info
并禁止别名扩展。 -z
表示使用zsh
(而不是ksh
)样式。另请参阅functions
命令。
编辑(来自@ijoseph建议的评论):
因此它记录了名称是函数而不是外部程序的事实 - 除非使用-X
选项,否则它不会调用它,它只会在调用时影响搜索路径。如果函数名称不与程序名称冲突,则不需要。使用f_
之类的函数为您的函数添加前缀,您可能永远不需要它。
有关详细信息,请参阅http://zsh.sourceforge.net/Doc/Release/Functions.html。
答案 1 :(得分:3)
autoload
告诉zsh在$FPATH
/ $fpath
中查找包含函数定义的文件,而不是$PATH
/ $path
中包含函数定义的文件。脚本。
脚本只是运行脚本时执行的一系列命令。例如,假设您有一个名为hello
的文件:
echo "Hello!"
echo "Good-bye!"
脚本获得了自己的shell进程副本,因此它们所做的任何操作都不会对调用shell环境产生任何副作用。
echo "Setting 'greeting'"
greeting='Hello'
然后您可以运行它,但它不会更改您的shell:
$ hello
Setting 'greeting'
$ echo $greeting
$
函数定义一次并存在于外壳程序的内存中;当您运行它们时,它们会在您的Shell环境中运行,并且可能会产生副作用:
hello() {
echo "Setting 'greeting'"
greeting='Hello'
}
$ hello
Setting 'greeting'
$ echo $greeting
Hello
因此,当您要修改外壳环境时,可以使用函数。 Zsh线路编辑器(ZLE)也使用函数-当您将某个键绑定到某个动作时,该动作被定义为shell函数(必须使用zle -N
命令将其添加到ZLE中)。
现在,如果您有很多功能,那么您可能不想在每次启动新Shell时都在.zshrc
中定义所有功能。因此,您可以将函数定义放入文件中,以文件定义的功能命名文件,然后将文件放入$FPATH
中的目录中,其工作方式类似于$PATH
。 Zsh已经在默认的$FPATH
中附带了许多标准函数。但是除非您告诉它命令是一个函数,否则autoload
不会知道在那里查找命令。
值得一提的是,您第一次运行autoload
版本的函数时,Zsh会提供定义文件,但是–与ksh不同–它然后不调用该函数。定义文件后,由您决定在文件内调用该函数,以便第一个调用起作用。 autoload
的{{1}}可行定义如下:
hello