我不明白的Popen示例

时间:2019-02-22 13:29:32

标签: ruby popen

到目前为止,我对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模式下,{{1}的STDOUT将是管道popen.rb的{​​{1}} (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

现在,我不明白子进程(即ssh)的hostname如何可用于父进程,即STDOUT如何在这里工作,而在我以前的版本中却不工作例子。

谢谢

1 个答案:

答案 0 :(得分:1)

区别在于popen的第二个参数:"w""w+"。您可以阅读更多here in the docs

  

“ w”只写,截断现有文件        长度为零或创建一个新文件进行写入。

     

“ w +”读写,将现有文件截断为零长度        或创建一个用于读写的新文件。

“截断”的概念并不真正适用于管道,但实际上您需要读写模式。