到目前为止,我对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
如何在这里工作,而在我以前的版本中却不工作例子。
谢谢
答案 0 :(得分:1)
区别在于popen
的第二个参数:"w"
与"w+"
。您可以阅读更多here in the docs:
“ w”只写,截断现有文件 长度为零或创建一个新文件进行写入。
“ w +”读写,将现有文件截断为零长度 或创建一个用于读写的新文件。
“截断”的概念并不真正适用于管道,但实际上您需要读写模式。