Linux系统之lua 详解
命令简介
lua
是 Lua 语言的解释器,用于加载和执行 Lua 程序(包括文本源码和预编译的二进制文件)。它支持两种运行模式:批处理模式(执行指定脚本文件)和交互式模式(逐行读取并执行输入的命令),同时可通过命令行选项控制程序加载、库引入等行为,是运行 Lua 脚本的核心工具。
其核心功能:
- 脚本执行:运行
.lua
文件或预编译的二进制文件(通过luac
编译)。 - 交互模式:提供 REPL(Read-Eval-Print Loop)环境,逐行执行 Lua 代码。
- 参数传递:支持通过命令行向脚本传递参数(如
arg
表)。 - 环境初始化:执行
LUA_INIT
环境变量定义的代码(启动前自动加载)。
适用场景:
- 开发者调试 Lua 脚本。
- 快速测试 Lua 片段(如
lua -e "print(math.sin(0))"
)。 - 作为系统脚本工具(通过
#!/usr/bin/lua
定义可执行文件)。
命令语法
lua [选项] [脚本文件 [参数]]
核心功能
1. 脚本执行模式
- 文本脚本:直接运行
.lua
文件。 - 预编译脚本:执行
luac
编译后的二进制文件(后缀.luac
)。 - 标准输入:通过
-
读取 stdin 作为脚本(如管道输入)。
2. 交互模式
- 启动后进入 REPL 环境,提示符默认为
>
,可自定义_PROMPT
。 - 支持多行输入(未完成语句时提示
>>
),按;
强制语法错误可中断输入。
3. 参数传递
- 脚本参数:通过
arg
全局表访问。arg[0]
:脚本文件名(如script.lua
)。arg[1], arg[2], ...
:命令行参数(从 1 开始)。arg.n
:参数总数。arg[-1], arg[-2], ...
:命令行中脚本前的参数(如lua -e "a=1" script.lua
中的a=1
)。
- 特殊字符处理:参数中含空格或 shell 特殊符号需加引号(如
"file name"
)。
4. 环境初始化
- 启动前执行
LUA_INIT
环境变量:- 格式为
@filename
:执行指定文件。 - 否则:执行 Lua 语句(如
LUA_INIT="print('init')"
)。
- 格式为
选项详解
选项 | 功能 |
---|---|
- | 将标准输入(stdin)作为脚本执行,非交互模式。 |
-e stat | 执行 Lua 语句 stat (需转义特殊字符)。 |
-i | 执行脚本后进入交互模式(即使脚本已结束)。 |
-l name | 加载模块 name (调用 require('name') ),常用于加载库。 |
-v | 显示 Lua 版本信息并退出。 |
使用示例
示例 1:运行脚本文件
lua script.lua arg1 arg2
arg1
,arg2
通过arg[1]
和arg[2]
访问。
示例 2:交互模式
lua -i
> print("Hello, World!")
Hello, World!
> a = 1 + 2
> print(a)
3
示例 3:执行单条语句
lua -e "print('Quick test')"
示例 4:加载模块并运行
lua -l math -e "print(math.pi)"
示例 5:标准输入作为脚本
echo "print('Hello from stdin')" | lua -
示例 6:自定义交互提示符
_PROMPT="Lua> " _PROMPT2="Lua>> " lua -i
Lua> print("Custom prompt")
Custom prompt
Lua> a = 1
Lua> a + 2
Lua>> 3
注意事项
-
参数转义
- 包含空格或特殊字符的参数需用引号包裹(如
"file name"
),但引号会被 shell 移除。 - 示例:
lua script.lua "arg with space"
- 包含空格或特殊字符的参数需用引号包裹(如
-
交互模式中断
- 输入未完成时,添加
;
强制语法错误可中断输入(如print("incomplete
→print("incomplete";
)。
- 输入未完成时,添加
-
环境变量优先级
LUA_INIT
在命令行参数前执行,可用于初始化全局变量或加载库。
-
预编译脚本限制
- 只能执行由
luac
生成的.luac
文件,无法直接运行源码。
- 只能执行由
-
版本兼容性
- 不同 Lua 版本(如 5.3 vs 5.4)的语法和库可能不兼容,需确认环境版本。
典型应用场景
-
快速测试代码片段
lua -e "print(table.concat({1,2,3}, ','))"
-
自动化脚本
创建可执行脚本script.lua
:#!/usr/bin/lua print("Running script with args:", table.unpack(arg))
赋予权限并运行:
chmod +x script.lua ./script.lua arg1 arg2
-
调试模块加载
使用-l
加载模块并测试功能:lua -l lfs -e "print(package.loaded.lfs)"
-
批量处理文件
结合 shell 传递参数:find . -name "*.txt" | xargs -I {} lua process.lua {}
退出状态码
状态码 | 含义 |
---|---|
0 | 正常退出 |
1 | 参数错误或脚本执行失败 |
2 | 内部错误(如内存不足) |