以下Ruby方法之间有什么区别
exec、system和%x()或反勾号
我知道它们用于通过Ruby以编程方式执行终端命令,但我想知道为什么有三种不同的方法来实现这一点
系统
system方法调用系统程序。必须将该命令作为字符串参数提供给此方法。例如:
>&燃气轮机;系统(“日期”)
2013年9月4日星期三22:03:44 CEST
=>;符合事实的
被调用的程序将使用Ruby程序的当前STDIN、STDOUT和STDERR对象。实际上,实际返回值是true、false或nil。在本例中,日期是通过STDIN的IO对象打印的。如果进程以零状态退出,则该方法将返回true;如果进程以非零状态退出,则返回false;如果执行失败,则返回nil
从Ruby 2.6开始,传递exception:true将引发异常,而不是返回false或nil:
>&燃气轮机;系统('无效')
=>;无
&燃气轮机&燃气轮机;系统('invalid',异常:true)
回溯(最近一次呼叫最后一次):
...
Errno::enoint(没有这样的文件或目录-无效)
另一个副作用是全局变量$?被设置为Process::Status对象。此对象将包含有关调用本身的信息,包括被调用进程的进程标识符(PID)和退出状态
>&燃气轮机;系统(“日期”)
2013年9月4日星期三22:11:02 CEST
=>;符合事实的
&燃气轮机>;$?
=>#&书信电报;流程::状态:pid 15470退出0>;
反勾号
Backticks(“)调用系统程序并返回其输出。与第一种方法相反,命令不是通过字符串提供的,而是通过将其放入backticks对中来提供的
>&燃气轮机`日期`
=>;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"|)do | stdin、stdout、stderr、thread|
pid=thread.pid
放置stdout.read.chomp
终止