怎么在Ruby脚本中运行命令行命令?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

有没有办法通过Ruby运行命令行命令?我正在尝试创建一个小型的Ruby程序,通过命令行程序如'screen','rcsz'等拨出和接收/发送。

如果我可以将所有这些与Ruby(MySQL后端等)绑定在一起

提问于
用户回答回答于

有几种方法可以在Ruby中运行系统命令。

irb(main):003:0> `date /t` # surround with backticks
=> "Thu 07/01/2010 \n"
irb(main):004:0> system("date /t") # system command (returns true/false)
Thu 07/01/2010
=> true
irb(main):005:0> %x{date /t} # %x{} wrapper
=> "Thu 07/01/2010 \n"

但是,如果需要使用命令的标准输入/输出实际执行输入和输出,则可能需要查看IO::popen

用户回答回答于

是。有几种方法:

一个。使用%x或''':

%x(echo hi) #=> "hi\n"
%x(echo hi >&2) #=> "" (prints 'hi' to stderr)

`echo hi` #=> "hi\n"
`echo hi >&2` #=> "" (prints 'hi' to stderr)

这些方法将返回stdout,并将stderr重定向到程序。

b.使用system

system 'echo hi' #=> true (prints 'hi')
system 'echo hi >&2' #=> true (prints 'hi' to stderr)
system 'exit 1' #=> nil

true如果命令成功,则此方法返回。它将所有输出重定向到程序。

C.使用exec

fork { exec 'sleep 60' } # you see a new process in top, "sleep", but no extra ruby process. 
exec 'echo hi' # prints 'hi'
# the code will never get here.

用当前命令创建的进程替换当前进程。

d。(ruby1.9)使用spawn

spawn 'sleep 1; echo one' #=> 430
spawn 'echo two' #=> 431
sleep 2
# This program will print "two\none".

该方法不会等待进程退出并返回PID。

使用IO.popen

io = IO.popen 'cat', 'r+'
$stdout = io
puts 'hi'
$stdout = IO.new 0
p io.read(1)
io.close
# prints '"h"'.

该方法将返回一个IO表示新进程输入/输出的对象。

F。使用Open3(在1.9.2及更高版本上)

require 'open3'

stdout,stderr,status = Open3.capture3(some_command)
STDERR.puts stderr
if status.successful?
  puts stdout
else
  STDERR.puts "OH NO!"
end

Open3有几个其他功能可以显式访问两个输出流。它类似于popen,但可以让你访问stderr。

扫码关注云+社区