Ich verwende Module zur Steuerung der Pakete auf meinem System und habe python/2.7.2
sie als Modul installiert. Ich habe eine einfache ausführbare Python-Datei, python_exe.py
die ich von einem einfachen "Fahr" -Skript aufrufen werde runit.sh
. runit.sh
Das Skript sieht ungefähr so aus:
#!/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
Wenn ich gerade starte, wird ./runit.sh
mir jedoch "module: command not found" verkauft. Wenn ich source runit.sh
das Modul jedoch richtig lade. Warum ist das?
~/.bashrc
eine interaktive Shell, die keine Login-Shell ist (z. B. was Sie erhalten, wenn Siebash
als eingeben) Ein Befehl liest,~/.bashrc
aber nicht~/.bash_profile
, und eine nicht interaktive Shell (z. B. eine, die ein Skript ausführt) liest keine. … (Fortsetzung)#!/bin/bash -i
- weil die-i
Option die Shell interaktiv macht und sie daher zum Lesen veranlasst~/.bashrc
. IMHO, das ist übertrieben, denn der interaktive Modus kann mit unerwünschtem Gepäck einhergehen (wie das Schreiben an~/.bash_history
). Auf der anderen Seite, wennmodule
es als Alias definiert ist (im Gegensatz zu einer Shell-Funktion), funktioniert es in einer nicht interaktiven Shell nur, wenn Sie sagenshopt -s expand_aliases
, vielleicht ist Cyrus die beste Antwort.Es scheint, dass der einfache Aufruf der Shell in Ihrem System nicht den Alias (oder die Funktion) erbt, mit dem bzw. der
module
die Shell definiert ist , so dass die Shell ihn nicht finden kann (siehe unten den Hinweis mit den Auszügen). Versuchen Sietype module
an der Eingabeaufforderung zu sehen, wiemodule
es derzeit definiert ist.Im Wesentlichen mit Quelle ist wie, wenn Sie jede Zeile des Skripts über die Tastatur schreiben.
Beachten Sie, dass Sie auf der einen Seite den gesamten Verlauf der aktuellen Shell erben, auf der anderen Seite jedoch alle Seiten Ihres Skripts und Ihres Aufrufs auf die aktuelle Shell
module
einwirken.Über die Unterschiede zwischen einem Skript zu beziehen und ihn auszuführen Sie auf Super - User lesen September 2009 oder Dezember 2009 , Ubuntu Februar 2011 , Unix August 2011 , Stackoverflow Dezember 2012 oder in vielen anderen Orten.
In diesem Zusammenhang gibt es im Abschnitt Modulefiles eine Warnung :
Es erscheint daher sinnvoller, es in einem Skript auszuführen .
Um Letzteres zu erreichen, kann ich denken:
Um eine interaktive Shell zu verwenden , vernachlässigen Sie den spezifischen Verlauf der aktuellen Shell und ändern Sie den Shebang Ihres Skripts mit
Wenn Sie stattdessen lieber die spezifische Geschichte der vorliegenden Shell erben möchten, können Sie versuchen, sie als Quelle zu verwenden ... aber in einer Subshell
Versuchen Sie, den aktuellen Alias / die aktuelle Funktion von
module
mit zu finden,type module
und ändern Sie anschließend Ihr Skript. Beachten Sie, dass einige Umgebungsvariablen nicht festgelegt werden könnenmodule
.Wenn Sie möchten, finden Sie die Initialisierungsskripte im Verzeichnis
$MODULESHOME/init/<shell>
.Kommentar
Wie in der Erinnerung Q & A von Modulen
Wenn Sie also vermeiden möchten, die aktuelle Umgebung zu ändern, ist es meines Erachtens besser, den shebang (1) zu ändern oder das Skript in einer Subshell (2) zu veröffentlichen. Ich bin mir über die Verwendbarkeit des Falls nicht ganz sicher (3).
Hinweis
Auszüge aus Handbuch- und Beschreibungsseiten von Modulen
quelle
( source runit.sh )
ist eine gute Antwort; Ich hatte nicht daran gedacht. Und eine gute Sammlung von Referenzen.