如果我调用一个命令使用内核#系统在Ruby中,我如何得到它的输出?

system("ls")

当前回答

我发现下面是有用的,如果你需要返回值:

result = %x[ls]
puts result

我特别想列出我的机器上所有Java进程的pid,并使用以下方法:

ids = %x[ps ax | grep java | awk '{ print $1 }' | xargs]

其他回答

你可以用反勾号:

`ls`

我在这里没有找到这个,所以添加它,我有一些问题得到完整的输出。

您可以重定向STDERR到STDOUT,如果您想捕获STDERR使用 撇号。 输出= ' grep hosts /private/etc/* 2>&1 '

来源:http://blog.bigbinary.com/2012/10/18/backtick-system-exec-in-ruby.html

将标准输出捕获到名为val的变量中最简单的解决方案:

val = capture(:stdout) do
  system("pwd")
end

puts val

缩短版本:

val = capture(:stdout) { system("ls") }

捕获方法由 active_support / core_ext /内核/ reporting.rb

类似地,我们也可以用:stderr捕获标准错误

puts `date`
puts $?


Mon Mar  7 19:01:15 PST 2016
pid 13093 exit 0

如果你需要转义参数,在Ruby 1.9 IO中。Popen也接受数组:

p IO.popen(["echo", "it's escaped"]).read

在早期版本中,你可以使用Open3.popen3:

require "open3"

Open3.popen3("echo", "it's escaped") { |i, o| p o.read }

如果你还需要传递stdin,这应该在1.9和1.8中都有效:

out = IO.popen("xxd -p", "r+") { |io|
    io.print "xyz"
    io.close_write
    io.read.chomp
}
p out # "78797a"