我想把一些东西输送到命令中。类似于“回声”的东西测试“cmd somearg”。
我的第一个方法是这样写:
Open3.popen3(cmd) do |stdin, stdout, stderr, wait|
stdin.puts("test")
end...but,显然这不起作用。
那么,如何将值导入命令(并保留读取stdout/err的可能性)?
发布于 2014-04-12 03:28:15
用这个:
Open3.popen3(cmd) do |stdin, stdout, stderr, wait|
stdin.puts("test")
stdin.close
# unless (err = stderr.read).empty? then raise err end
stdout.read
end这里要注意的是,您需要关闭(或者可能刷新) stdin,这样popen3才能将它提供给命令。然后,您可以以简单的方式读取stdout。
另外,确保记住文档(Open3#popen3)中的以下摘录:
你应该小心避免死锁。由于管道是固定长度的缓冲区,::popen3 3(“prog”){ much,o,e,t o.read }死锁,如果程序在stderr上生成过多的输出。您应该同时阅读stdout和stderr (使用线程或IO.select)。但是,如果不需要stderr输出,则可以使用::popen2 2。如果合并的stdout和stderr输出不是问题,则可以使用::popen2e。如果您确实需要将stdout和stderr输出作为单独的字符串,则可以考虑::capture3 3。
https://stackoverflow.com/questions/23025620
复制相似问题