看来,在您的系统中对shell的简单调用不会继承使用define的别名(或函数)module
,因此shell无法找到它(请参见下面带有摘录的注释)。type module
从提示符处尝试查看module
它的当前定义。
本质上来说,源代码就像您从键盘上编写脚本的每一行一样。
请注意,一方面,您将继承当前Shell的所有特定历史记录,另一方面,当前Shell将受到脚本和module
调用的所有副作用。
关于源代码脚本和执行脚本之间的区别,您可以阅读SuperUser Sep 2009或2009 年12月,Ubuntu 2011 年2月,Unix 2011年8月,Stackoverflow 2012年12月或在许多其他地方。
在这方面,在Modulefiles 部分中有一个警告:
...卸载模块文件时未设置环境变量。因此,可以加载模块文件,然后将其卸载,而无需使环境变量返回其先前状态。
因此,在脚本中执行它似乎更明智。
要实现后者,我可以考虑:
要使用交互式外壳程序,忽略当前外壳程序的特定历史记录,请使用以下命令修改脚本的shebang
#!/bin/bash -i
交互式外壳从tty上的用户输入读取命令。除其他事项外,此类外壳在激活时读取启动文件,显示提示,并默认启用作业控制...
相反,如果您希望继承当前shell的特定故事,则可以尝试将其来源...但是在子shell中
( source runit.sh )
尝试找到module
with 的当前别名/功能,type module
然后修改您的脚本。请注意,不能为设置某些环境变量module
。
如果需要,可以在目录中找到初始化脚本$MODULESHOME/init/<shell>
。
注释
如模块问答中所记
子进程(脚本)不能更改父进程环境。脚本中的模块加载只会影响脚本本身的环境。可以让脚本更改当前环境的唯一方法是提供脚本并将其读入当前进程。
因此,如果您想避免修改当前环境,我认为最好尝试更改shebang(1)或在子shell中提供脚本(2)。我对case(3)的可用性不完全确定。
注意模块
手册和描述页面的摘录
module
是Modules软件包的用户界面。该module
别名或函数执行该modulecmd
程序,并且有壳评估命令的输出。第一个参数modulecmd
指定外壳的类型。
当将特定于外壳的初始化脚本源到shell中时,将初始化 Modules包和module
命令。该脚本以别名或外壳函数的形式创建模块命令,并创建模块环境变量