Ruby中调用执行shell命令的6种方法

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

(0)

相关推荐

  • Ruby中case表达式详解

    Ruby的case表达式有两种形式: 第一种形式接近于一组连续的if语句:它让你列出一组条件,并执行第一个为真的条件表达式所对应的语句. 第二种形式,在case语句的顶部指定一个目标,而每个when从句列出一个或者多个比较条件 和if一样,case返回执行的最后一个表达式的值:而且如果表达式和条件在同一行上的话,可以用then关键字来加以区分.

  • 优化Ruby代码使程序运行速度提高的例子

    这篇文章主要介绍了我是如何把ruby gem contracts.ruby速度提升10倍的. contracts.ruby在我项目里用来添加代码合约(code contracts)到Ruby中.看起来差不多是这样的: Contract Num, Num => Num def add(a, b) a + b end 只要add方法被调用,参数和返回值都会被检查. 20秒 本周末,我对该库进行了测试,发现其性能非常糟: 这是在随机输入下,运行1000次以后的结果. 所以,当给一个函数加入合约功能后,

  • Ruby面向对象编程详解

    Ruby是纯面向对象的语言,所有项目似乎要Ruby中为一个对象.Ruby中的每个值是一个对象,即使是最原始的东西:字符串,数字甚至true和false.即使是一个类本身是一个对象,它是Class类的一个实例.本章将通过所有功能涉及到Ruby的面向对象. 类是用来指定对象的形式,它结合了数据表示和方法操纵这些数据,转换成一个整齐的包.在一个类的数据和方法,被称为类的成员. Ruby类的定义: 定义一个类,定义的数据类型的草图. 这实际上并不定义任何数据,但它定义的类名字的意思什么,即是什么类的对象

  • Ruby中调用执行shell命令的6种方法

    碰到需要调用操作系统shell命令的时候,Ruby为我们提供了六种完成任务的方法: 1.Exec方法: Kernel#exec方法通过调用指定的命令取代当前进程例子: 复制代码 代码如下: $ irb       >> exec 'echo "hello $HOSTNAME"'          hello nate.local       $ 值得注意的是,exec方法用echo命令来取代了irb进程从而退出了irb.主要的缺点是,你无法从你的ruby脚本里知道这个命令是

  • 对python中执行DOS命令的3种方法总结

    1. 使用os.system("cmd") 特点是执行的时候程序会打出cmd在Linux上执行的信息. import os os.system("ls") 2. 使用Popen模块产生新的process 现在大部分人都喜欢使用Popen.Popen方法不会打印出cmd在linux上执行的信息.的确,Popen非常强大,支持多种参数和模式.使用前需要from subprocess import Popen, PIPE.但是Popen函数有一个缺陷,就是它是一个阻塞的方

  • C++执行shell命令的多种实现方法

    目录 1.system(执行shell 命令) 2.popen(建立管道I/O) 3.使用vfork()新建子进程,然后调用exec函数族 在linux系统下,用C++程序执行shell命令有多种方式 1.system(执行shell 命令) 相关函数:fork,execve,waitpid,popen 表头文件:#include<stdlib.h> 函数原型:int system(const char * string); 函数说明 :system()会调用fork()产生子进程,由子进程来

  • js执行shell命令的几种方式(Node)

    目录 前言 调起shell的几种方式介绍(不限于这几种) 1.child_process 2.shelljs 3.simple-git 总结 在做一个客户端基建项目的时候,多处需要用到JS调取命令行执行shell脚本,这里对shell命令.JS执行shell命令做一个简单的介绍和总结. 前言 一般在纯前端静态页面的项目中,是不需要JS调命令行操作的,通常在Node项目,或者在Electron客户端项目中,可能会有这样的需求.(electron这个客户端框架本身就内置了node的很多方法).因此下

  • python中执行shell命令的几个方法小结

    最近有个需求就是页面上执行shell命令,第一想到的就是os.system, 复制代码 代码如下: os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令执行结果 0或者1,当然不满足需求了. 尝试第二种方案 os.popen() 复制代码 代码如下: output = os.popen('cat /proc/cpuinfo') print output.read() 通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的

  • Linux中执行shell脚本的4种方法总结

    bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码 代码如下: cd /data/shell ./hello.sh ./的意思是说在当前的工作目录下执行hello.sh.如果不加上./,bash可能会响应找到不到hello.sh的错误信息.因为目前的工作目录(/data/shell)可能不在

  • Erlang中执行linux命令的两种方法

    os.cmd(Cmd) os模块提供了cmd函数可以执行linux系统shell命令(也可以执行windows命令).返回一个Cmd命令的标准输出字符串结果.例如在linux系统中执行os:cmd("date"). 返回linux的时间. 这种比较简单,一般情况下,也满足了大部分需求. erlang:open_port(PortName, PortSettings) 当os.cmd(Cmd) 满足不了你的需求的时候,就可以用强大的open_port(PortName, PortSett

  • 执行Shell脚本的4种方法及区别介绍

    执行shell脚本有以下几种方式 1.相对路径方式,需先cd到脚本路径下 复制代码 代码如下: [root@banking tmp]# cd /tmp  [root@banking tmp]# ./ceshi.sh 脚本执行成功 2.绝对路径方式 复制代码 代码如下: [root@banking tmp]# /tmp/ceshi.sh 脚本执行成功 3.bash命令调用 复制代码 代码如下: [root@banking /]# bash /tmp/ceshi.sh 脚本执行成功 4.. (空格)

  • 让Linux下的cron以秒为单位执行shell脚本的3种方法

    需要用到Shell脚本每隔3秒钟去监控一个软件进程的运行状态,发现crond似乎只支持到分,不知道秒,怎么办呢? 第一种方法: 当然首先想到的是写一个触发的脚本,在触发脚本中使用死循环来解决此问题,如下: cat kick.sh 复制代码 代码如下: #!/bin/bash while : ;do  /home/somedir/scripts.sh 2>/dev/null &  sleep 3 done 注意第一次运行时请不要使用 bash kick.sh & 这种后台运行的方式,它

  • C#中调用SAPI实现语音合成的2种方法

    我们都知道现在的语音合成TTS是可以通过微软的SAPI实现的,好处我就不多说了,方便而已,因为在微软的操作系统里面就自带了这个玩意,主要的方式有两种: 1.使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来的东西在XP和WIN7都能跑.(要引入SpeechLib,好像在项目上点引用,然后选到系统COM吧,好久没弄,记不清楚了) 2.使用WIN7的windows api,其实最终还是调用了SAPI,所以开发出来的东西就只能在WIN7上面跑. 其实不管是哪一种,都是调用SAPI

随机推荐