亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

Ruby中執行Linux shell命令的六種方法詳解

2020-10-29 19:42:37
字體:
來源:轉載
供稿:網友

在Ruby中,執行shell命令是一件不奇怪的事情,Ruby提供了大概6種方法供開發者進行實現。這些方法都很簡單,本文將具體介紹一下如何在Ruby腳本中進行調用終端命令。

exec

exec會將指定的命令替換掉當前進程中的操作,指定命令結束后,進程結束。

復制代碼 代碼如下:

exec 'echo "hello world"'
print 'abc'

執行上述的命令,結果如下,我們可以看到沒有abc的輸出,可以看出來,在執行echo "hello world"命令后進程就結束了。不會繼續執行后面的print 'abc'。

復制代碼 代碼如下:

ruby testCommand.rb
hello world

使用exec一個頭疼的事情就是沒有辦法知道shell命令執行成功還是失敗。

system

system和exec相似,但是system執行的命令不會是在當前進程,而是在一個新創建的進程。system會返回布爾值來表明命令執行結果是成功還是失敗。

復制代碼 代碼如下:

$ irb
> system 'echo "hello $HOSTNAME"'
hello androidyue
 => true
> puts $?
pid 11845 exit 0
 => nil
> system 'false'
 => false
> puts $?
pid 11858 exit 1
 => nil
>>

system會將進程的退出的狀態碼賦值給$?,如果程序正常退出,$?的值為0,否則為非0。通過檢測退出的狀態碼我們可以在ruby腳本中拋出異?;蛘哌M行重試操作。

注:在Unix-like系統中進程的退出狀態碼以0和非0表示,0代表成功,非0代表失敗。

system可以告訴我們命令執行是成功還是失敗,但是有些時候我們需要得到執行命令的輸出,并在腳本中使用。顯然system無法直接滿足,需要我們使用反引號來實現。

反引號(`)

使用反引號是shell中常用的獲取命令輸出內容的方法,在ruby中也是可以,而且一點都需要做改變。使用反引號執行命令也會將命令在另一個進程中執行。

復制代碼 代碼如下:

1.9.3p448 :013 > today = `date`
 => "Sat Nov 15 19:28:55 CST 2014/n"
1.9.3p448 :014 > $?
 => #<Process::Status: pid 11925 exit 0>
1.9.3p448 :015 > $?.to_i
 => 0
1.9.3p448 :016 >

上面的方法如此簡單,我們可以直接對返回的字符串結果進行操作。

注意,$?已經不再是上述的那樣單純的退出狀態碼了,它實際上是一個Process::Status對象。我們從中不僅可以知道進程的退出狀態碼也可以知道進程的ID。使用$?.to_i會得到退出的狀態碼,使用$?.to_s會得到包含了進程id,退出狀態碼等信息的字符串。

使用反引號的一個結果就是我們只能得到標準的輸出(stdout)而不能得到標準的錯誤信息(stderr),比如下面的例子,我們執行一個輸出錯誤字符串的perl腳本。

復制代碼 代碼如下:

 $ irb
  >> warning = `perl -e "warn 'dust in the wind'"`
  dust in the wind at -e line 1.
  => ""
  >> puts warning

  => nil

可以看出,warning并沒有得到出錯的信息,這就表明反引號無法得到標準錯誤的信息。

IO#popen

IO#popen也是一種執行命令的方法,其命令也是在另外的進程中執行。使用popen你可以像操作IO對象一樣處理標準輸入和輸出。

復制代碼 代碼如下:

$ irb
>> IO.popen("date") { |f| puts f.gets }
Mon Mar 12 18:58:56 PDT 2007
=> nil

Open3#popen3

在標準的Ruby庫中還提供了一個Open3。使用這個類我們可以很容易的對標準輸入,輸出,錯誤進行處理。這里我們使用一個可以交互的工具dc。dc是一種逆波蘭表達式(又叫做后綴表達式,每一運算符都置于其運算對象之后)的計算器,支持從標準輸入讀取數學表達式。在這個例子中,我們將兩個數值和一個操作符進行壓棧處理。然后使用p來輸出結果。比如我們輸入5和10,然后輸入+,然后會得到15/n的輸出。

復制代碼 代碼如下:

$ 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
  => "15/n"

使用這個方法,我們不僅可以讀取到命令的輸出還可以對命令進行輸入操作。這個方法對于進行交互操作很方便。通過popen3,我們還可以得到標準的錯誤信息。

復制代碼 代碼如下:

  # (irb continued...)
  >> stdin.puts("asdfasdfasdfasdf")
  => nil
  >> stderr.gets
  => "dc: stack empty/n"

但是,在ruby 1.8.5中popen3有一個缺陷,進程的退出狀態沒有寫入到$?中。

復制代碼 代碼如下:

$ irb
  >> require "open3"
  => true
  >> stdin, stdout, stderr = Open3.popen3('false')
  => [#<IO:0x6f39c0>, #<IO:0x6f3984>, #<IO:0x6f3920>]
  >> $?
  => #<Process::Status: pid=26285,exited(0)>
  >> $?.to_i
  => 0

為什么是0,false命令執行后的退出狀態應該是非0才對,由于這個缺陷,我們需要了解一下Open4

Open4#popen4

Open4#popen4使用起來和Open3#popen3差不多,而且我們也可以得到程序的退出狀態。popen4還可以返回一個子進程ID。你也可以通過Process::waitpid2 加上對應的進程ID獲得進程退出狀態。但是前提是要安裝open4的gem。

復制代碼 代碼如下:

$ 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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产免费一区二区三区在线观看| 亚洲一区二区在线播放| 亚洲国产日韩欧美在线图片| 亚洲在线视频观看| 中文字幕精品在线| 久久久久久91香蕉国产| 亚洲男人天天操| 日韩女优在线播放| 岛国av在线不卡| 欧美日韩亚洲视频一区| 日韩电视剧在线观看免费网站| 色噜噜狠狠狠综合曰曰曰88av| 激情久久av一区av二区av三区| 亚洲精品中文字| 亚洲精品中文字幕有码专区| 欧美激情一区二区久久久| 91理论片午午论夜理片久久| 91精品国产777在线观看| 亚洲女人被黑人巨大进入al| 亚洲激情在线观看视频免费| 久久精品在线视频| 中文字幕精品在线视频| 一本大道香蕉久在线播放29| 最好看的2019的中文字幕视频| 在线观看国产精品日韩av| 欧美精品成人在线| 中文字幕av一区二区三区谷原希美| 91久久国产综合久久91精品网站| 欧美中文字幕在线视频| 欧美国产日韩一区| 视频一区视频二区国产精品| 国内精品久久久久久久| 久久精品久久久久| 久久久免费在线观看| 亚洲国产精品999| 97精品国产91久久久久久| 国产一区二区三区18| 深夜福利国产精品| 精品久久久91| 在线亚洲午夜片av大片| 国产精品va在线播放我和闺蜜| 亚洲国产一区自拍| 亚洲精品91美女久久久久久久| 国产日韩欧美视频在线| 97热精品视频官网| 欧美性xxxx| 亚洲精品www| 91国在线精品国内播放| 一区二区三区天堂av| 欧美在线视频观看免费网站| 国产精品国语对白| 亚洲性夜色噜噜噜7777| 麻豆国产va免费精品高清在线| 亚洲毛片在线观看| 日韩精品中文字幕在线| 久久色免费在线视频| 国产精品精品久久久| 久久精品国产91精品亚洲| 久久综合久久美利坚合众国| 久久久久久一区二区三区| 国产精品www| 亚洲日韩第一页| 欧美超级免费视 在线| 欧美巨大黑人极品精男| 精品成人在线视频| 国产精品h在线观看| 欧美激情视频网址| 国产网站欧美日韩免费精品在线观看| 欧美成年人视频网站| 日韩中文字幕网站| 国产激情久久久| 亚洲精品美女久久久久| 欧美日韩裸体免费视频| 国产三级精品网站| 国产日韩中文字幕| 91中文在线观看| 亚洲性视频网址| 国产91在线播放精品91| 国产免费一区二区三区在线能观看| 91亚洲精华国产精华| 久久亚洲成人精品| 国产精品久久一区| 亚洲精品黄网在线观看| 视频一区视频二区国产精品| 国产精品精品视频一区二区三区| 精品香蕉一区二区三区| 国产日韩欧美中文在线播放| 欧美日韩在线视频首页| 精品国产91乱高清在线观看| www.日韩系列| 国产精品久久久久久久久久久久久久| 欧美夫妻性生活视频| 热久久这里只有精品| 国产精品日韩欧美| 亚洲综合大片69999| 夜夜嗨av一区二区三区免费区| 国内免费精品永久在线视频| 亚洲国产成人久久| 久久久久久国产免费| 国产日韩精品在线观看| 亚洲精品久久久久久久久| 欧美伦理91i| 欧美视频在线观看免费网址| 狠狠色狠狠色综合日日小说| 免费成人高清视频| 日本一本a高清免费不卡| 毛片精品免费在线观看| 亚洲人成人99网站| 国自产精品手机在线观看视频| 久久久久久久久久久网站| 亚洲人成在线一二| 久久久久久久久久久成人| 久久久久久成人精品| 久久久国产影院| 久久艹在线视频| 欧美视频在线观看免费| 中文字幕亚洲欧美在线| 日韩在线视频免费观看| 久久综合伊人77777蜜臀| 色偷偷88888欧美精品久久久| 亚洲黄色成人网| 国产成人高清激情视频在线观看| 亚洲精品天天看| 欧美寡妇偷汉性猛交| 中文字幕欧美日韩| 国产精品成人久久久久| 日韩av电影院| 亚洲精品日产aⅴ| xx视频.9999.com| 38少妇精品导航| 亚洲成人黄色网| 久久激情视频免费观看| 精品视频在线导航| 97不卡在线视频| 亚洲精品一区二三区不卡| 中文欧美日本在线资源| 久久6免费高清热精品| 欧美日韩美女视频| 亚洲欧美三级在线| 亚洲精品视频免费| 欧美性开放视频| 永久免费毛片在线播放不卡| 伦伦影院午夜日韩欧美限制| 日本午夜在线亚洲.国产| 中文欧美在线视频| 另类美女黄大片| 欧美激情综合色| 91亚洲精华国产精华| 国产精品日韩精品| 国产成人在线精品| 国产精品久久久久久久久粉嫩av| 91国自产精品中文字幕亚洲| 日韩动漫免费观看电视剧高清| 欧美激情精品久久久久久黑人| 丝袜美腿精品国产二区| 欧美成人一区二区三区电影| 一本一道久久a久久精品逆3p| 夜夜嗨av色一区二区不卡| 欧美在线激情视频| 亚洲精品小视频在线观看| 日韩成人av网址| 51午夜精品视频| 51色欧美片视频在线观看| 欧美一级淫片videoshd|