system
The system http://www.ruby-doc.org/core/Kernel.html#method-i-system方法调用系统程序。您必须将该命令作为字符串参数提供给此方法。例如:
>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true
被调用的程序将使用当前的STDIN
, STDOUT
and STDERR
Ruby 程序的对象。事实上,实际的返回值是true
, false
or nil
。在示例中,日期是通过 IO 对象打印的STDIN
。该方法将返回true
如果进程以零状态退出,false
如果进程以非零状态退出并且nil
如果执行失败。
从 Ruby 2.6 开始,通过exception: true
将引发异常而不是返回false
or nil
:
>> system('invalid')
=> nil
>> system('invalid', exception: true)
Traceback (most recent call last):
...
Errno::ENOENT (No such file or directory - invalid)
另一个副作用是全局变量$?
被设置为Process::Status http://www.ruby-doc.org/core/Process/Status.html目的。该对象将包含有关调用本身的信息,包括被调用进程的进程标识符(PID)和退出状态。
>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>
反引号
反引号 http://www.ruby-doc.org/core/Kernel.html#method-i-60(``) 调用系统程序并返回其输出。与第一种方法相反,该命令不是通过字符串提供的,而是通过将其放在反引号对中提供的。
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013
全局变量$?
也是通过反引号设置的。通过反引号,您还可以使用字符串插值。
%x()
Using %x
是反引号样式的替代方案。它也会返回输出。就像它的亲戚一样%w
and %q
(除其他外),只要括号式分隔符匹配,任何分隔符就足够了。这意味着%x(date)
, %x{date}
and %x-date-
都是同义词。就像反引号一样%x
可以利用字符串插值。
exec
通过使用Kernel#exec http://www.ruby-doc.org/core/Kernel.html#method-i-exec当前进程(您的 Ruby 脚本)被替换为通过调用的进程exec
。该方法可以采用字符串作为参数。在这种情况下,字符串将受到 shell 扩展的影响。当使用多个参数时,第一个参数用于执行程序,以下参数作为参数提供给要调用的程序。
Open3.popen3
有时所需的信息会写入标准输入或标准错误,您也需要控制这些信息。这里Open3.popen3 http://ruby-doc.org/stdlib-2.3.1/libdoc/open3/rdoc/Open3.html#method-c-popen3派上用场:
require 'open3'
Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end