# module file 函數分類註釋版 ★ 是用到過的。 ## 子鍊結 [官方說明版抄寫](/qrbpeUVvRuy-Icukm-6rgg) 這個是從官方抄下來後整理的。 [純指令版抄寫](/RGAaP1tVT2GVLsqEwdGf3w) 這個只有指令,刪掉了官方說明。 [分類版抄寫](/u1lERgKTRpqc0slES18hog) 這個給chatgpt分類了。 [分類註釋版](/A9qu7fADR12kMVFc4qZZDQ) 這個附帶我寫的註釋,也就是此文。 ## 不在官方教學的函數 ★`os.execute("sudo ln -sf " .. gcc_link .. " /usr/bin/gcc")` 執行指令 ★`io.stderr:write("GCC 11.4.0 loaded\n")` 輸出到`stderr流` ## 能影響到環境變量的指令 ★`prepend_path ("PATH", "/path/to/pkg/bin")` 把值放入環境變量前。 ★`prepend_path ("PATH", "/path/to/pkg/bin", "delim")` 能指定分隔字符的 prepend_path,常見的是`:` `prepend_path {"PATH", "/path/to/pkg/bin", delim="delim", priority=*num*}` 能指定分隔字符和優先權的 prepend_path,使用 {} `append_path ("PATH", "/path/to/pkg/bin")` 把值放入環境變量後。 `append_path ("PATH", "/path/to/pkg/bin", "delim")` `append_path {"PATH", "/path/to/pkg/bin", delim="delim", priority=*num*}` `remove_path ("PATH", "/path/to/pkg/bin")` 把值從環境變量移除。 `remove_path ("PATH", "/path/to/pkg/bin", "delim")` `setenv ("NAME", "value")` 設定環境變量的值。別用此函數初始化變量,使用prepend_path或append_path。 `pushenv ("NAME", "value")` 與 setenv類似,但當 module file 被 load 時,先前的值被push 到 stack。當 module file被 unload 時,先前儲存的值會是當前的值。 `unsetenv ("NAME")` 重置環境變量。 幫助性指令 ★`pathJoin ("/a", "b/c/", "d/")` 字串合成,變為/a/b/c/d。 ★`os.getenv ("NAME")` 取得環境變量的值。 `isFile ("name")` 是文件? `isDir ("name")` 是目錄? `splitFileName ("name")` 分割目錄,例 local d,f=splitFileName("/a/b/c.ext"). Then d="/a/b", f="c.ext" ## 能影響到 module file 的指令 ### 載入 modulefile ★`depends_on ("pkgA", "pkgB", "pkgC")` 當 modulefile 被 load 時,選項也 load。 unload 時,選項也 unload。 如果選項已經是 load 的,則 modulefile unload 時,不會 unload 選項。這是一個獨立的概念。 如果在 load 時, unload 選項,選項仍舊保留。 `depends_on_any("C","D")` 與 depends_on 類似。他先查詢C和D是否load了,有則使用第一個。 若皆無則從左找尋第一個可用的,找到後 load 目標。當 unload 時,目標也會 unload。 `load ("pkgA", "pkgB", "pkgC")` load 選項。當 unload 時,會強制 unload 所有選項,使用 always_load 是更推薦的,因為一用戶可能用著用著套件就 unload 了。 `always_load ("pkgA", "pkgB", "pkgC")` load 選項。當 unload 時,不會 unload 選項。 `load_any ("pkgA", "pkgB", "pkgC")` load 第一個合法的選項,在皆不合法時報錯。當 unload 時,強制所有選項 unload。 `try_load ("pkgA", "pkgB", "pkgC")` load 選項,但是找不到不報錯。 設定 module file 依賴項 `prereq ("name1", "name2")` 在 load 時,會檢查選項,若選項是 unload 的,則報錯。 `prereq_any ("name1", "name2")` 在 load 時,會檢查選項,如果全部都是 unload 的,則報錯 `conflict ("name1", "name2")` 當選項是 load 時,退出。 ★`family ("name")` 實現階乘modulefile的重要函數。只能有一個 "name" 被 load。常用在字串"MPI"和"Compiler",因為使用不同的MPI或compiler的套件理論上不兼容。 ### mofulefile 版本限制 `atleast ("name", "version")` 版本>=version。 `between ("name", "v1", "v2")` v1<=版本<=v2 `between ("name", "v1<", "<v2")` v1<版本\<v2 `latest ("name")` 是系統上最新的版本。 `atmost ("name","version")` 版本<=version ### modulefile 可用性 `isloaded ("NAME")` 若"NAME"是loaded時,返回true,否則false。 `isAvail ("NAME")` 若"NAME"是可使用的時,返回true,否則false。 ### 雜西雜八 `os.exit(number)` 離開當前文件,所有對環境變量的更改會取消。 `capture ("string")` 執行 "string" 然後捕獲返回值 例如: local nprocs = capture("nprocs"):gsub("\n$","") `subprocess ("string")` 執行 "string" 然後捕獲返回值,可能有'\n',你需要自己處理。 ## 一些常數 ex: 假設目前的module file 是 `某個$(MODULE_PATH)/gcc/1.1.1.lua` `myModuleName ()` gcc `myModuleVersion ()` 1.1.1 `myModuleFullName ()` gcc/1.1.1 `myModuleUsrName ()` gcc/1.1.1或gcc或1.1.1 (?) `myFileName ()` 絕對路徑 `myShellName ()` bash `myShellType ()` sh `hierarchyA ("fullName", level)` 沒用過 `extensions ("numpy/2.1, scipy/3.2, foo/1.3")` 沒用過 `LmodVersion ()` lmod的版本 ★`mode ()` 當前module file的狀態字串,能是 "load" 或 "unload" 或 "spider" ### 幫助文字或字串輸出 ★`whatis ("STRING")` 當使用 `module whatis modulefile` 時,輸出所有的whatis函數的內容。一個whatis函數代表一行。 ★`help ([[ help string ]])` 當使用 `module help modulefile` 時,輸出所有help函數的內容。一個help函數代表一行。 `LmodMessage ("string", …)` 輸出給 user `LmodWarning ("string", …)` 輸出warning給 user `LmodError ("string", "…")` 輸出error給 user,然後退出。 ### 數學 `math.floor ()` `math.ceil ()` `math.max ()` `math.min ()` ### 不想講的函數 ``` 三個來自 lua 的函數 require () loadfile () loadstring () requireFullName () inherit () isPending ("NAME") convertToCanonical ("string") execute {cmd="<any command>", modeA={"load"}} haveDynamicMPATH () complete ("shellName","name","args") add_property ("NAME", "value") remove_property ("NAME", "value") source_sh ("shellName","shell_script arg1 …") LmodBreak (msg) userInGroups ("group1", "group2", …) mgrload (required, active_object) set_alias ("name", "value") ``` ### 題外化: 自動補全代碼資源 ``` GNU Bash Manual - Programmable Completion 經典GNU風格 https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html Bash Completion Cheat Sheet 看起來很精美的網站 https://devhints.io/bash Bash Programmable Completion HOWTO: 經典死人風格教學 https://tldp.org/LDP/abs/html/tabexpansion.html Spack 官方文件 - Shell Support: 看起來有點難 https://spack.readthedocs.io/en/latest/getting_started.html#shell-support bash-completion GitHub 項目: https://github.com/scop/bash-completion ```