Я использую модули для управления пакетами в моей системе, и я python/2.7.2
установил их как модуль. У меня есть простой исполняемый файл Python, python_exe.py
который я собираюсь вызывать из простого сценария «вождения» runit.sh
. runit.sh
скрипт выглядит примерно так:
#!/bin/bash
module load python/2.7.2
arg1=myarg1
arg2=15
arg3=$5
/path/to/python_exe.py -a $arg1 -b $arg2 -c $arg3
Однако, когда я просто запускаю ./runit.sh
, он продает мне «модуль: команда не найдена». Когда я source runit.sh
, однако, он правильно загружает модуль. Почему это?
~/.bashrc
интерактивную оболочку, которая не является оболочкой входа в систему (например, то, что вы получаете, если вводитьbash
как команда) читает,~/.bashrc
но не читает~/.bash_profile
, а неинтерактивная оболочка (например, запускающая скрипт) не читает ни того, ни другого. … (Продолжение)#!/bin/bash -i
потому что эта-i
опция делает оболочку интерактивной и, следовательно, заставляет ее читать~/.bashrc
. ИМХО, это излишне, потому что интерактивный режим может прийти с нежелательным багажом (например, письмо~/.bash_history
). С другой стороны, еслиmodule
он определен как псевдоним (в отличие от функции оболочки), он не будет работать в неинтерактивной оболочке, если вы не скажетеshopt -s expand_aliases
, поэтому, возможно, ответ Сайруса будет лучшим.Кажется, что простой вызов оболочки в вашей системе не наследует псевдоним (или функцию), с которой он определен
module
, поэтому оболочка не может его найти (см. Примечание с выдержками). Попробуйтеtype module
из подсказки посмотреть, какmodule
оно определяется в данный момент.По сути с исходным кодом это все равно, что написать каждую строку сценария с клавиатуры.
Обратите внимание, что с одной стороны вы наследуете всю конкретную историю текущей оболочки, но, с другой стороны, текущая оболочка будет подвергаться воздействию всех сторон вашего сценария и
module
вызова.О различиях между созданием сценария и его выполнением вы можете прочитать в SuperUser Sep 2009 или Dec 2009 , Ubuntu Feb 2011 , Unix Aug 2011 , Stackoverflow Dec 2012 или во многих других местах.
В связи с этим в Modulefiles разделе есть предупреждение :
Так что кажется более разумным выполнить его в сценарии .
Для достижения последнего я могу думать:
Чтобы использовать интерактивную оболочку , пренебрегая конкретной историей существующей оболочки, измените шебанг вашего скрипта с помощью
Если вместо этого вы предпочитаете унаследовать конкретную историю существующей оболочки, вы можете попытаться получить ее из источника ... но в подоболочке
Попробуйте найти текущий псевдоним / функцию
module
сtype module
последующим изменением вашего скрипта. Обратите внимание, что некоторые переменные окружения не могут быть установлены дляmodule
.Если вы хотите, вы можете найти сценарии инициализации в каталоге
$MODULESHOME/init/<shell>
.Комментарий
Как вспомнили в Q & A модулей
Поэтому, если вы хотите избежать изменения текущей среды, я думаю, что лучше попытаться изменить shebang (1) или создать скрипт в подоболочке (2). Я не совсем уверен в юзабилити кейса (3).
Примечание
Выдержки из страниц руководства и описания модулей
источник
( source runit.sh )
хороший ответ; Я не думал об этом. И хорошая коллекция ссылок.