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

首頁 > 編程 > Ruby > 正文

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

2020-02-24 15:38:53
字體:
來源:轉載
供稿:網友

在Ruby情況下,執行命令并不奇怪,Ruby為開發人員提供了六種實現命令的方法,其實這些方法非常簡單,本文將詳解Ruby中執行Linux shell命令的六種方法,希望對你學習有幫助!

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

詳解Ruby中執行Linux shell命令的六種方法大家都了解了嗎?各位朋友們有沒有好好的記住呢?掌握這些技巧之后,就可以讓我們提升我們的工作效率哦!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近免费中文字幕视频2019| 日韩中文在线中文网三级| 中国人与牲禽动交精品| 狠狠久久五月精品中文字幕| 日韩av资源在线播放| 91国产精品91| 亚洲女同精品视频| 国产精品成久久久久三级| 亚洲第一中文字幕在线观看| 欧美整片在线观看| 日本精品性网站在线观看| 尤物九九久久国产精品的分类| 国产免费久久av| 中文字幕不卡av| 欧美在线视频网| 日韩精品极品在线观看播放免费视频| 欧美成人第一页| 日韩视频精品在线| 国产精品一二三在线| 日韩欧美主播在线| 久久久久久久一| 亚洲国产精品一区二区久| 在线看欧美日韩| 精品国产一区二区三区在线观看| 草民午夜欧美限制a级福利片| 欧美日韩亚洲网| 欧美黄色成人网| 精品久久久久久国产| 夜夜嗨av色综合久久久综合网| 伊人精品在线观看| 欧美日韩ab片| 中文字幕国产亚洲| 亚洲国产女人aaa毛片在线| 91在线视频导航| 韩国19禁主播vip福利视频| 亚洲视频在线观看视频| 欧美在线一级va免费观看| 日韩视频在线观看免费| 国产精品第七影院| 成人两性免费视频| 国产成人精品免高潮在线观看| 日韩精品在线观看一区| 91九色单男在线观看| 国产精品成人播放| 久久久日本电影| 国产精品日韩在线一区| 欧美国产第二页| 亚洲视频综合网| 国产一区二区三区18| 中文字幕日韩欧美精品在线观看| 91在线视频免费| 亚洲最大福利视频网| 久久久久久亚洲| 日韩中文字幕在线精品| 91在线视频精品| 欧美日韩激情网| 久久精品中文字幕免费mv| 538国产精品一区二区免费视频| 国产脚交av在线一区二区| 68精品国产免费久久久久久婷婷| 亚洲在线一区二区| 91精品国产高清久久久久久| 2021国产精品视频| 欧美成人精品在线| 成人国产在线激情| 91性高湖久久久久久久久_久久99| 伊是香蕉大人久久| 欧美日韩美女在线观看| 日韩一区在线视频| 日本在线观看天堂男亚洲| 日韩美女视频免费在线观看| 亚洲国产精品免费| 中文字幕av日韩| 在线看福利67194| 亚洲精品一区二三区不卡| 91精品国产91久久久久久久久| 欧美插天视频在线播放| 日韩免费av在线| 国产精品视频久| 欧美日韩激情小视频| www国产精品视频| 日韩成人av一区| 国产成人精品免高潮费视频| 欧美午夜精品久久久久久浪潮| 亚洲国产精品va| 精品一区电影国产| 中文字幕日韩专区| 欧美日韩成人在线视频| 欧美一区二区大胆人体摄影专业网站| 亚洲天堂av综合网| 久久久久久久久久久91| 欧美怡春院一区二区三区| 久久韩国免费视频| 亚洲第一天堂无码专区| 国产精品专区第二| 久久综合久久八八| 亚洲乱码一区av黑人高潮| 成人欧美一区二区三区在线| 国产精品入口夜色视频大尺度| 日韩女优在线播放| 蜜臀久久99精品久久久无需会员| 成人精品视频在线| 57pao国产精品一区| 亚洲国产精品字幕| 国产日本欧美视频| 精品福利在线视频| 国产欧美日韩最新| 欧美孕妇与黑人孕交| 精品国产91久久久久久| 日韩中文视频免费在线观看| www.日韩.com| 亚洲国模精品私拍| 插插插亚洲综合网| 欧美裸体xxxx极品少妇软件| 亚洲一区二区三区毛片| 中文字幕综合在线| 欧美亚洲国产视频| 欧美日韩中文字幕| 国产精品日韩欧美大师| 国产精品91在线观看| 久久6精品影院| 国产精品免费在线免费| 庆余年2免费日韩剧观看大牛| 久久久久这里只有精品| 欧美制服第一页| 97精品久久久| 欧美多人爱爱视频网站| 亚洲另类欧美自拍| 国产精品男人爽免费视频1| 久久精品99久久久香蕉| 91国内产香蕉| 国产精品白嫩初高中害羞小美女| 国产精品99免视看9| 欧美巨乳在线观看| 在线日韩精品视频| 国产精品美女无圣光视频| 亚洲色图综合网| 成人黄色免费在线观看| 日韩高清电影免费观看完整| 久久久人成影片一区二区三区观看| 午夜欧美不卡精品aaaaa| 国产精品高清在线| 久久精品视频播放| 亚洲一区亚洲二区亚洲三区| 日本a级片电影一区二区| 日本一区二区不卡| 国产丝袜高跟一区| 欧美性生交xxxxxdddd| 亚洲精品国产精品国自产在线| 国产男人精品视频| 国产成人精品视频| 欧美激情视频在线| 欧美性开放视频| 91精品一区二区| 亚洲激情在线观看| 黄色成人av网| 亚洲性生活视频| 久久久精品电影| 亚洲精品美女久久久| 九九热最新视频//这里只有精品| 亚洲人在线视频| 国产美女久久精品| 国产美女高潮久久白浆| 北条麻妃99精品青青久久|