J'utilise des modules pour contrôler les packages sur mon système et je les ai python/2.7.2
installés en tant que module. J'ai un exécutable python simple python_exe.py
que je vais appeler à partir d'un simple script de «pilotage» runit.sh
. runit.sh
le script ressemble à quelque chose comme:
#!/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
Cependant, quand je viens de courir ./runit.sh
, il me vend "module: commande introuvable". source runit.sh
Cependant, lorsque je charge correctement le module. Pourquoi est-ce?
~/.bashrc
, un shell interactif qui n'est pas un shell de connexion (par exemple, ce que vous obtenez si vous tapezbash
comme une commande) lit~/.bashrc
mais pas~/.bash_profile
, et un shell non interactif (par exemple, un exécutant un script) ne lit ni l'un ni l'autre. … (Suite)#!/bin/bash -i
- parce que l'-i
option rend le shell interactif, et le fera donc lire~/.bashrc
. À mon humble avis, c'est exagéré, car le mode interactif peut venir avec des bagages indésirables (comme écrire à~/.bash_history
). D'un autre côté, simodule
est défini comme un alias (par opposition à une fonction shell), il ne fonctionnera pas dans un shell non interactif sauf si vous le ditesshopt -s expand_aliases
, alors peut-être que la réponse de Cyrus est la meilleure.Il semble que la simple invocation du shell dans votre système n'hérite pas de l'alias (ou de la fonction) avec lequel est défini
module
, donc le shell n'est pas en mesure de le trouver (voir ci-dessous la note avec les extraits). Essayez àtype module
partir de l'invite pour voir commentmodule
il est actuellement défini.Essentiellement avec la source, c'est comme si vous écriviez chaque ligne du script à partir du clavier.
Notez que d'un côté vous héritez de tout l'historique spécifique du shell actuel mais, de l'autre, le shell actuel sera soumis à tous les effets de votre script et de votre
module
invocation.À propos des différences entre la source d'un script et son exécution, vous pouvez lire sur SuperUser Sep 2009 ou Dec 2009 , Ubuntu Feb 2011 , Unix Aug 2011 , Stackoverflow Dec 2012 ou dans de nombreux autres endroits.
À cet égard, dans la section Modulefiles , il y a un avertissement :
Il semble donc plus judicieux de l'exécuter dans un script .
Pour accomplir ce dernier je pense:
Pour utiliser un shell interactif , en négligeant l'historique spécifique du shell actuel, en modifiant le shebang de votre script avec
Si à la place vous préférez hériter de l'histoire spécifique du shell actuel, vous pouvez essayer de la source ... mais dans un sous - shell
Essayez de trouver l'alias / la fonction actuelle de
module
avectype module
puis modifiez en conséquence votre script. Notez que certaines variables d'environnement ne peuvent pas être définies pourmodule
.Si vous le souhaitez, vous pouvez trouver les scripts d'initialisation dans le répertoire
$MODULESHOME/init/<shell>
.Commentaire
Comme rappelé dans les Q&R des modules
Donc, si vous voulez éviter de modifier l'environnement actuel, je pense qu'il vaut mieux essayer de changer le shebang (1) ou source le script dans un sous-shell (2). Je ne suis pas complètement sûr de l'utilisabilité du boîtier (3).
Remarque
Extraits des pages de manuel et de description des modules
la source
( source runit.sh )
est une bonne réponse; Je n'y avais pas pensé. Et une bonne collection de références.