Ruby, Difference between exec, system and %x() or Backticks
下面的Ruby方法有什么区别?
exec、system和%x()或backticks
我知道它们被用于通过Ruby以编程方式执行终端命令,但我想知道为什么有三种不同的方法可以做到这一点。
- 这些命令以及许多其他命令在docs:exec系统备份中解释得很好。
- 关于这个主题有一篇很棒的RubyQuickTips文章:执行shell命令。
- 因为有人刚刚发现了这个旧线程,"使用Unix进程"对于那些对这个主题感兴趣的Ruby来说是一本很好的书:使用unix processes.com
- 我很惊讶没有一个答案提到sh。
- @丹尼斯,当我提出这个问题时,鲁比1.9.3*还没有发布。
- @丹尼斯·什用一个壳(可能是$shell)包住你要跑的任何东西。如果有用/必要,请有人解释:)
系统
该系统system方法调用的程序。你必须提供在本命令的字符串参数的方法。例如:
1 2 3
| >> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true |
该项目将使用当前的STDIN被STDOUTSTDERR对象,和你的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 |
- 对于调用如何处理STDIN、STDOUT、STDERR的更细粒度控制,请考虑Open3.popen3;例如,请参见stackoverflow.com/a/10922097/258662。
- @普拉茨-解释得很好。谢谢您。
- 谢谢,补充说。@ cBeTeTigg
- 感谢您提到backticks支持字符串插值,这解决了我的问题。
这是基于对flowchart这个答案。国有企业也利用scriptemulate,到终端。
- 这并不简单。在我的例子中,"可以(并且需要)阻止直到进程完成",然后使用popen3检查stdout/stderr输出。
- 通过将非阻塞调用包装在while循环中,可以始终使其(有效地)阻塞。你不能这么容易地将阻塞调用转换成非阻塞调用。
他们不同的东西。execreplaces当前流程和新流程和从来没有回报。一个过程和它的systeminvokes退出返回值到当前的进程。一个过程和使用backticks invokes收益这一过程的输出(电流的过程。