Estoy usando módulos para controlar los paquetes en mi sistema y los he python/2.7.2
instalado como un módulo. Tengo un ejecutable simple de Python python_exe.py
al que llamaré desde un simple script de 'conducción' runit.sh
. runit.sh
el guión se parece a:
#!/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
Sin embargo, cuando acabo de ejecutar ./runit.sh
, me vende "módulo: comando no encontrado". Cuando source runit.sh
, sin embargo, carga correctamente el módulo. ¿Por qué es esto?
~/.bashrc
, un shell interactivo que no es un shell de inicio de sesión (por ejemplo, lo que obtienes si escribesbash
como un comando) lee~/.bashrc
pero no~/.bash_profile
, y un shell no interactivo (por ejemplo, uno que ejecuta un script) no lee ninguno. ... (Continúa)#!/bin/bash -i
, porque la-i
opción hace que el shell sea interactivo y, por lo tanto, hará que se lea~/.bashrc
. En mi humilde opinión, eso es excesivo, porque el modo interactivo puede venir con equipaje no deseado (como escribir a~/.bash_history
). Por otro lado, simodule
se define como un alias (a diferencia de una función de shell), no funcionará en un shell no interactivo a menos que usted lo digashopt -s expand_aliases
, por lo que tal vez la respuesta de Cyrus sea la mejor.Parece que la simple invocación del shell en su sistema no hereda el alias (o la función) con la que se define
module
, por lo que el shell no puede encontrarlo (vea a continuación la nota con los extractos). Pruebetype module
desde el indicador para ver cómomodule
se define actualmente.Esencialmente con la fuente es como si escribieras cada línea del guión desde el teclado.
Tenga en cuenta que, por un lado, está heredando todo el historial específico del shell actual, pero, por el otro, el shell actual estará sujeto a todos los efectos secundarios de su script e
module
invocación.Sobre las diferencias entre obtener un script y ejecutarlo, puede leerlo en SuperUser Sep 2009 o Dec 2009 , Ubuntu Feb 2011 , Unix Aug 2011 , Stackoverflow Dec 2012 o en muchos otros lugares.
En este sentido, en la sección Archivos de módulo hay una advertencia :
Por lo tanto, parece más prudente ejecutarlo en un script .
Para lograr esto último puedo pensar:
Para usar un shell interactivo , descuidando el historial específico del presente shell, modificando el shebang de su script con
Si, en cambio, prefiere heredar la historia específica del presente shell, puede intentar obtenerlo ... pero en una subshell
Intenta encontrar el alias / función actual de
module
with ytype module
luego modifica en consecuencia tu script. Tenga en cuenta que no se puede establecer alguna variable de entornomodule
.Si lo desea, puede encontrar los scripts de inicialización en el directorio
$MODULESHOME/init/<shell>
.Comentario
Como se recuerda en las preguntas y respuestas de los módulos
Entonces, si desea evitar modificar el entorno actual, creo que es mejor intentar cambiar el shebang (1) o buscar el script en una subshell (2). No estoy completamente seguro de la usabilidad del caso (3).
Nota
Extractos del manual y páginas de descripción de módulos
fuente
( source runit.sh )
es una buena respuesta No lo había pensado. Y una buena colección de referencias.