Estou usando módulos para controlar os pacotes no meu sistema e python/2.7.2
instalei como um módulo. Eu tenho um executável python simples python_exe.py
que chamarei de um simples script 'acionador' runit.sh
. runit.sh
script é algo como:
#!/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
No entanto, quando acabo de executar ./runit.sh
, ele me vende "module: command not found". Quando eu source runit.sh
, no entanto, ele carrega corretamente o módulo. Por que é isso?
~/.bashrc
, um shell interativo que não é um shell de login (por exemplo, o que você obtém se digitarbash
como um comando) lê,~/.bashrc
mas não~/.bash_profile
, e um shell não interativo (por exemplo, um executando um script) também não lê. ... (continua)#!/bin/bash -i
- porque a-i
opção torna o shell interativo e, portanto, fará com que ele seja lido~/.bashrc
. IMHO, isso é um exagero, porque o modo interativo pode vir com bagagem indesejada (como escrever para~/.bash_history
). Por outro lado, semodule
for definido como um alias (em oposição a uma função de shell), ele não funcionará em um shell não interativo, a menos que você digashopt -s expand_aliases
, então talvez a resposta de Cyrus seja a melhor.Parece que a simples invocação do shell no seu sistema não herda o alias (ou a função) com o qual está definido
module
, portanto, o shell não é capaz de encontrá-lo (veja abaixo a nota com os trechos). Tentetype module
no prompt para ver comomodule
ele está definido atualmente.Essencialmente com fonte é como se você escrevesse cada linha do script a partir do teclado.
Observe que, por um lado, você está herdando todo o histórico específico do shell atual, mas, por outro, o shell atual estará sujeito a todos os efeitos do seu script e
module
invocação.Sobre as diferenças entre a origem e a execução de um script, você pode ler no SuperUser, setembro de 2009 ou dezembro de 2009 , Ubuntu, fevereiro de 2011 , Unix, agosto de 2011 , Stackoverflow, dezembro de 2012 ou em muitos outros lugares.
A esse respeito, na seção Modulefiles , há um aviso :
Portanto, parece mais sábio executá-lo em um script .
Para realizar o último, posso pensar:
Para usar um shell interativo , negligenciando o histórico específico do presente shell, modificando o shebang do seu script com
Se, em vez disso, você preferir herdar a história específica do shell atual, tente fornecê-lo ... mas em um subshell
Tente encontrar o alias / função atual de
module
comtype module
e modifique em conseqüência o seu script. Observe que algumas variáveis de ambiente não podem ser definidas paramodule
.Se você quiser, pode encontrar a inicialização scripts no diretório
$MODULESHOME/init/<shell>
.Comentário
Como lembrado nas perguntas e respostas dos módulos
Portanto, se você quiser evitar modificar o ambiente atual, acho melhor tentar alterar o shebang (1) ou criar o script em um subshell (2). Não tenho muita certeza da usabilidade do caso (3).
Nota
Trechos das páginas de manual e descrição dos módulos
fonte
( source runit.sh )
é uma boa resposta; Eu não tinha pensado nisso. E uma boa coleção de referências.