如何编写可在Linux终端执行命令的Lua脚本?
Lua 中执行 Linux 终端命令的常用方法
1. 直接执行命令(无需捕获输出):os.execute()
这是 Lua 标准库自带的原生方法,直接调用系统 shell 执行传入的命令,行为和你手动在终端输入命令完全一致。
- 基础用法说明:
直接把要执行的命令作为字符串传入方法即可,示例:-- 执行 echo 打印内容 os.execute("echo Pizza is delicious") -- 执行 apt 安装 git 示例,加 -y 参数跳过安装确认 local install_exit_code = os.execute("sudo apt install -y git") if install_exit_code == 0 then print("git 安装成功") else print("git 安装失败,退出码:" .. install_exit_code) end - 返回值说明:
调用后会返回三个值,第一个为命令执行的退出码,执行成功返回0,失败返回非零值,可用来判断命令执行结果。 - 注意事项:
如果命令需要交互(比如sudo需要输入密码),会直接占用当前终端的标准输入输出等待用户操作。
2. 捕获命令输出:io.popen()
如果你需要拿到命令的输出内容而不是直接打印到终端,可以用同样是标准库自带的io.popen()方法。
- 基础用法示例:
-- 执行命令并获取输出句柄,第二个参数 r 代表只读模式 local cmd_handle = io.popen("echo Pizza is delicious", "r") if not cmd_handle then print("命令启动失败") return end -- 读取所有输出内容 local cmd_output = cmd_handle:read("*a") -- 关闭句柄释放资源 cmd_handle:close() -- 处理输出(默认带末尾换行,可按需去除) cmd_output = string.gsub(cmd_output, "\n$", "") print("命令输出为:" .. cmd_output) - 注意事项:
如果需要同时捕获标准错误输出,可以在命令末尾加2>&1将stderr重定向到stdout,比如io.popen("ls no_exist_file 2>&1")。
通用注意事项
- 执行包含变量拼接的命令时,一定要对变量里的特殊字符(空格、引号、
$、;等)做转义,避免出现shell注入风险。 - 如果需要更底层的进程控制(比如指定运行用户、单独控制标准输入输出/错误流),可以使用第三方
luaposix库的相关接口,常规场景下以上两个标准库方法已经可以满足需求。
内容的提问来源于stack exchange,提问作者Dequog
相关产品推荐
相关产品推荐

