При написании lua скрипта наткнулся на одну вещь: io.popen, судя по документации не может передать одновременно дескрипторы stdin и stdout запускаемого процесса.
Пример проблемного кода:
cmdexecute = function(cmd, input)
local f = io.popen(cmd, "w");
if tostring(input) ~= nil then
f:write(tostring(input));
end;
local l = f:read("*a");
f:close();
return (l);
end;
if cmdexecute('xargs ps', 'aux') ~= nil then
print 'ps aux что-то выдал';
else
print 'ps aux промолчал';
end;
Результат выполнения:
Длинный-длинный вывод ps aux...
ps aux промолчал
А должно быть по идее:
ps aux что-то выдал
Вопрос: как получить дескрипторы и stdin, и stdout из popen? Или, возможно, есть какое-то другое решение задачи, без io.popen?
Upd: по причине актуальности вопроса поясняю: решения с ffi допустимы
Ответ
Вам должен помочь модуль lua-subprocess
Функция subprocess.popen принимает последним аргументом таблицу с именованными опциями. Среди них есть опции stdin, stdout и stderr, куда можно передать строку (имя файла), число (системный дескриптор файла), файловый объект или специальную константу subprocess.PIPE, которая создаст пайп для этого потока и сохранит его в возвращаемом объекте.
Комментариев нет:
Отправить комментарий