Итак, я написал небольшое приложение под названием cowspeak
Он выполняет различные работы в системе GNU / Linux. Но проблема в том, что при приеме входных данных используются каналы.
Я уже реализовал прием перенаправления ввода-вывода с этим кодом:
#!/usr/bin/ruby -w
require 'timeout'
STDIN.sync = STDOUT.sync = true
pipe = false
begin
Timeout.timeout(0.000_000_000_001) do pipe = STDIN.gets end
rescue Timeout::Error
end
if pipe
print pipe
print pipe while pipe = STDIN.gets
end
Все хорошо.
Так что для echo -e "hello\nworld" | ruby cowspeak
я получаю
hello
world
Но проблема в том, что он не работает с такими программами, как irb (да, мне не нужно использовать IRB с этой программой, но я хочу узнать, как она должна работать). Рабочий пример - драгоценный камень lolcat
.
Так что для irb | ruby cowspeak
я запускаю его вечно в цикле while
(реализовано в цикле loop
в cowspeak).
Lolcat отлично работает и в этом случае!
Кроме того, такие приложения, как cmatrix , не работают с моей программой, но они работают с lolcat.
Unix-программы, такие как cowsay (который написан на Perl), также плохо работают с конвейерами - такое же поведение, как cowspeak ...
В любом случае, я вижу вопрос, заданный ранее здесь:
ruby pipe, IO и перенаправление stderr
Но он не отвечает на мой вопрос должным образом.
Как я могу реализовать перенаправление ввода-вывода с Ruby и в целом, как гем lolcat действительно работает с трубами?