Получение статуса возврата И вывод программы - PullRequest
10 голосов
/ 30 сентября 2011

Мне нужно использовать Lua для запуска двоичной программы, которая может записать что-то в свой стандартный вывод, а также вернуть код состояния (также известный как " exit status ").

Я искал в Интернете и не мог найти то, что делает то, что мне нужно. Однако я узнал, что в Lua:

  • os.execute() возвращает код состояния
  • io.popen() возвращает обработчик файла, который можно использовать для чтения выходных данных процесса

Однако мне нужны оба. Написание функции-обертки, которая запускает обе функции за сценой, не вариант из-за накладных расходов процесса и, возможно, изменений в результате при последовательных запусках. Мне нужно написать такую ​​функцию:

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

У кого-нибудь есть идеи, как решить эту проблему?

PS. целевая система называется Linux.

Ответы [ 5 ]

12 голосов
/ 25 декабря 2012

С LUA 5.2 я могу сделать следующее, и это работает

-- This will open the file
local file = io.popen('dmesg')
-- This will read all of the output, as always
local output = file:read('*all')
-- This will get a table with some return stuff
-- rc[1] will be true, false or nil
-- rc[3] will be the signal
local rc = {file:close()}

Надеюсь, это поможет ...

2 голосов
/ 07 марта 2017

Я не могу использовать 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
2 голосов
/ 30 сентября 2011

Эта функциональность предоставляется в C: pclose.

После успешного возврата pclose () возвращает статус завершения переводчика командного языка.

Переводчик возвращает статус завершения своего дочернего элемента.

Но Lua не делает этого правильно (io.close всегда возвращает true). Я не копался в этих темах, но некоторые люди жалуются на это повреждение мозга.

1 голос
/ 30 сентября 2011

Если вы запускаете этот код на Win32 или в среде POSIX, вы можете попробовать это расширение Lua: http://code.google.com/p/lua-ex-api/

В качестве альтернативы, вы можете написать небольшой скрипт оболочки (при условии, что доступен bash или аналогичный)) что:

  • выполняет правильный исполняемый файл, записывая код выхода в переменную оболочки,
  • печатает символ новой строки и символ / строку терминала на стандартном выводе
  • значение переменных оболочки (код выхода) на стандартном out

Затем перехватите все выходные данные io.popen и выполните анализ в обратном направлении.

Полное раскрытие: я не Luaразработчик.

0 голосов
/ 09 марта 2017

да, вы правы в том, что os.execute() имеет возвраты, и это очень просто, если вы понимаете, как выполнить вашу команду с и без lua, вы также можете узнать, сколько переменных она возвращает, и это может занять некоторое время,но я думаю, что вы можете попробовать

local a, b, c, d, e=os.execute(-what ever your command is-)

для моего примера a - первый возвращенный аргумент, b - второй возвращенный аргумент и т. д. Я думаю, что я правильно ответил на ваш вопрос, исходя из того, кто вы естьспрашивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...