我想在ruby中运行一个shell脚本,该脚本在不退出的情况下产生一些输出,一个简单的例子是:
o = IO.popen(%Q[ while : ; do echo hi ; sleep 0.1 ; done ]).read
p o
如您所见,shell脚本包含一个while循环,该循环一直持续到被杀死为止。的echo hi
同时与while循环链产生无穷标准输出。
我希望Ruby"hi\n"
只要运行Shell脚本就可以读取echo生成的流输出并显示给标准输出。
以perl为例:
open (IN, "while : ; do echo hi ; sleep 0.1 ; done |") ;
my $i = 0 ;
while (<IN>) {
print($i++ . ' - ' . $_) ;
}
输出:
$ perl p.pl -W
0 - hi
1 - hi
2 - hi
3 - hi
4 - hi
5 - hi
6 - hi
7 - hi
8 - hi
9 - hi
10 - hi
11 - hi
12 - hi
13 - hi
...
...
...
该perl脚本正确显示了流输出,并在前面加上了variable的值$i
。有没有办法在Ruby中做同样的事情?
您在Ruby中的循环:
io = IO.popen(%Q[ while : ; do echo hi ; sleep 0.1 ; done ])
i = 0
while io.gets
puts "#{i} - #{$_}"
i += 1
end
或更惯用:
IO.popen(%Q[ while : ; do echo hi ; sleep 0.1 ; done ]) do |io|
io.each_line.with_index do |line, i|
puts "#{i} - #{line}"
end
end
您可能需要$stdout.sync = true
在将脚本输出传递到另一个进程时进行设置。(Ruby在不写入TTY时缓冲输出)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句