Я пытаюсь сделать exec
процесс оболочки таким образом, что его стандартный вывод имеет префикс с идентификатором.Ruby - Использование Kernel.exec с настраиваемым STDOUT
Мой подход заключается в написании пользовательского IO
объект, который повторно реализует write
, передавая ей в качестве аргумента :out
exec
(документально под Process::spawn).
require "delegate"
class PrefixedStdout < DelegateClass(IO)
def initialize(prefix, io)
@prefix = prefix
super(io)
end
def write(str)
super("#{@prefix}: #{str}")
end
end
pr_stdout = PrefixedStdout.new("my_prefix", $stdout)
pr_stdout.write("hello\n") # outputs "my_prefix: hello"
exec("echo hello", out: pr_stdout) # outputs "hello"
Как-то exec
обходит PrefixedStdout#write
и вызывая $stdout.write
непосредственно. Как мне заставить exec
использовать мой префиксный поток вывода в качестве его stdout?
Я не думаю, что этот подход может работать - то, что передается вашему дочернему процессу, является базовым дескриптором файла unix. (вы можете прочитать из этого файлового дескриптора, а затем записать на нужный конечный результат, добавив, какие префиксы вам нужны) –
Спасибо, я думаю, это имеет смысл. 'pr_stdout.fileno' равно 1, что является стандартным. Не могли бы вы немного расширить свое альтернативное решение? – rickyrickyrice