Używam modułów do kontrolowania pakietów w moim systemie i python/2.7.2
zainstalowałem jako moduł. Mam prosty plik wykonywalny Pythona, python_exe.py
który zamierzam wywołać z prostego skryptu „sterującego” runit.sh
. runit.sh
skrypt wygląda mniej więcej tak:
#!/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
Jakkolwiek, kiedy właśnie uruchamiam ./runit.sh
, sprzedaje mi „moduł: nie znaleziono polecenia”. Kiedy source runit.sh
jednak poprawnie ładuje moduł. Dlaczego to?
~/.bashrc
interaktywna powłoka, która nie jest powłoką logowania (np. Co otrzymujesz, jeśli wpiszeszbash
jako polecenie) czyta,~/.bashrc
ale nie czyta~/.bash_profile
, a nieinteraktywna powłoka (np. uruchamiająca skrypt) nie czyta żadnej. … (Ciąg dalszy)#!/bin/bash -i
- ponieważ ta-i
opcja powoduje, że powłoka jest interaktywna i dlatego powoduje jej odczyt~/.bashrc
. IMHO, to przesada, ponieważ tryb interaktywny może pochodzić z niechcianego bagażu (jak pisanie na~/.bash_history
). Z drugiej strony, jeślimodule
jest zdefiniowany jako alias (w przeciwieństwie do funkcji powłoki), nie będzie działał w powłoce nieinteraktywnej, chyba że powieszshopt -s expand_aliases
, więc może odpowiedź Cyrusa jest najlepsza.Wygląda na to, że proste wywołanie powłoki w twoim systemie nie dziedziczy zdefiniowanego aliasu (lub funkcji)
module
, więc powłoka nie jest w stanie jej znaleźć (patrz poniżej uwaga z fragmentami). Spróbujtype module
z wiersza polecenia, aby zobaczyć, jakmodule
to jest obecnie zdefiniowane.Zasadniczo ze źródłem jest tak, jakbyś pisał każdą linię skryptu z klawiatury.
Zauważ, że z jednej strony dziedziczysz całą konkretną historię bieżącej powłoki, ale z drugiej strony bieżąca powłoka będzie podlegać wszystkim efektom skryptu i
module
wywołaniu.O różnicach między źródłem skryptu a jego uruchomieniem można przeczytać w SuperUser wrzesień 2009 lub grudzień 2009 , Ubuntu luty 2011 , Unix sierpień 2011 , Stackoverflow grudzień 2012 lub w wielu innych miejscach.
W związku z tym w sekcji Moduły plików znajduje się ostrzeżenie :
Bardziej rozsądne wydaje się wykonanie go w skrypcie .
Aby osiągnąć to drugie, mogę pomyśleć:
Aby użyć interaktywnej powłoki , zaniedbując konkretną historię obecnej powłoki, modyfikując shebang skryptu za pomocą
Jeśli zamiast tego wolisz odziedziczyć konkretną historię obecnej powłoki, możesz spróbować ją zdobyć ... ale w podpowłoce
Spróbuj znaleźć bieżący alias / funkcję,
module
atype module
następnie zmodyfikuj w konsekwencji swój skrypt. Uwaga: nie można ustawić niektórych zmiennych środowiskowychmodule
.Jeśli chcesz, możesz znaleźć skrypty inicjujące w katalogu
$MODULESHOME/init/<shell>
.Komentarz
Jak zapamiętano w pytaniach i odpowiedziach dotyczących modułów
Więc jeśli chcesz uniknąć modyfikacji obecnego środowiska, myślę, że lepiej jest spróbować zmienić shebang (1) lub źródło skryptu w podpowłoce (2). Nie jestem całkowicie pewien użyteczności skrzynki (3).
Uwaga
Fragmenty stron podręcznika i opisów modułów
źródło
( source runit.sh )
jest dobrą odpowiedzią; Nie myślałem o tym. I dobry zbiór referencji.