Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何将值导入popen3_Ruby - Fatal编程技术网

Ruby 如何将值导入popen3

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

我想在命令中插入一些内容。 类似于“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.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。因此-这确实起作用。