Czy istnieje zautomatyzowany sposób na wykonywanie rurociągów w powłoce Ruby? Próbuję przekonwertować następujący kod powłoki Ruby:Ruby pipes: Jak powiązać wyjście dwóch podprocesów?
a | b | c... > ...
ale jedyne rozwiązanie znalazłem tak daleko jest do zrobienia zarządzanie buforami siebie (uproszczony, niesprawdzone, mam nadzieję, że dostanie mi chodzi po drugiej):
a = IO.popen('a')
b = IO.popen('b', 'w+')
Thread.new(a, b) { |in, out|
out.write(in.readpartial(4096)) until in.eof?
out.close_write
}
# deal with b.read...
Sądzę, że to, czego szukam, jest sposobem na to, aby popen użył istniejącego strumienia, zamiast tworzyć nowy? Lub alternatywnie metoda scalania IO # do podłączenia wyjścia A do wejścia b? Moje obecne podejście staje się raczej nieporęczne, gdy rośnie liczba filtrów.
Wiem oczywiście o Kernel#system('a | b')
, ale muszę mieszać filtry Ruby z zewnętrznymi filtrami programowymi w sposób ogólny.
Istnieje jedno rozwiązanie z poleceniem spawn w ruby. Powinieneś otworzyć kilka potoków, a następnie użyć opcji odradzania, aby przekierować Stdin i Stdout procesów potomnych. Możesz znaleźć bardziej szczegółowy przykład w mojej odpowiedzi tutaj: http://stackoverflow.com/questions/11898528/marshal-ruby-pipes-sending-serialized-object-to-child-processes/13258047#13258047 –
Rurociągi Open3 wyglądają ładnie idealny https://ruby-doc.org/stdlib-2.4.1/libdoc/open3/rdoc/Open3.html#method-c-pipeline_rw – kch