Ruby 如何将值导入popen3
我想在命令中插入一些内容。 类似于“echo”测试“|cmd somearg”的东西 我的第一个方法是这样写给stdin:Ruby 如何将值导入popen3,ruby,Ruby,我想在命令中插入一些内容。 类似于“echo”测试“|cmd somearg”的东西 我的第一个方法是这样写给stdin: Open3.popen3(cmd) do |stdin, stdout, stderr, wait| stdin.puts("test") end …但这显然不起作用 那么,如何将一个值导入命令(并保留读取stdout/err的可能性)?使用以下方法: Open3.popen3(cmd) do |stdin, stdout, stderr, wait| stdin
Open3.popen3(cmd) do |stdin, stdout, stderr, wait|
stdin.puts("test")
end
…但这显然不起作用
那么,如何将一个值导入命令(并保留读取stdout/err的可能性)?使用以下方法:
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
此外,请务必记住文档()中的以下摘录:
你应该小心避免死锁。因为管道是固定长度的
缓冲区::popen3(“prog”){| i,o,e,t | o.read}死锁,如果
程序在stderr上生成的输出太多。您应该阅读stdout
和stderr同时进行(使用线程或IO.select)
您不需要stderr输出,可以使用::popen2
并且stderr输出不是问题,您可以使用::popen2e
确实需要将stdout和stderr输出作为单独的字符串,您可以
考虑::Copr3.3./P>
没有-不幸的是,这不起作用。我认为现在填充stdin已经太晚了,无法具有与
echo“test”|cmd
Meh相同的行为-缺少一个选项,因此cmd将接受stdin。因此-这确实起作用。