#shell #process #exec #crystal-lang
#оболочка #процесс #exec #crystal-lang
Вопрос:
Мне нужно получить вывод Process.exec (не Process.run) в виде строки в crystal. Можно ли это сделать?
Я пробовал
Process.exec base, args
Но он только выводит его на консоль. Я бы хотел поместить его в переменную.
Комментарии:
1.
Process.exec
заменит текущий процесс (вашу запущенную программу) на тот, который вы укажете. Так что нет, это не то, что вы хотите. Почему бы не использоватьProcess.run
?2. @bew Ну, я использую
Process.exec
insideProcess.fork
. Я хочу получить выходныеProcess.fork
данные.3. Затем вам понадобится несколько каналов (3, если вы хотите std{in, out, err}), с помощью которых вы можете создать один
IO.pipe
. Если вам нужно выполнить пользовательские действия перед выполнением вашего процесса, я бы посоветовал вам прочитатьProcess.run
, как это реализовано, чтобы увидеть пример использования каналов для управления процессом и получения его выходных данных!
Ответ №1:
Как уже разъяснялось в комментариях, вы не можете захватить выходные данные процесса, выполняемого с помощью Process.exec
, но есть способы выполнить процесс и захватить его выходные данные.
Самый простой — обратные подсказки:
output = `echo "Hello world"`
В более сложных сценариях (например, вам нужно захватить стандартный вывод и стандартный вывод ошибок отдельно, необходимо также получить его статус или иметь больший контроль над его выполнением) вы можете использовать что-то вроде этого:
stdout = IO::Memory.new
process = Process.new("echo", ["Hello world"], output: stdout)
status = process.wait
output = stdout.to_s
или
stdout = IO::Memory.new
status = Process.run("echo", ["Hello world"], output: stdout)
output = stdout.to_s