多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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 ``` 更为通用。)