以下Ruby方法有什么区别?
exec
,system
和%x()
或反引号
我知道它们用于通过Ruby以编程方式执行终端命令,但是我想知道为什么有三种不同的方法来执行此操作。
以下Ruby方法有什么区别?
exec
,system
和%x()
或反引号
我知道它们用于通过Ruby以编程方式执行终端命令,但是我想知道为什么有三种不同的方法来执行此操作。
Answers:
系统
该system
方法调用系统程序。您必须提供命令作为此方法的字符串参数。例如:
>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true
调用程序将使用当前的STDIN
,STDOUT
和STDERR
你的Ruby程序对象。事实上,实际的回报值是true
,false
或nil
。在示例中,日期是通过的IO对象打印的STDIN
。true
如果进程以零状态退出,false
如果进程以非零状态退出且nil
执行失败,则该方法将返回。
另一个副作用是将全局变量$?
设置为Process::Status
对象。该对象将包含有关调用本身的信息,包括被调用进程的进程标识符(PID)和退出状态。
>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>
反引号
反引号(``)调用系统程序并返回其输出。与第一种方法相反,该命令不是通过字符串提供的,而是将其放在反引号对中。
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013
全局变量$?
也是通过反引号设置的。使用反引号,您还可以使用字符串插值。
%X()
使用%x
是反引号样式的替代方法。它将也返回输出。像它的亲戚%w
和%q
其他人一样,只要括号风格的分隔符匹配,任何分隔符就足够了。这意味着%x(date)
,%x{date}
和%x-date-
都是同义词。像反引号一样%x
可以使用字符串插值。
执行
通过使用Kernel#exec
当前进程(您的Ruby脚本),将其替换为通过调用的进程exec
。该方法可以将字符串作为参数。在这种情况下,字符串将进行外壳扩展。当使用多个参数时,第一个参数用于执行程序,以下参数作为要调用的程序的参数提供。
打开3
有时,所需的信息会写到标准输入或标准错误中,您也需要对这些信息进行控制。这里Open3.popen3
就派上用场了:
require 'open3'
Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end
这是基于此答案的流程图。也参见,使用script
以模拟终端。