autoload在zsh中做了什么?

时间:2015-06-15 08:33:50

标签: zsh

我无法在zsh中找到广泛使用的autoload命令的文档。有人能用简单的英语解释吗?

更具体一点:模块的自动加载意味着什么,例如在这一行中:

autoload -Uz vcs_info

它做了什么?

我尝试了autoload --helpman autoload,谷歌搜索 - 没有成功。谢谢!

2 个答案:

答案 0 :(得分:15)

{b}中没有autoload功能,但它位于ksh(korn shell)和zsh中。在zshman 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