Ruby,exec,system和%x()或Backticks之间的区别

Ruby, Difference between exec, system and %x() or Backticks

下面的Ruby方法有什么区别?

execsystem%x()或backticks

我知道它们被用于通过Ruby以编程方式执行终端命令,但我想知道为什么有三种不同的方法可以做到这一点。


系统

该系统system方法调用的程序。你必须提供在本命令的字符串参数的方法。例如:

1
2
3
>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true

该项目将使用当前的STDINSTDOUTSTDERR对象,和你的Ruby程序。在目前的调查,返回值是一truefalsenil或,或。在该日期的例子是通过IO STDIN印制对象。该方法将返回true如果过程exited与零状态,如果exited false过程具有非零状态和nil如果执行失败。

那是另一个侧面对全球变$?Process::Status设置到对象。这个对象将包含的信息有关的呼叫本身,包括进程标识符(PID)的被处理的退出状态。

1
2
3
4
5
>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>

backticks

backticks(`)和返回的呼叫系统程序的输出。两喷嘴对置的第一方法,该命令是不提供通用的字符串,但它在backticks对推杆果岭。

1
2
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013

设置全局变量$?通过backticks,太。你也可以使用与backticks串种。

X(%)

是一种利用%xbackticks另类的风格。它将返回输出,太。%w及其亲属和%q样(在任何其他的delimiter),将suffice龙delimiters支架式的比赛。这%x(date)%x{date}均值,和%x-date-都是同义词。样可以使backticks %x串种的使用。

Exec的

利用当前的过程Kernel#exec(你的Ruby脚本的过程)是通过exec被替换。该方法可以将字符串参数。在这个案例的主题字符串将外壳扩展。当使用一个以上的第一个参数,然后是用来执行以下的程序和提供程序是被支配的。

open3.popen3

有时所需的信息是写在标准输入和标准误差,你需要比那些得到控制的目的。你在这里Open3.popen3方便:

1
2
3
4
5
6
require 'open3'

Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
   pid = thread.pid
   puts stdout.read.chomp
end


这是基于对flowchart这个答案。国有企业也利用scriptemulate,到终端。

enter image description here


他们不同的东西。execreplaces当前流程和新流程和从来没有回报。一个过程和它的systeminvokes退出返回值到当前的进程。一个过程和使用backticks invokes收益这一过程的输出(电流的过程。