【问题标题】:Lua os.execute return valueLua os.execute 返回值
【发布时间】:2012-03-29 09:16:24
【问题描述】:

是否可以从 Lua 中的局部变量中读取以下内容?

local t = os.execute("echo 'test'")
print(t)

我只是想实现这一点:每当os.execute 返回任何值时,我想在 Lua 中使用它 - 例如 echo 'test' 将在 bash 命令行中输出 test - 是否有可能获得返回值(在这种情况下为test)到 Lua 局部变量?

【问题讨论】:

    标签: lua shellexecute


    【解决方案1】:

    您可以改用io.popen()。这将返回一个文件句柄,您可以使用它来读取命令的输出。像下面这样的东西可能会起作用:

    local handle = io.popen(command)
    local result = handle:read("*a")
    handle:close()
    

    请注意,这将包括命令发出的尾随换行符(如果有)。

    【讨论】:

    • 收到此消息:'popen' not supported.
    • @Cyclone:根据手册,“此功能取决于系统,并非在所有平台上都可用”。你在什么平台上尝试这个?考虑到可用功能,我能想到的唯一解决方法是使用os.execute(),但将标准输出重定向到已知的临时文件,然后再读取临时文件。
    • 我使用的是 FreeBSD 8.2。关于你的第二个建议 - 你能给我一些例子来说明它应该是什么样子吗?以及表现如何?它需要大量的写作/阅读。
    • @Cyclone: 类似os.execute(command .. " >/tmp/foo") 的东西(/tmp/foo 被一个实际的有点独特的路径替换,但是你想计算它)。
    • 我可以做与问题相反的事情吗?在 os shell 中返回一个 Lua 值。
    【解决方案2】:
    function GetFiles(mask)
       local files = {}
       local tmpfile = '/tmp/stmp.txt'
       os.execute('ls -1 '..mask..' > '..tmpfile)
       local f = io.open(tmpfile)
       if not f then return files end  
       local k = 1
       for line in f:lines() do
          files[k] = line
          k = k + 1
       end
       f:close()
       return files
     end
    

    【讨论】:

      【解决方案3】:

      Lua 的os.capture 返回所有标准输出,因此会返回到那个变量中。

      例子:

      local result = os.capture("echo hallo")
      print(result)
      

      印刷:

      hallo
      

      【讨论】:

      【解决方案4】:

      对不起, 但这是不可能的。 如果 echo 程序成功退出,它将返回 0。这个返回码也是 os.execute() 函数获取并返回的。

      if  0 == os.execute("echo 'test'") then 
          local t = "test"
      end
      

      这是一种得到你想要的东西的方法,我希望它对你有帮助。

      获取函数返回码的另一个技巧是 Lua 引用。 Lua-Reference/Tutorial

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-13
        • 2012-12-13
        • 2012-10-27
        • 2011-08-27
        • 2014-02-11
        • 1970-01-01
        • 2015-05-17
        • 1970-01-01
        相关资源
        最近更新 更多