Ruby tem vários métodos e classes de biblioteca padrão para implementar canais de e para comandos externos ( Open3
e spawn
por exemplo). No entanto, eles são de baixo nível, e você acaba implementando muita lógica por conta própria se quiser fazer algo complicado.
Recentemente, lancei uma gema chamada Magritte para facilitar o gerenciamento de um subprocesso com tubos bidirecionais. Espera-se que a entrada seja um IO
, enquanto a saída pode ser um IO
ou um bloco Ruby. Existe uma LineBuffer
classe para facilitar o manuseio da saída linha por linha. Aqui está um exemplo de código:
Magritte::Pipe.from_input_file('some.txt')
.separated_by("rn")
.line_by_line
.out_to { |data| puts data }
.filtering_with('grep "relistan"')
Usar o Magritte é tão fácil quanto adicioná-lo ao seu Gemfile
computador ou executar gem install magritte
.