2015-04-01 24 views
2

我正在研究各種需要特定編譯器的項目。幸運的是,在我正在使用的機器上,我提供了一個命令module,這使編譯器易於交換。我使用哪種UNIX實用程序?

module unload PrgEnv-intel 
module load PrgEnv-cray 

,或者

module swap PrgEnv-intel PrgEnv-cray 

還有一個命令,module list,其中列出了所有當前加載的模塊。輸出大致爲

Currently loaded modules: 
1) module_foo/v2.3 
2) module_bar/1.1.8 
... 
17) PrgEnv-pgi/5.2.40 

或其他的影響。 (編譯器不一定列在位置17,它只是列表中的某處)。

我的問題:在給定的時間有多種可能的編譯器加載方式。我想在每個項目的目錄中編寫一個腳本,輸出module list,發現列表中以PrgEnv開頭的部分(例如,對於xxx編譯器,例如PrgEnv-xxx,無論哪個當前加載),然後執行命令module swap PrgEnv-xxx PrgEnv-cray這需要Cray編譯器。

這裏的關鍵是,我不能加載Cray編譯器(比如說),除非我加載了當前加載的任何編譯器,我不會加載 un。我可以通過檢查module list的結果來獲取這些信息,但我寧願寫一個腳本來自動化所有這些。

這是瘋狂的矯枉過正?也許,但我目前正在嘗試學習如何用UNIX命令解決更多的通用問題,而且我的數字將會是一次很好的學習體驗。

回答

2
#!/bin/bash 

[ $# = 1 ] || { echo "Usage: $0 PrgEnv-new" >&2; exit 1; } 

new_module="${1:?}" 

cur_module=$(module list | sed -n '/^[0-9]*) *\(PrgEnv-[a-zA-Z0-9_]*\)\/.*/ s//\1/p') 

if [ -z "$cur_module" ] 
then module load "$new_module" 
else if [ "$cur_module" != "$new_module" ] 
then module swap "$cur_module" "$new_module" 
else echo "Current module is $cur_module; so is requested module" 
fi 

它使用標準(史前)sed符號,並應與任何版本一起使用。 -n禁止正常的「回聲」操作。該模式查找數字後跟),空格和PrgEnv-,標識後跟/和垃圾。它用PrgEnv-和標識符代替所有這些,並打印結果行。它可能,或許應該在此之後退出(將p更改爲{ p; q; })。

以下代碼測試是否加載了模塊。如果不是,則加載新的。如果新模塊與當前模塊不同,則交換它們。如果新模塊與當前模塊相同,則表示如此。

第一行檢查腳本是否被一個參數調用,如果不是,則會打印一條用法消息。第二個捕獲參數中的值,檢查它不是空的(所以有人沒有想象並調用switch_env '',假設腳本被稱爲switch_env)。

+0

太好了,謝謝!我以爲'sed'可能是我正在尋找的工具......我還不熟悉'sed','grep'和'awk'。你能告訴我該行最後幾個字符('// // 1/p')在做什麼嗎? – 2015-04-01 21:06:38

+0

空匹配部分的''意味着'匹配之前匹配的模式',它是包含'PrgEnv'等的醜陋的大正則表達式。替換'/ \ 1 /'意味着'替換匹配模式 - 匹配整個行 - 與記住的位(在\ \(... \)'內)。 'p'後綴的意思是'打印'; '-n'默認禁止打印。 – 2015-04-01 21:08:38

0
module list | cut -d' ' -f2 | cut -d/ -f1 | grep ^PrgEnv | xargs module unload && module load PrgEnv-cray 
相關問題