有些时候我们需要在脚本中执行一个系统命令或运行一个外部程序,Ruby也提供了这样的功能,有如下三种方法可以在Ruby中运行外部程序:
1. `command`
直接使用`(键盘上Esc下边那个按键)把一个字符串括起来,Ruby会把该字符串当成是一个外部应用调用,等待执行命令的子进程结束并返回应用的输出。在执行command之前,Ruby会先处理command中的反斜杠逃逸符和展开式#{}。在命令返回之后,可以使用$?变量来查看子进程PID和返回值:
command = "ls" ret = `#{command}` puts "$?" 输出: pid 24331 exit 0
2. %x命令输出表示法
%x!command!同`command`的功能一样,其中!可以被任意非字母、数字的字符替换,比如%x(),%x**,甚至可以用换行符(回车)来替代!。%x表示法同样会处理command中的反斜杠和展开式:
command = "ls" ret = %x #{command}
3. Kernel.system(cmd, [arg1, [arg2[, ...]]])
system(command)函数只能执行外部应用,却不会返回命令的输出,如果不需要命令的数出的话可以使用这种方法。system(command)返回的是子进程的结束状态,如果子进程正常退出(exit 0)则system返回true,否则返回false。同样可以利用$?来查看具体的返回值:
command = “touch a.rb"
ret = system(command)
4. Kernel.spawn(cmd, [arg1, [arg2[, ...]]])
同样是运行外部应用,spawn函数并不会等待子进程结束(1. 2. 3. 三种方法都会等待子进程结束),而是直接返回子进程的PID:
# a.rb 只有一行 puts "hello" ret = spawn("ruby", "a.rb") puts "R:#{ret}" 输出: R:24524 hello