【问题标题】:Including source shell script in lua modulefile在 lua 模块文件中包含源 shell 脚本
【发布时间】:2021-05-06 03:56:07
【问题描述】:

我正在尝试为已安装在集群上的应用程序创建模块文件。要运行该程序,我必须运行一个名为“phenix_env.sh”的脚本,其中包含以下内容:

#!/bin/sh
# 
export PHENIX="/src/phenix-1.19.2-4158"
export PHENIX_VERSION=1.19.2-4158
. $PHENIX/build/setpaths.sh

虽然“setpaths.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=

知道如何为它创建一个模块文件吗?

【问题讨论】:

  • 这个模块应该做什么?运行那个脚本?请提供更多上下文
  • 在HPC集群中,我们提供了一个模块文件给用户,即包含了所有的应用路径,用户可以加载模块并使用应用。因此用户可以使用命令“module load ”,它将所有可执行路径添加到用户路径,以便用户可以运行应用程序。
  • 所以你想要一个在加载时执行该 shell 脚本的 Lua 模块?
  • 没错!执行 phenix_env.sh 和“setpaths.sh”的 Lua 模块,因为“phenix_env.sh”调用“setpaths.sh”

标签: bash lua environment-modules modulefile


【解决方案1】:

你不能。
Lua 在子 shell 中执行 shell 脚本。
这意味着所有cdexport 命令将只影响该子shell,而不影响运行Lua 脚本的父shell。
也就是说,从os.execute返回后,您的更改将失效

如果你被允许require() 一个用 C 语言编写的 Lua 模块,你可以解决它。
您需要一个模块,它提供围绕 OS-native 函数的包装器来更改当前目录和设置 env 变量。

【讨论】:

    【解决方案2】:

    使用最新版本的环境模块 (>=4.6),sh-to-mod 子命令使您能够生成一个模块文件,其中包含作为参数传递的脚本所做的环境更改

    $ 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 软件。

    另请参阅此答案:How to automatically generate the modulefile for Intel compilers

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 2021-03-25
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      相关资源
      最近更新 更多