2014-02-07 74 views
0

我使用了很多計算集羣,這些集羣通常使用模塊系統來製作軟件包。基本上,您使用模塊命令,如module load sample_softwaresample_software路徑被添加到$PATH。在羣集中,可以在交互式使用和作業提交使用期間調用此命令。

我有一個安裝了PBS/Torque排隊系統的Linux盒子,這樣我就可以在沙盒中使用軟件,以便以後在集羣上使用。在這個盒子上我需要一個非常類似的模塊系統。我開始製作我的`/etc/profile.d/在目錄中稱爲modules.sh文件看起來像這樣:

module() 
{ 
if [ $2 == "softwareX" ]; then 
    PATH=$PATH:/home/me/dir/softwareX 
    export PATH 
fi 
} 

我然後把下面一行在我.bash_profile腳本:

source /etc/profile.d/modules.sh 

現在,這對於下列用途非常有用:1)如果我提交了一份工作,而且我的工作腳本使用了module load softwareX,沒有問題,工作完美無缺。 2)如果我在命令行上交互式地工作,並輸入module load softwareX,那麼通往softwareX的路徑將加載到我的$PATH中,並且一切正常。

但是,這不適用於以下情況:如果我製作一個簡單的bash腳本,其中包含行module load softwareX,執行bash腳本時出現錯誤。例如,這裏是我的bash腳本:

#!/usr/bin/env bash 
echo $PATH 
module load softwareX 
echo $PATH 

當我執行此我收到錯誤script.sh: line 3L module: command not found

...和$PATH永遠不會改變。有沒有人知道我可以如何解決這個問題在所有三種情況下工作?謝謝你的幫助!

回答

1

bash腳本不會調用你的啓動文件。你必須明確地做到這一點。

http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

調用非交互

當bash啓動非交互,運行shell腳本,例如,它會在環境變量BASH_ENV,擴大它的值,如果它出現在那裏,並使用擴展值作爲文件的名稱來讀取和執行。擊的行爲就好像被執行以下命令:

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi 

但PATH變量的值不被用於搜索的文件名。

如上所述,如果使用--login選項調用非交互式shell,Bash會嘗試從登錄shell啓動文件讀取並執行命令。

1

當您創建一個子shell時,您將創建一個新的環境。當你退回到你現有的shell中時,你會失去這個環境。

我懷疑這是你的模塊函數調用發生了什麼。如果您將echo $PATH添加到模塊函數的底部,您是否看到PATH在函數內部發生變化,但在離開函數時會再次發生變化?如果是這樣,問題是一個子shell的問題:

你應該做的是有你的模塊功能,打印出來的新路徑,然後做到這一點:

PATH=$(module load softwareX) 
相關問題