1

我是新来的,所以如果我不遵守协议,我会提前道歉,但消息说要问一个新问题。我之前问过一个问题:bash 脚本如何尝试加载一个模块文件,如果失败,再加载另一个?,但它不是基于标记的命令退出代码的 Bash 条件的副本。

原因是如果加载失败,模块加载不会返回非零退出代码。这些是我正在尝试使用的环境模块。

例如,

#!/bin/bash

if module load fake_module; then
    echo "Should never have gotten here"
else
    echo "This is what I should see."
fi

结果是

ModuleCmd_Load.c(213):ERROR:105: Unable to locate a modulefile for 'fake_module'
Should never have gotten here

我如何尝试加载fake_module,如果失败尝试做其他事情?这是专门在bash脚本中的。谢谢!

编辑:我想明确一点,我没有能力直接修改模块文件。

4

2 回答 2

0

使用命令输出/错误而不是其返回值,并检查关键字ERROR是否与您的输出/错误匹配

#!/bin/bash

RES=$( { module load fake_module; } 2>&1 )
if [[ "$RES" != *"ERROR"* ]]; then
    echo "Should never have gotten here"  # the command has no errors
else
    echo "This is what I should see."   # the command has an error
fi
于 2020-02-20T14:52:29.663 回答
0

旧版本的模块,就像您使用的版本一样,无论失败还是成功3.2,总是返回。0使用此版本,您必须按照@franzisk 的建议解析输出。模块在 stderr 上返回其输出(因为 stdout 用于捕获要应用的环境更改)

如果您不想依赖错误消息,可以在module load命令后列出已加载的模块module list。如果在命令输出中未找到模块,module list则意味着模块加载尝试失败。

module load fake_module
if [[ "`module list -t 2>&1`" = *"fake_module"* ]]; then
    echo "Should never have gotten here"  # the command has no errors
else
    echo "This is what I should see."   # the command has an error
fi

较新版本的模块 (>= 4.0) 现在返回适当的退出代码。因此,您的初始示例将适用于这些较新的版本。

于 2020-02-21T07:00:55.400 回答