Файлы модуля не возвращают ненулевые коды выхода в bash, если модуль не загружается. Как вы можете сделать условие в bash с этим? - PullRequest
1 голос
/ 20 февраля 2020

Я здесь новичок, поэтому заранее прошу прощения, если я не соблюдаю протокол, но в сообщении сказано задать новый вопрос. Я задал более ранний вопрос: Как сценарий 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. Спасибо!

Редактировать: Я хочу пояснить, что у меня нет возможности напрямую изменять файлы модуля.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Старые версии модулей, такие как версия 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) теперь возвращают соответствующий код выхода. Итак, ваш первоначальный пример будет работать с этими новыми версиями.

0 голосов
/ 20 февраля 2020

Используйте команду output / error вместо ее возвращаемого значения и проверьте, чтобы ключевое слово ERROR соответствовало вашему выводу / 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
...