我正在研究各種需要特定編譯器的項目。幸運的是,在我正在使用的機器上,我提供了一個命令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命令解決更多的通用問題,而且我的數字將會是一次很好的學習體驗。
太好了,謝謝!我以爲'sed'可能是我正在尋找的工具......我還不熟悉'sed','grep'和'awk'。你能告訴我該行最後幾個字符('// // 1/p')在做什麼嗎? – 2015-04-01 21:06:38
空匹配部分的''意味着'匹配之前匹配的模式',它是包含'PrgEnv'等的醜陋的大正則表達式。替換'/ \ 1 /'意味着'替換匹配模式 - 匹配整個行 - 與記住的位(在\ \(... \)'內)。 'p'後綴的意思是'打印'; '-n'默認禁止打印。 – 2015-04-01 21:08:38