Кажется, что простой вызов оболочки в вашей системе не наследует псевдоним (или функцию), с которой он определен module
, поэтому оболочка не может его найти (см. Примечание с выдержками). Попробуйте type module
из подсказки посмотреть, как module
оно определяется в данный момент.
По сути с исходным кодом это все равно, что написать каждую строку сценария с клавиатуры.
Обратите внимание, что с одной стороны вы наследуете всю конкретную историю текущей оболочки, но, с другой стороны, текущая оболочка будет подвергаться воздействию всех сторон вашего сценария и module
вызова.
О различиях между созданием сценария и его выполнением вы можете прочитать в SuperUser Sep 2009 или Dec 2009 , Ubuntu Feb 2011 , Unix Aug 2011 , Stackoverflow Dec 2012 или во многих других местах.
В связи с этим в Modulefiles разделе есть предупреждение :
... Переменные окружения сбрасываются при выгрузке файла модуля. Таким образом, можно загрузить файл модуля, а затем выгрузить его, не возвращая переменным среды их прежнее состояние.
Так что кажется более разумным выполнить его в сценарии .
Для достижения последнего я могу думать:
Чтобы использовать интерактивную оболочку , пренебрегая конкретной историей существующей оболочки, измените шебанг вашего скрипта с помощью
#!/bin/bash -i
Интерактивная оболочка читает команды из пользовательского ввода на tty. Среди прочего, такая оболочка читает файлы запуска при активации, отображает приглашение и по умолчанию включает управление заданиями ...
Если вместо этого вы предпочитаете унаследовать конкретную историю существующей оболочки, вы можете попытаться получить ее из источника ... но в подоболочке
( source runit.sh )
Попробуйте найти текущий псевдоним / функцию module
с type module
последующим изменением вашего скрипта. Обратите внимание, что некоторые переменные окружения не могут быть установлены для module
.
Если вы хотите, вы можете найти сценарии инициализации в каталоге $MODULESHOME/init/<shell>
.
Комментарий
Как вспомнили в Q & A модулей
Дочерний процесс (скрипт) не может изменить среду родительского процесса. Загрузка модуля в сценарии влияет только на среду самого сценария. Единственный способ изменить сценарий в текущей среде - это создать сценарий, который считывает его в текущий процесс.
Поэтому, если вы хотите избежать изменения текущей среды, я думаю, что лучше попытаться изменить shebang (1) или создать скрипт в подоболочке (2). Я не совсем уверен в юзабилити кейса (3).
Примечание
Выдержки из страниц руководства и описания модулей
module
пользовательский интерфейс к пакету модулей module
Псевдоним или функция выполняет modulecmd
программу и имеет оболочку оценить вывод команды. Первый аргумент modulecmd
указывает тип оболочки.
Пакет Modules и module
команда инициализируются, когда в оболочку поступает специфический для оболочки скрипт инициализации . Сценарий создает команду модуля в виде псевдонима или функции оболочки, создает переменные среды Modules