我有一个.zshrc
主要更新的功能PATH
:
my_function()
{
PATH=...
}
以及一些依赖于它的脚本,例如my_script.sh
以下行开头:
my_function
# do stuff ...
然后我有以下内容crontab
:
00 02 * * * /path/to/my/zsh /path/to/my_script.sh
但我注意到,即使我手动运行my_script.sh
(./my_script.sh
即从我的交互式(?)Zsh shell),我也会收到错误:
Command not found: my_function
即使我可以完美地my_function
从终端调用。
为什么?我想要一个解决方案不是要求我在我的脚本中添加一个 shebang(有关更多信息,请参见这)
我成立如下图。我想在我的例子中,cron 会启动一个非交互式、非登录 shell,这就是为什么没有运行任何 init 文件。那是对的吗?
答案1
将您的函数放入.zshenv
.
.zshenv
-f
除非设置了该选项,否则将在 shell 的所有调用中获取源。它应该包含设置命令搜索路径的命令,以及其他重要的环境变量。.zshenv
不应包含产生输出的命令或假设 shell 连接到 tty。
.zshrc
源自交互式 shell。它应该包含设置别名、函数、选项、键绑定等的命令。
答案2
我喜欢将 shell 函数定义与 .zshrc 分开。
因此,无论如何,我很幸运地通过在 $PATH 中包含包含 zsh 函数的目录 ($HOME/.zsh) 来从 emacs 访问 shell 函数。
一如既往,YMMV。