Ruby,exec、system和%x()之间的差异或反勾号

以下Ruby方法之间有什么区别

execsystem%x()反勾号

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

系统

system方法调用系统程序。必须将该命令作为字符串参数提供给此方法。例如:

&gt&燃气轮机;系统(“日期”)
2013年9月4日星期三22:03:44 CEST
=>符合事实的

被调用的程序将使用Ruby程序的当前STDINSTDOUTSTDERR对象。实际上,实际返回值是truefalsenil。在本例中,日期是通过STDIN的IO对象打印的。如果进程以零状态退出,则该方法将返回true;如果进程以非零状态退出,则返回false;如果执行失败,则返回nil

从Ruby 2.6开始,传递exception:true将引发异常,而不是返回falsenil

&gt&燃气轮机;系统('无效')
=>无
&燃气轮机&燃气轮机;系统('invalid',异常:true)
回溯(最近一次呼叫最后一次):
...
Errno::enoint(没有这样的文件或目录-无效)

另一个副作用是全局变量$?被设置为Process::Status对象。此对象将包含有关调用本身的信息,包括被调用进程的进程标识符(PID)和退出状态

&gt&燃气轮机;系统(“日期”)
2013年9月4日星期三22:11:02 CEST
=>符合事实的
&燃气轮机>$?
=&gt#&书信电报;流程::状态:pid 15470退出0>

反勾号

Backticks(“)调用系统程序并返回其输出。与第一种方法相反,命令不是通过字符串提供的,而是通过将其放入backticks对中来提供的

&gt&燃气轮机`日期`
=>2013年9月4日星期三22:22:51 CEST

全局变量$?也通过反勾号设置。对于反勾号,还可以使用字符串插值

%x()

使用%x是backticks样式的替代方法。它也将返回输出。与它的亲属%w%q(除其他外)一样,只要括号样式的分隔符匹配,任何分隔符都足够了。这意味着%x(日期)%x{date}%x-date-都是同义词。像backticks%x一样,可以使用字符串插值

exec

通过使用Kernel#exec将当前进程(您的Ruby脚本)替换为通过exec调用的进程。该方法可以将字符串作为参数。在这种情况下,字符串将进行shell扩展。当使用多个参数时,第一个参数用于执行程序,以下参数作为要调用的程序的参数提供

Open3.popen3

有时,所需的信息会写入标准输入或标准错误,您还需要控制这些信息。这里Open3.popen3很方便:

需要“open3”
Open3.popen3(“卷曲http://example.com&quot|)do | stdin、stdout、stderr、thread|
pid=thread.pid
放置stdout.read.chomp
终止

发表评论