如果我调用一个命令使用内核#系统在Ruby中,我如何得到它的输出?
system("ls")
如果我调用一个命令使用内核#系统在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[..]]。