# 7 – 獨立版 Lua
雖然 Lua 被設計成一門擴展式語言,用于嵌入一個宿主程序。 但經常也會被當成獨立語言使用。 獨立版的 Lua 語言解釋器隨標準包發布,就叫 `lua`。 獨立版解釋器保留了所有的標準庫及調試庫。 其命令行用法為:
```
lua [options] [script [args]]
```
選項有:
* **`-e _stat_`:** 執行一段字符串 _stat_ ;
* **`-l _mod_`:** “請求模塊” _mod_ ;
* **`-i`:** 在運行完 _腳本_ 后進入交互模式;
* **`-v`:** 打印版本信息;
* **`-E`:** 忽略環境變量;
* **`--`:** 中止對后面選項的處理;
* **`-`:** 把 `stdin` 當作一個文件運行,并中止對后面選項的處理。
在處理完選項后,`lua` 運行指定的 _腳本_。 如果不帶參數調用, 在標準輸入(`stdin`)是終端時,`lua` 的行為和 `lua -v -i` 相同。 否則相當于 `lua -` 。
如果調用時不帶選項 `-E`, 解釋器會在運行任何參數前,檢查環境變量 `LUA_INIT_5_3` (或在版本名未定義時,檢查 `LUA_INIT` )。 如果該變量內存格式為 `@_filename_`, `lua` 執行該文件。 否則,`lua` 執行該字符串。
如果調用時有選項 `-E`, 除了忽略 `LUA_INIT` 外, Lua 還忽略 `LUA_PATH` 與 `LUA_CPATH` 的值。 將 [`package.path`](#pdf-package.path) 和 [`package.cpath`](#pdf-package.cpath) 的值設為定義在 `luaconf.h` 中的默認路徑。
除 `-i` 與 `-E` 外所有的選項都按次序處理。 例如,這樣調用
```
$ lua -e'a=1' -e 'print(a)' script.lua
```
將先把 `a` 設為 1,然后打印 `a` 的值, 最后運行文件 `script.lua` 并不帶參數。 (這里的 `$` 是命令行提示。你的命令行提示可能不一樣。)
在運行任何代碼前, `lua` 會將所有命令行傳入的參數放到一張全局表 `arg` 中。 腳本的名字放在索引 0 的地方, 腳本名后緊跟的第一個參數在索引 1 處,依次類推。 在腳本名前面的任何參數 (即解釋器的名字以及各選項) 放在負索引處。 例如,調用
```
$ lua -la b.lua t1 t2
```
這張表是這樣的:
```
arg = { [-2] = "lua", [-1] = "-la",
[0] = "b.lua",
[1] = "t1", [2] = "t2" }
```
如果調用中沒提供腳本名, 解釋器的名字就放在索引 0 處,后面接著其它參數。 例如,調用
```
$ lua -e "print(arg[1])"
```
將打印出 "`-e`" 。 如果提供了腳本名, 就以 `arg[1]`, ···, `arg[#arg]` 為參數調用腳本。 (和 Lua 所有的代碼塊一樣, 腳本被編譯成一個可變參數函數。)
在交互模式下, Lua 不斷的顯示提示符,并等待下一行輸入。 一旦讀到一行, 首先試著把這行解釋為一個表達式。 如果成功解釋,就打印表達式的值。 否則,將這行解釋為語句。 如果你寫了一行未完成的語句, 解釋器會用一個不同的提示符來等待你寫完。
當腳本中出現了未保護的錯誤, 解釋器向標準錯誤流報告錯誤。 如果錯誤對象并非一個字符串,但是卻有元方法 `__tostring` 的話, 解釋器會調用這個元方法生成最終的消息。 否則,解釋器將錯誤對象轉換為一個字符串,并把棧回溯信息加在前面。
如果正常結束運行, 解釋器會關閉主 Lua 狀態機 (參見 [`lua_close`](#lua_close))。 腳本可以通過調用 [`os.exit`](#pdf-os.exit) 來結束,以回避這個步驟。
為了讓 Lua 可以用于 Unix 系統的腳本解釋器。 獨立版解釋器會忽略代碼塊的以 `#` 打頭的第一行。 因此,Lua 腳本可以通過 `chmod +x` 以及 `#!` 形式變成一個可執行文件。 類似這樣
```
#!/usr/local/bin/lua
```
(當然, Lua 解釋器的位置對于你的機器來說可能不一樣。 如果 `lua` 在你的 `PATH` 中, 寫成
```
#!/usr/bin/env lua
```
更為通用。)