Linux系统之lua 详解

命令简介

luaLua 语言的解释器 ,用于加载和执行 Lua 程序(包括文本源码和预编译的二进制文件)。它支持两种运行模式:批处理模式 (执行指定脚本文件)和交互式模式(逐行读取并执行输入的命令),同时可通过命令行选项控制程序加载、库引入等行为,是运行 Lua 脚本的核心工具。

其核心功能:

  • 脚本执行 :运行 .lua 文件或预编译的二进制文件(通过 luac 编译)。
  • 交互模式:提供 REPL(Read-Eval-Print Loop)环境,逐行执行 Lua 代码。
  • 参数传递 :支持通过命令行向脚本传递参数(如 arg 表)。
  • 环境初始化 :执行 LUA_INIT 环境变量定义的代码(启动前自动加载)。

适用场景:

  • 开发者调试 Lua 脚本。
  • 快速测试 Lua 片段(如 lua -e "print(math.sin(0))")。
  • 作为系统脚本工具(通过 #!/usr/bin/lua 定义可执行文件)。

命令语法

bash 复制代码
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:运行脚本文件

bash 复制代码
lua script.lua arg1 arg2
  • arg1, arg2 通过 arg[1]arg[2] 访问。

示例 2:交互模式

bash 复制代码
lua -i
> print("Hello, World!")
Hello, World!
> a = 1 + 2
> print(a)
3

示例 3:执行单条语句

bash 复制代码
lua -e "print('Quick test')"

示例 4:加载模块并运行

bash 复制代码
lua -l math -e "print(math.pi)"

示例 5:标准输入作为脚本

bash 复制代码
echo "print('Hello from stdin')" | lua -

示例 6:自定义交互提示符

bash 复制代码
_PROMPT="Lua> " _PROMPT2="Lua>> " lua -i
Lua> print("Custom prompt")
Custom prompt
Lua> a = 1
Lua> a + 2
Lua>> 3

注意事项

  1. 参数转义

    • 包含空格或特殊字符的参数需用引号包裹(如 "file name"),但引号会被 shell 移除。

    • 示例:

      bash 复制代码
      lua script.lua "arg with space"
  2. 交互模式中断

    • 输入未完成时,添加 ; 强制语法错误可中断输入(如 print("incompleteprint("incomplete";)。
  3. 环境变量优先级

    • LUA_INIT 在命令行参数前执行,可用于初始化全局变量或加载库。
  4. 预编译脚本限制

    • 只能执行由 luac 生成的 .luac 文件,无法直接运行源码。
  5. 版本兼容性

    • 不同 Lua 版本(如 5.3 vs 5.4)的语法和库可能不兼容,需确认环境版本。

典型应用场景

  1. 快速测试代码片段

    bash 复制代码
    lua -e "print(table.concat({1,2,3}, ','))"
  2. 自动化脚本

    创建可执行脚本 script.lua

    lua 复制代码
    #!/usr/bin/lua
    print("Running script with args:", table.unpack(arg))

    赋予权限并运行:

    bash 复制代码
    chmod +x script.lua
    ./script.lua arg1 arg2
  3. 调试模块加载

    使用 -l 加载模块并测试功能:

    bash 复制代码
    lua -l lfs -e "print(package.loaded.lfs)"
  4. 批量处理文件

    结合 shell 传递参数:

    bash 复制代码
    find . -name "*.txt" | xargs -I {} lua process.lua {}

退出状态码

状态码 含义
0 正常退出
1 参数错误或脚本执行失败
2 内部错误(如内存不足)