获取返回状态和程序输出

我需要使用 Lua 运行一个二进制程序,该程序可能会在其标准输出中写入一些内容,并返回状态码(也称为“ 退出状态”)。

我在网上搜索,但找不到我所需的内容。但我发现在 Lua 中:

但是我需要两者。编写一个在幕后运行两个函数的包装函数不是选择,因为进程开销可能会发生变化,并可能在连续运行中发生结果变化。我需要编写这样的函数:

function run(binpath)
    ...
    return output,exitcode
end

有人知道如何解决这个问题吗?

附:目标系统运行 Linux。

原文链接 https://stackoverflow.com/questions/7607384

点赞
stackoverflow用户215039
stackoverflow用户215039

如果你在 Win32 或 POSIX 环境下运行此代码,你可以尝试使用 Lua 扩展:http://code.google.com/p/lua-ex-api/

或者,你可以编写一个小型的 shell 脚本(假设有 bash 或者类似的程序可用),它可以:

  • 执行正确的可执行文件,将退出码保存到一个 shell 变量中,
  • 在标准输出中打印一个换行符和终端字符/字符串,
  • 在标准输出中打印 shell 变量的值(即退出码)

然后,获取 io.popen 的所有输出并向后解析。

完整披露:我不是 Lua 开发者。

2011-09-30 07:51:38
stackoverflow用户714501
stackoverflow用户714501

这个功能在 C 语言中通过 pclose 实现。

成功返回后,pclose() 函数将返回命令语言解释器的终止状态。

该解释器返回其子进程的终止状态。

但是 Lua 没有正确实现该功能 (io.close 总是返回 true)。我还没有深入研究这些线程,但一些人对此进行了抱怨。

2011-09-30 08:00:01
stackoverflow用户1105870
stackoverflow用户1105870

使用 Lua 5.2,我可以执行以下操作并且它可以正常运行:

-- 这将打开文件
local file = io.popen('dmesg')
-- 这将读取所有输出,如常
local output = file:read('*all')
-- 这将获取一个带有一些返回结果的表格
-- rc[1] 将是 true、false 或 nil
-- rc[3] 将是信号
local rc = {file:close()}

希望这可以帮到你!

2012-12-25 15:38:57
stackoverflow用户1266062
stackoverflow用户1266062

我不能使用 Lua 5.2,因此我使用这个辅助函数。

function execute_command(command)
    local tmpfile = '/tmp/lua_execute_tmp_file'
    local exit = os.execute(command .. ' > ' .. tmpfile .. ' 2> ' .. tmpfile .. '.err')

    local stdout_file = io.open(tmpfile)
    local stdout = stdout_file:read("*all")

    local stderr_file = io.open(tmpfile .. '.err')
    local stderr = stderr_file:read("*all")

    stdout_file:close()
    stderr_file:close()

    return exit, stdout, stderr
end
2017-03-07 09:50:57
stackoverflow用户7480063
stackoverflow用户7480063

是的,你是正确的,os.execute() 有返回值,如果你知道如何使用带或不带 lua 的命令来运行它,这就很简单了。你可能还想知道它返回多少个变量,这可能需要一些时间,但我认为你可以尝试使用以下代码:

local a, b, c, d, e=os.execute(-无论你的命令是什么-)

对于我的示例,a 是第一个返回值,b 是第二个返回值,依此类推。我认为我根据你的问题回答得很正确。

2017-03-09 05:35:20
stackoverflow用户4675927
stackoverflow用户4675927

以下是我的做法。

local process = io.popen('command; echo $?') -- 显示上一条命令的返回码
local lastline
for line in process:lines() do
    lastline = line
end
print(lastline) -- 返回值是输出的最后一行

如果最后一行的长度是固定的,则可以使用file:seek("end", -offset)直接读取它。偏移应该是最后一行的字节数。

2019-11-17 15:25:48