ruby shell 调用的六种方法

碰到需要调用操作系统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


本文出自 “悟道集” 博客,请务必保留此出处http://blackanger.blog.51cto.com/140924/43730

关于在ruby中调用shell命令,大家想必知道使用:
Ruby代码

  1. %x{'command'}
  2. command

%x{'command'}
command

然后可以通过 $? 来获取运行的状态,缺点就是无法获取运行失败后的错误信息。
Ruby代码

  1. require "open3"
  2. stdin, stdout, stderr = Open3.popen3('command')
  3. stdin.puts('')
  4. stdout.gets
  5. stderr.gets

require "open3" 
stdin, stdout, stderr = Open3.popen3('command')
stdin.puts('')
stdout.gets
stderr.gets

哈,这样就可以捕获错误信息了

这个中间是上面url包括的内容

ruby中还很多的命令行的选项,在这里将会详细讲解这些选项

请使用如下命令行启动Ruby解释器.
ruby [ option ...] [ -- ] [ programfile ] [ argument ...]

这里的"option"指下文将要提到的命令行选项中的一个。"--"则显式地表明选项字符串到此结束。"programfile"是装载Ruby脚本的文件。若省略不写或者写成"-"时,Ruby会把标准输入当做Ruby脚本进行处理。

programfile若以“#!”开始,则进行特殊的处理。详细情况请参考下文的关于解释器行。

argument中的字符串将变成内部常数ARGV的初始值。在有的环境中(Win32),标准shell不会展开通配符,这时 Ruby解释器将自行展开通配符然后赋值给ARGV。此时,可使用的通配符有“”、“?”、“[]”和“*/”(与Dir.glob不同,这里不能使用“{..}”)。在Win32环境中,若不想展开通配符的话,请使用单引号(')将参数括起来。
命令行选项

Ruby解释器可接受下列命令行选项。基本上与Perl的类似。
-0数字

以8进制数指定输入记录分隔符('$/')。

若不指定数字的话,分隔符是空字符(等同于$/="\0")。数字后面可以有其他的开关(switch)。

-00代表段落模式(等同于$/=""),-0777(因为这个代码不代表任何文字)表示将文件的全部内容一次性读入(相当于$/=nil)。
-a

与'-n'或'-p'一起使用时,可以打开自动拆分模式(auto split mode)。自动拆分模式将在各个循环前执行以下动作。
$F = $_.split

若没有同时指定'-n'或'-p'选项的话将不起作用。
-C directory

执行脚本之前,先移动到指定目录。
-c

只对脚本进行编译,而并不执行。编译后若没发现语法错误,则显示“Syntax OK”。
--copyright

显示版权信息。
-Kc

指定Ruby要处理的汉字编码。若是'E'或'e',则Ruby认定字符串或访问文件中的汉字编码为EUC。同样,若是'S'或's'的话则认定为SJIS。若是'U'或'u'则当作UTF-8处理。'N'表示不对汉字进行处理。该选项的默认值就是N(NONE)。

将来有可能会改变文字编码处理方式,届时该选项的内容也会有所变化。
-d --debug

以调试模式执行脚本。将$DEBUG设置成true。
-e script

在命令行中指定脚本。添加-e选项后,就不会从参数中抽取脚本文件名了。

若多次使用-e选项时,系统会按照以下方式处理。
下列各表达式的意义相同。 ruby -e "5.times do |i|" -e "puts i" -e "end" ruby -e "5.times do |i| puts i end" ruby -e "5.times do |i|; puts i; end" -Fregexp

将regexp指定给输入域分隔符(field separator)。
-h --help

显示命令行选项的简介。
-i[extension]

对参数中指定的文件内容进行替换(in-place edit)。原始文件将被加上扩展名并保存下来。若没有扩展名的话,将不会进行备份,而且只有替换后的文件会被保留下来。

例:
% echo matz > /tmp/junk % cat /tmp/junk matz % ruby -p -i.bak -e '$_.upcase!' /tmp/junk % cat /tmp/junk MATZ % cat /tmp/junk.bak matz -I directory

指定(追加)加载文件的路径。指定的目录将被追加到Ruby的数组变量($:)中。
-l

进行行尾自动处理。首先,将$\改为$/的值,在print输出时添加换行。若使用了-n标志或-p标志的话,将对gets读入的各行末尾进行String#chop!处理。
-n

若使用了该标志,则整个程序会像sed -n或awk一样,被
while gets ... end

括起来运行。
-p

与-n标志相仿,在各循环后输出变量$_的值。

例:
% echo matz | ruby -p -e '$_.tr! "a-z", "A-Z"' MATZ -r feature

执行脚本前,先对feature指定的库执行require操作。与'-n'选项、'-p'选项一起使用时特别奏效。
-s

对跟在脚本名后并且以'-'开头的参数进行解释,并将其值赋值给同名的全局变量。遇到以'--'开头的参数就停止解释,并将该参数从ARGV中删除。

例:

! /usr/local/bin/ruby -s # prints "true" if invoked with `-xyz' switch. print "true\n" if $xyz -S

该选项表明,当脚本名不是以'/'开头的时候,要使用环境变量PATH的值搜索脚本。若您的机器不支持#!的话,可以使用下列方法模拟#!的运行:

!/bin/sh exec ruby -S -x $0 "$@" #! ruby

因为第1行的关系,系统把脚本交给/bin/sh。/bin/sh执行第2行后启动Ruby解释器。在-x选项的作用下,Ruby解释器把从'#!'到包含'ruby'的行的内容全部读入。

根据系统的不同,$0未必包含完整路径,因此有必要使用'-S'选项来告诉Ruby在必要时搜索脚本。
-T[level]

执行不纯度测试。若给level指定了一个值之后,安全等级也会使用这个值。省略level时,其值为1。对于CGI程序来说,将其指定为-T1比较合适。$SAFE的等级也将被设定。
-v --verbose

冗长模式。启动时显示版本信息,然后将内部变量$VERBOSE设为true。当此变量为true时,众多的方法在运行时会显示冗长的信息。若只设定'-v'选项,而没有其他参数时,启动后会先显示版本信息,然后就结束运行(不会等待来自标准输入的脚本)。
--version

显示Ruby的版本信息。
-w

不显示版本信息的冗长模式。
-W[level]

ruby 1.8 特性

可以指定3种级别的冗长模式,如下所示。
-W0: 不显示警告 -W1: 只显示重要警告(默认) -W2 or -W: 显示所有警告

内部变量$VERBOSE被分别设置为nil,false,true。
-x[directory]

从message中取出脚本并执行。读入脚本的范围是从'#!'开始,直到包含'ruby'的行为止。用EOF(文件结束),^D(controlD),^Z(controlZ)或保留字_END_来指定脚本结束。

若指定了目录名的话,则在执行脚本前移动到该指定目录。
-y --yydebug

编译器调试模式。编译脚本时显示语法分析的过程。该显示过程会很漫长,可能只对那些想调试编译器的人有用。
关于解释器行

命令行指定的脚本是以'#!'开头的文件,当该行中不包含'ruby'时,将替代OS把'#!'后面的字符串看成命令行,然后启动解释器。

例如,用Ruby运行下面的shell脚本时将启动sh。

!/bin/sh -vx echo "$@"

若此行中包含'ruby'的话,则'ruby'左侧的部分将被忽略,右侧以'-'开头的部分被视为选项。

这里指定的选项将被追加到以命令行方式指定的选项之中。这主要是为了嵌入那些本该在脚本中指定的选项。例如,下面脚本的作用等价于使用命令行方式指定-Ke选项。

! ruby -Ke

文章来源于http://www.lupaworld.com

请使用如下命令行启动Ruby解释器.
ruby [ option ...] [ -- ] [ programfile ] [ argument ...]

这里的"option"指下文将要提到的命令行选项中的一个。"--"则显式地表明选项字符串到此结束。"programfile"是装载Ruby脚本的文件。若省略不写或者写成"-"时,Ruby会把标准输入当做Ruby脚本进行处理。

programfile若以“#!”开始,则进行特殊的处理。详细情况请参考下文的关于解释器行。

argument中的字符串将变成内部常数ARGV的初始值。在有的环境中(Win32),标准shell不会展开通配符,这时 Ruby解释器将自行展开通配符然后赋值给ARGV。此时,可使用的通配符有“”、“?”、“[]”和“*/”(与Dir.glob不同,这里不能使用“{..}”)。在Win32环境中,若不想展开通配符的话,请使用单引号(')将参数括起来。
命令行选项

Ruby解释器可接受下列命令行选项。基本上与Perl的类似。
-0数字

以8进制数指定输入记录分隔符('$/')。

若不指定数字的话,分隔符是空字符(等同于$/="\0")。数字后面可以有其他的开关(switch)。

-00代表段落模式(等同于$/=""),-0777(因为这个代码不代表任何文字)表示将文件的全部内容一次性读入(相当于$/=nil)。
-a

与'-n'或'-p'一起使用时,可以打开自动拆分模式(auto split mode)。自动拆分模式将在各个循环前执行以下动作。
$F = $_.split

若没有同时指定'-n'或'-p'选项的话将不起作用。
-C directory

执行脚本之前,先移动到指定目录。
-c

只对脚本进行编译,而并不执行。编译后若没发现语法错误,则显示“Syntax OK”。
--copyright

显示版权信息。
-Kc

指定Ruby要处理的汉字编码。若是'E'或'e',则Ruby认定字符串或访问文件中的汉字编码为EUC。同样,若是'S'或's'的话则认定为SJIS。若是'U'或'u'则当作UTF-8处理。'N'表示不对汉字进行处理。该选项的默认值就是N(NONE)。

将来有可能会改变文字编码处理方式,届时该选项的内容也会有所变化。
-d --debug

以调试模式执行脚本。将$DEBUG设置成true。
-e script

在命令行中指定脚本。添加-e选项后,就不会从参数中抽取脚本文件名了。

若多次使用-e选项时,系统会按照以下方式处理。
下列各表达式的意义相同。 ruby -e "5.times do |i|" -e "puts i" -e "end" ruby -e "5.times do |i| puts i end" ruby -e "5.times do |i|; puts i; end" -Fregexp

将regexp指定给输入域分隔符(field separator)。
-h --help

显示命令行选项的简介。
-i[extension]

对参数中指定的文件内容进行替换(in-place edit)。原始文件将被加上扩展名并保存下来。若没有扩展名的话,将不会进行备份,而且只有替换后的文件会被保留下来。

例:
% echo matz > /tmp/junk % cat /tmp/junk matz % ruby -p -i.bak -e '$_.upcase!' /tmp/junk % cat /tmp/junk MATZ % cat /tmp/junk.bak matz -I directory

指定(追加)加载文件的路径。指定的目录将被追加到Ruby的数组变量($:)中。
-l

进行行尾自动处理。首先,将$\改为$/的值,在print输出时添加换行。若使用了-n标志或-p标志的话,将对gets读入的各行末尾进行String#chop!处理。
-n

若使用了该标志,则整个程序会像sed -n或awk一样,被
while gets ... end

括起来运行。
-p

与-n标志相仿,在各循环后输出变量$_的值。

例:
% echo matz | ruby -p -e '$_.tr! "a-z", "A-Z"' MATZ -r feature

执行脚本前,先对feature指定的库执行require操作。与'-n'选项、'-p'选项一起使用时特别奏效。
-s

对跟在脚本名后并且以'-'开头的参数进行解释,并将其值赋值给同名的全局变量。遇到以'--'开头的参数就停止解释,并将该参数从ARGV中删除。

例:

! /usr/local/bin/ruby -s # prints "true" if invoked with `-xyz' switch. print "true\n" if $xyz -S

该选项表明,当脚本名不是以'/'开头的时候,要使用环境变量PATH的值搜索脚本。若您的机器不支持#!的话,可以使用下列方法模拟#!的运行:

!/bin/sh exec ruby -S -x $0 "$@" #! ruby

因为第1行的关系,系统把脚本交给/bin/sh。/bin/sh执行第2行后启动Ruby解释器。在-x选项的作用下,Ruby解释器把从'#!'到包含'ruby'的行的内容全部读入。

根据系统的不同,$0未必包含完整路径,因此有必要使用'-S'选项来告诉Ruby在必要时搜索脚本。
-T[level]

执行不纯度测试。若给level指定了一个值之后,安全等级也会使用这个值。省略level时,其值为1。对于CGI程序来说,将其指定为-T1比较合适。$SAFE的等级也将被设定。
-v --verbose

冗长模式。启动时显示版本信息,然后将内部变量$VERBOSE设为true。当此变量为true时,众多的方法在运行时会显示冗长的信息。若只设定'-v'选项,而没有其他参数时,启动后会先显示版本信息,然后就结束运行(不会等待来自标准输入的脚本)。
--version

显示Ruby的版本信息。
-w

不显示版本信息的冗长模式。
-W[level]

ruby 1.8 特性

可以指定3种级别的冗长模式,如下所示。
-W0: 不显示警告 -W1: 只显示重要警告(默认) -W2 or -W: 显示所有警告

内部变量$VERBOSE被分别设置为nil,false,true。
-x[directory]

从message中取出脚本并执行。读入脚本的范围是从'#!'开始,直到包含'ruby'的行为止。用EOF(文件结束),^D(controlD),^Z(controlZ)或保留字_END_来指定脚本结束。

若指定了目录名的话,则在执行脚本前移动到该指定目录。
-y --yydebug

编译器调试模式。编译脚本时显示语法分析的过程。该显示过程会很漫长,可能只对那些想调试编译器的人有用。
关于解释器行

命令行指定的脚本是以'#!'开头的文件,当该行中不包含'ruby'时,将替代OS把'#!'后面的字符串看成命令行,然后启动解释器。

例如,用Ruby运行下面的shell脚本时将启动sh。

!/bin/sh -vx echo "$@"

若此行中包含'ruby'的话,则'ruby'左侧的部分将被忽略,右侧以'-'开头的部分被视为选项。

这里指定的选项将被追加到以命令行方式指定的选项之中。这主要是为了嵌入那些本该在脚本中指定的选项。例如,下面脚本的作用等价于使用命令行方式指定-Ke选项。

! ruby -Ke



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值