Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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 与backticks运算符等效,能够在执行期间显示输出_Ruby - Fatal编程技术网

Ruby 与backticks运算符等效,能够在执行期间显示输出

Ruby 与backticks运算符等效,能够在执行期间显示输出,ruby,Ruby,我正在寻找与backticks操作符(``)等价的东西,它能够在shell命令执行期间显示输出 我在另一篇帖子中看到了一个解决方案: () output=[] IO.popen(“ruby-e'3.times{| i | pi;sleep 1}”)。每个do |行| p.line.chomp 输出尝试以下操作: output = [] IO.popen("ruby -e '3.times{|i| p i; sleep 1 }'") do |f| f.each do |line| p

我正在寻找与backticks操作符(``)等价的东西,它能够在shell命令执行期间显示输出

我在另一篇帖子中看到了一个解决方案: ()

output=[]
IO.popen(“ruby-e'3.times{| i | pi;sleep 1}”)。每个do |行|
p.line.chomp
输出尝试以下操作:

output = []
IO.popen("ruby -e '3.times{|i| p i; sleep 1 }'") do |f|
  f.each do |line|
    p line.chomp
    output << line.chomp
  end
end
p $?
output=[]
IO.popen(“ruby-e'3.times{| i | pi;sleep 1}”)do | f|
f、 每行|
p.line.chomp

输出首先,我建议使用中的一种方法

我的一个系统需要获取许多命令行应用程序的STDOUT和STDERR的输出

如果需要管道子进程,请尝试
popen3
或其他“管道”命令之一

这里有一些代码来说明如何使用
popen2
,它忽略了STDERR频道。如果您还想跟踪,请使用
popen3

require 'open3'

output = []

exit_status = Open3.popen2(ENV, "ruby -e '3.times{|i| p i; sleep 1}'") { |stdin, stdout, thr|
  stdin.close
  stdout.each_line do |o|
    o.chomp!
    output << o
    puts %Q(Read from pipe: "#{ o }")
  end
  thr.value
}

puts "Output array: #{ output.join(', ') }"
puts "Exit status: #{ exit_status }"
示例代码显示了一种方法

不必使用
每行
,但这演示了如何逐行读取,直到子进程关闭其标准输出


capture3
不接受块;它等待直到子进程关闭输出并退出,然后返回内容,这在需要阻塞进程时非常有用
popen2
popen3
有阻塞版本和非阻塞版本,但我在这里只展示了非阻塞版本,以演示如何读取和输出从子流程中输入的内容。

您可以使用capture3(和两个不同的数组)将执行上述相同任务的代码放入其中吗?您的代码没有两个不同的数组,它只有一个。
"0"
"1"
"2"
#<Process::Status: pid 2501 exit 0>
require 'open3'

output = []
Open3.popen2("ruby -e '3.times{|i| p i; sleep 1}'") do |stdin,stdout,wait_thr|
  stdout.each do |line|
    p line.chomp
    output << line.chomp
  end
  p wait_thr.value
end
require 'open3'

output = []

exit_status = Open3.popen2(ENV, "ruby -e '3.times{|i| p i; sleep 1}'") { |stdin, stdout, thr|
  stdin.close
  stdout.each_line do |o|
    o.chomp!
    output << o
    puts %Q(Read from pipe: "#{ o }")
  end
  thr.value
}

puts "Output array: #{ output.join(', ') }"
puts "Exit status: #{ exit_status }"
Read from pipe: "0"
Read from pipe: "1"
Read from pipe: "2"
Output array: 0, 1, 2
Exit status: pid 43413 exit 0