Zsh 从脚本调用zmodload

Zsh 从脚本调用zmodload,zsh,Zsh,我试图了解zsh模块是如何加载的。根据文件: zsh的一些可选部分位于模块中,与外壳的核心分开。这些模块中的每一个都可以在构建时链接到shell,或者在shell运行时动态链接(如果安装支持此功能)。模块在运行时与 zmodload命令 如果我启动一个新的shell并运行命令zmodload,它将显示当前加载的模块(zsh/datetime未加载) 我可以在运行时使用zmodload zsh/datetime加载它。如果我再次运行zmodload,我可以看到它现在已列出 但是,当我像这样执行脚本

我试图了解zsh模块是如何加载的。根据文件:

zsh的一些可选部分位于模块中,与外壳的核心分开。这些模块中的每一个都可以在构建时链接到shell,或者在shell运行时动态链接(如果安装支持此功能)。模块在运行时与 zmodload命令

如果我启动一个新的shell并运行命令
zmodload
,它将显示当前加载的模块(zsh/datetime未加载)

我可以在运行时使用
zmodload zsh/datetime
加载它。如果我再次运行
zmodload
,我可以看到它现在已列出

但是,当我像这样执行脚本时,找不到zmodload命令:

%./testload.zsh

#!/usr/bin/env zsh
zmodload zsh/datetime
echo "EPOCHSECONDS: $EPOCHSECONDS"

./testload.zsh: line 3: zmodload: command not found
但是,如果在调用新的zsh shell时执行脚本,它将成功运行:

% zsh testload.zsh

#!/usr/bin/env zsh
zmodload zsh/datetime
echo "EPOCHSECONDS: $EPOCHSECONDS"

EPOCHSECONDS: 1501004101

知道为什么会发生这种行为吗?

很有趣。我似乎无法复制这种行为:-让我想知道您的系统有什么不同。你在用什么操作系统?您是通过系统的软件包管理器安装ZSH还是从源代码安装ZSH的?刚刚重新检查,我的shebang输入错误。当它被修复时,它会按预期工作。但奇怪的是,即使是shebang输入错误,它仍然以zsh脚本和zsh命令的形式执行(zmodload除外):@nfarar没那么奇怪。因为打字错误是以
##开头的而不是
#系统未将其识别为shebang行。如果没有shebang,大多数系统都会回到默认shell,很可能是
/bin/sh
。这可能不是
zsh
的/link副本,因此它不知道zsh内置的
zmodload
。这也是我的第一个想法。所以我在脚本中也加入了“echo$SHELL”,在这两种情况下都是/usr/local/bin/zsh。
$SHELL
指的是用户的交互/登录SHELL,而不是执行脚本的SHELL。