# 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
```
更为通用。)