Bash 在lua modulefile中包含源shell脚本
我正在尝试为已安装在群集上的应用程序创建模块文件。要运行该程序,我必须运行一个名为“phenix_env.sh”的脚本,该脚本包含以下内容:Bash 在lua modulefile中包含源shell脚本,bash,lua,environment-modules,modulefile,Bash,Lua,Environment Modules,Modulefile,我正在尝试为已安装在群集上的应用程序创建模块文件。要运行该程序,我必须运行一个名为“phenix_env.sh”的脚本,该脚本包含以下内容: #!/bin/sh # export PHENIX="/src/phenix-1.19.2-4158" export PHENIX_VERSION=1.19.2-4158 . $PHENIX/build/setpaths.sh 而“setpath.sh”包含以下内容 # THIS IS AN AUTOMATICALLY GENERA
#!/bin/sh
#
export PHENIX="/src/phenix-1.19.2-4158"
export PHENIX_VERSION=1.19.2-4158
. $PHENIX/build/setpaths.sh
而“setpath.sh”包含以下内容
# THIS IS AN AUTOMATICALLY GENERATED FILE.
# DO NOT EDIT! CHANGES WILL BE LOST.
ocwd="`pwd`"
if [ -n "$LIBTBX_BUILD_RELOCATION_HINT" ]; then
cd "$LIBTBX_BUILD_RELOCATION_HINT"
LIBTBX_BUILD_RELOCATION_HINT=
export LIBTBX_BUILD_RELOCATION_HINT
elif [ -n "$BASH_SOURCE" ]; then
LIBTBX_BUILD=`dirname "$BASH_SOURCE[0]"`
cd "$LIBTBX_BUILD"
else
cd "/util/opt/phenix/1.19.2/gcc/9.1/phenix-1.19.2-4158/build"
fi
LIBTBX_BUILD=`pwd -P`
export LIBTBX_BUILD
LIBTBX_OPATH="$PATH"
export LIBTBX_OPATH
PATH="$LIBTBX_BUILD/bin:$PATH"
export PATH
# DIALS_ENABLE_COMMAND_LINE_COMPLETION
[ -n "$BASH_VERSION" ] && {
source $(libtbx.find_in_repositories dials/util/autocomplete.sh) && source $LIBTBX_BUILD/dials/autocomplete/bash.sh || echo dials command line completion not available
}
cd "$ocwd"
ocwd=
alias libtbx.setpaths_all=". \"$LIBTBX_BUILD/setpaths_all.sh\""
alias libtbx.unsetpaths=". \"$LIBTBX_BUILD/unsetpaths.sh\""
if [ -n "$LIBTBX_OPATH" ]; then
LIBTBX_TMPVAL="$LIBTBX_OPATH"
else
LIBTBX_TMPVAL=
fi
export LIBTBX_TMPVAL
PATH=`libtbx.path_utility prepend LIBTBX_TMPVAL "$LIBTBX_BUILD/bin" < /dev/null`
export PATH
if [ "$PATH" = "L_I_B_T_B_X_E_M_P_T_Y" ]; then unset PATH; fi
LIBTBX_TMPVAL=
LIBTBX_OPATH=
LIBTBX_BUILD=
#这是一个自动生成的文件。
#不要编辑!更改将丢失。
ocwd=“`pwd`”
如果[-n“$LIBTBX_BUILD_RELOCATION_HINT”];然后
cd“$LIBTBX\u构建\u重新定位\u提示”
LIBTBX\u构建\u重新定位\u提示=
导出LIBTBX\u生成\u重新定位\u提示
elif[-n“$BASH_SOURCE”];然后
LIBTBX_BUILD=`dirname“$BASH_SOURCE[0]”`
cd“$LIBTBX_构建”
其他的
cd“/util/opt/phenix/1.19.2/gcc/9.1/phenix-1.19.2-4158/build”
fi
LIBTBX_BUILD=`pwd-P`
导出LIBTBX_构建
LIBTBX_OPATH=“$PATH”
导出LIBTBX_OPATH
PATH=“$LIBTBX_构建/bin:$PATH”
导出路径
#拨号\u启用\u命令\u行\u完成
[-n“$BASH_VERSION”]&&{
source$(libtbx.find_in_repositories dials/util/autocomplete.sh)和&source$libtbx_BUILD/dials/autocomplete/bash.sh | echo dials命令行完成不可用
}
cd“$ocwd”
ocwd=
别名libtbx.setpaths\u all=“.\”$libtbx\u BUILD/setpaths\u all.sh”
别名libtbx.unsetpaths=“.\”$libtbx\u BUILD/unsetpaths.sh”
如果[-n“$LIBTBX_OPATH”];然后
LIBTBX_TMPVAL=“$LIBTBX_OPATH”
其他的
LIBTBX_TMPVAL=
fi
导出LIBTBX_TMPVAL
PATH=`libtbx.PATH_实用程序前置libtbx_TMPVAL“$libtbx_BUILD/bin”
知道如何为它创建模块文件吗?你不能。Lua在子shell中执行shell脚本。
这意味着所有
cd
和export
命令将只影响该子shell,而不影响Lua脚本运行的父shell。换句话说,从
os.execute返回后,您的更改将无效
如果允许require()
a Lua模块在C上编写,则可以解决此问题。
您需要一个模块,该模块围绕操作系统本机函数提供包装,用于更改当前目录和设置环境变量。对于最新版本的环境模块(>=4.6),sub命令使您能够生成一个modulefile,其中包含作为参数传递的脚本所做的环境更改
$ module sh-to-mod sh ./phenix_env.sh
#%Module
prepend-path PATH /home/user/bin
set-alias libtbx.setpaths_all {. "/home/xa/setpaths_all.sh"}
set-alias libtbx.unsetpaths {. "/home/xa/unsetpaths.sh"}
setenv LIBTBX_BUILD {}
setenv LIBTBX_OPATH {}
setenv LIBTBX_TMPVAL {}
setenv PHENIX /src/phenix-1.19.2-4158
setenv PHENIX_VERSION 1.19.2-4158
请注意,此处获得的结果并不完全准确,因为我刚刚复制了您描述的脚本,但我没有安装phenix
软件,该软件被调用以完全设置环境
另请参见此答案:此模块应该做什么?运行脚本?请提供更多上下文在HPC集群中,我们向用户提供一个模块文件,这意味着包含所有应用程序路径,因此用户可以加载模块并使用应用程序。因此,用户可以使用命令“模块加载”,该命令将所有可执行路径添加到用户路径,以便用户可以运行应用程序。那么,您想要一个加载时执行shell脚本的Lua模块吗?没错!执行phenix_env.sh和“setpath.sh”的Lua模块,因为“phenix_env.sh”调用“setpath.sh”