Saya menggunakan modul untuk mengontrol paket-paket di sistem saya dan saya telah python/2.7.2
menginstal sebagai modul. Saya memiliki executable python sederhana python_exe.py
yang akan saya panggil dari skrip 'mengemudi' sederhana runit.sh
. runit.sh
skrip terlihat seperti:
#!/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
Namun, ketika saya baru saja menjalankan ./runit.sh
, itu menjual saya "module: command not found". Ketika saya source runit.sh
, bagaimanapun, itu memuat modul dengan benar. Kenapa ini?
~/.bashrc
, shell interaktif yang bukan shell login (mis. Apa yang Anda dapatkan jika Anda mengetikkanbash
sebagai a perintah) membaca~/.bashrc
tetapi tidak~/.bash_profile
, dan shell non-interaktif (misalnya, satu menjalankan skrip) tidak membaca. … (Lanjutan)#!/bin/bash -i
- karena-i
opsi membuat shell interaktif, dan karena itu akan membuatnya membaca~/.bashrc
. IMHO, itu berlebihan, karena mode interaktif mungkin datang dengan bagasi yang tidak diinginkan (seperti menulis ke~/.bash_history
). Di sisi lain, jikamodule
didefinisikan sebagai alias (sebagai lawan dari fungsi shell), itu tidak akan berfungsi dalam shell non-interaktif kecuali jika Anda mengatakannyashopt -s expand_aliases
, jadi mungkin jawaban Cyrus adalah yang terbaik.Tampaknya permohonan sederhana shell di sistem Anda tidak mewarisi alias (atau fungsi) yang didefinisikan
module
, sehingga shell tidak dapat menemukannya (lihat catatan di bawah dengan kutipan). Cobatype module
dari prompt untuk melihat bagaimanamodule
definisi saat ini.Intinya dengan sumber seperti jika Anda menulis setiap baris skrip dari keyboard.
Perhatikan bahwa di satu sisi Anda mewarisi semua riwayat spesifik shell saat ini tetapi, di sisi lain, shell saat ini akan mengalami semua efek sisi skrip dan
module
doa Anda.Tentang perbedaan antara sumber skrip dan menjalankannya Anda dapat membaca di SuperUser Sep 2009 atau Des 2009 , Ubuntu Februari 2011 , Unix Agu 2011 , Stackoverflow Desember 2012 atau di banyak tempat lain.
Dalam hal ini di Modulefiles bagian ada peringatan :
Jadi sepertinya lebih bijak untuk mengeksekusinya dalam naskah .
Untuk mencapai yang terakhir ini saya bisa berpikir:
Untuk menggunakan shell interaktif , abaikan riwayat spesifik shell saat ini, dengan memodifikasi shebang skrip Anda
Jika Anda lebih suka mewarisi cerita spesifik dari shell ini, Anda dapat mencoba untuk sumbernya ... tetapi dalam subkulit
Cobalah untuk menemukan alias / fungsi saat ini
module
dengantype module
kemudian memodifikasi skrip Anda. Perhatikan beberapa variabel lingkungan tidak dapat diaturmodule
.Jika mau, Anda dapat menemukan skrip inisialisasi di direktori
$MODULESHOME/init/<shell>
.Komentar
Seperti yang diingat dalam Tanya Jawab modul
Jadi jika Anda ingin menghindari memodifikasi lingkungan saat ini saya pikir lebih baik untuk mencoba mengubah shebang (1) atau sumber skrip dalam subshell (2). Saya tidak sepenuhnya yakin tentang kegunaan kasus ini (3).
Catatan
Kutipan dari halaman manual dan deskripsi modul
sumber
( source runit.sh )
adalah jawaban yang bagus; Saya belum memikirkannya. Dan koleksi referensi yang bagus.