Как получить вывод Process.exec в crystal-lang?

#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 inside Process.fork . Я хочу получить выходные Process.fork данные.

3. Затем вам понадобится несколько каналов (3, если вы хотите std{in, out, err}), с помощью которых вы можете создать один IO.pipe . Если вам нужно выполнить пользовательские действия перед выполнением вашего процесса, я бы посоветовал вам прочитать Process.run , как это реализовано, чтобы увидеть пример использования каналов для управления процессом и получения его выходных данных!

4. Здесь github.com/crystal-lang/crystal/blob /…

Ответ №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