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

system("ls")

当前回答

正如Simon Hürlimann已经解释过的,Open3比反撇号等更安全。

require 'open3'
output = Open3.popen3("ls") { |stdin, stdout, stderr, wait_thr| stdout.read }

注意,块表单将自动关闭stdin, stdout和stderr-否则它们必须显式关闭。

其他回答

我想扩展和澄清一下混沌的答案。

如果你用反勾号包围命令,那么你根本不需要(显式地)调用system()。反勾号执行命令并以字符串形式返回输出。然后你可以像这样把值赋给一个变量:

output = `ls`
p output

or

printf output # escapes newline chars

你可以用反勾号:

`ls`
puts `date`
puts $?


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

另一种方法是:

f = open("|ls")
foo = f.read()

注意,这是open中“ls”前面的“pipe”字符。这也可用于将数据送入程序的标准输入以及读取其标准输出。

您可以使用system()或%x[],这取决于您需要什么样的结果。

System()如果找到命令并成功运行,则返回true,否则返回false。

>> s = system 'uptime'
10:56  up 3 days, 23:10, 2 users, load averages: 0.17 0.17 0.14
=> true
>> s.class
=> TrueClass
>> $?.class
=> Process::Status

% x [. .]另一方面,将命令的结果保存为字符串:

>> result = %x[uptime]
=> "13:16  up 4 days,  1:30, 2 users, load averages: 0.39 0.29 0.23\n"
>> p result 
"13:16  up 4 days,  1:30, 2 users, load averages: 0.39 0.29 0.23\n"
>> result.class
=> String

Jay Fields的博客文章详细解释了system、exec和%x[..]]。