---
# System prepended metadata

title: module file 函數分類註釋版
tags: [lmod]

---

# 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
```