Ruby中调用执行shell命令的6种方法
程序员文章站
2022-11-14 22:08:13
碰到需要调用操作系统shell命令的时候,ruby为我们提供了六种完成任务的方法:
1.exec方法:
kernel#exec方法通过调用指定的命令取代当前进程例子:...
碰到需要调用操作系统shell命令的时候,ruby为我们提供了六种完成任务的方法:
1.exec方法:
kernel#exec方法通过调用指定的命令取代当前进程例子:
复制代码 代码如下:
$ irb
>> exec 'echo "hello $hostname"'
hello nate.local
$
值得注意的是,exec方法用echo命令来取代了irb进程从而退出了irb。主要的缺点是,你无法从你的ruby脚本里知道这个命令是成功还是失败。
2.system方法
kernel#system方法操作命令同上, 但是它是运行一个子shell来避免覆盖当前进程。如果命令执行成功则返回true,否则返回false。
复制代码 代码如下:
$ irb
>> system 'echo "hello $hostname"'
hello nate.local
=> true
>> system 'false'
=> false
>> puts $?
256
=> nil
>>
3.反引号(backticks,esc键下面那个键)
复制代码 代码如下:
$ irb
>> today = `date`
=> "mon mar 12 18:15:35 pdt 2007n"
>> $?
=> #<process::status: pid=25827,exited(0)>
>> $?.to_i
=> 0
这种方法是最普遍的用法了。它也是运行在一个子shell中。
4.io#popen
复制代码 代码如下:
$ irb
>> io.popen("date") { |f| puts f.gets }
mon mar 12 18:58:56 pdt 2007
=> nil
5.open3#popen3
复制代码 代码如下:
$ irb
>> stdin, stdout, stderr = open3.popen3('dc')
=> [#<io:0x6e5474>, #<io:0x6e5438>, #<io:0x6e53d4>]
>> stdin.puts(5)
=> nil
>> stdin.puts(10)
=> nil
>> stdin.puts("+")
=> nil
>> stdin.puts("p")
=> nil
>> stdout.gets
=> "15n"
6.open4#popen4
复制代码 代码如下:
$ irb
>> require "open4"
=> true
>> pid, stdin, stdout, stderr = open4::popen4 "false"
=> [26327, #<io:0x6dff24>, #<io:0x6dfee8>, #<io:0x6dfe84>]
>> $?
=> nil
>> pid
=> 26327
>> ignored, status = process::waitpid2 pid
=> [26327, #<process::status: pid=26327,exited(1)>]
>> status.to_i
=> 256