До сих пор у меня было базовое понимание popen
, но, похоже, оно полностью изменилось.Пожалуйста, обратитесь к примеру, чтобы узнать почему?
# process.rb
IO.popen("ruby test_ex.rb","w") do |io|
io.write("#{Process.pid} hello")
io.close_write
## this does not work.
##io.readlines
end
## text_ex.rb
def readWrite
@string = gets()
puts "#{Process.pid} -- #{@string}"
end
readWrite
Теперь я понимаю, что в режиме write
STDOUT
(из popen.rb
) будет writable end
из трубы и STDIN
(из text_ex.rb
) будут readable end
из трубы .
Здесь все хорошо.
Но давайте посмотрим на другой пример
my_text = IO.popen("ssh user@host 'bash'", "w+")
my_text.write("hostname")
my_text.close_write
my_rtn = my_text.readlines.join('\n')
my_text.close
puts my_rtn
Хорошо, теперь что здесь отличается?popen
запускает дочерний процесс (т. Е. ssh
) отправляет hostname
.
Теперь я не понимаю, как STDOUT
дочернего процесса (т. Е. Ssh) доступен дляродительский процесс, т.е. как readlines
работает здесь и не работает в моем предыдущем примере.
Спасибо