gpt4 book ai didi

ruby - 如何将值通过管道传递给 popen3

转载 作者:数据小太阳 更新时间:2023-10-29 08:47:35 24 4
gpt4 key购买 nike

我想将某些内容通过管道传输到命令中。类似`echo "test"| 的东西命令 somearg”。

我的第一种方法是像这样写入标准输入:

Open3.popen3(cmd) do |stdin, stdout, stderr, wait|
stdin.puts("test")
end

...但显然这是行不通的。

那么如何将一个值通过管道传输到命令中(并保留读取标准输出/错误的可能性)?

最佳答案

使用这个:

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 ):

You should be careful to avoid deadlocks. Since pipes are fixed length buffers, ::popen3(“prog”) {|i, o, e, t| o.read } deadlocks if the program generates too much output on stderr. You should read stdout and stderr simultaneously (using threads or IO.select). However, if you don’t need stderr output, you can use ::popen2. If merged stdout and stderr output is not a problem, you can use ::popen2e. If you really need stdout and stderr output as separate strings, you can consider ::capture3.

关于ruby - 如何将值通过管道传递给 popen3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23025620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com