我如何 运行 shell 脚本函数中需要访问当前 shell 实例的命令?

How can I run a command in a shell script function that requires access to the current shell instance?

我正在使用一个名为 spack 的自定义包管理器,它允许我使用 spack load 命令加载已安装的模块。它在许多方面类似于熟悉的 module load 命令。我正在使用 zsh。

我已经设置了一个 shell 脚本,其中包含我稍后想插入到我的 .zshrc 文件中的函数。它目前位于用于测试目的的独立文件中,如下所示:

#!/bin/bash
load-standard () {
    echo "loading "
    spack load 
}
load-standard 

当我 运行 这个源代码为 ./script_name package_name 的脚本时,我收到一条错误消息

`spack load` requires Spack's shell support.

要启用 Spack 的 shell 支持,名为 setup-env.sh 的文件必须是 运行,它使用户能够使用 spack 命令。

但是,直接输入命令 spack load package_name 没有问题。

我一直认为 运行 从 shell 脚本中输入命令与在当前 shell 中输入命令是一样的。我怎样才能让我的 shell 解释 spack load 命令就像我直接输入它们一样?

编辑:将函数放在我的 .zshrc 文件中解决了这个问题。

我不熟悉 spack,但可能 spack 是一个 shell 函数,它修改当前的 shell 环境。这就是 module 的工作原理。 type spack 进行检查。

您不能从脚本修改 shell 环境,您可以从 shell 函数修改。

将函数 load-standard 复制并粘贴到 "$ZDOTDIR/.zshrc"(对于当前用户,/etc/zshrc 对于所有用户),来源 .zshrc (. "$ZDOTDIR/.zshrc") 和你应该没问题(不需要重新启动)。

您还可以在文件中创建一个函数列表,并将 . /path/to/functions 添加到 zshrc,以获取它。