麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > 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命令的六種方法大家都了解了嗎?各位朋友們有沒有好好的記住呢?掌握這些技巧之后,就可以讓我們提升我們的工作效率哦!

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

圖片精選

主站蜘蛛池模板: 最新福利在线 | 久久久精品精品 | 99精品视频久久精品视频 | 男女生羞羞视频网站在线观看 | 久久丝袜脚交足黄网站免费 | 中国女警察一级毛片视频 | 天天夜碰日日摸日日澡性色av | www久久国产 | 狠狠婷婷综合久久久久久妖精 | 成人毛片免费视频 | 亚洲国产精品久久久 | 国产一级性生活视频 | 91网页视频入口在线观看 | 少妇一级淫片免费放播放 | 免费观看国产精品视频 | 精品久久久久久久久久久aⅴ | www.54271.com| 午夜影院日韩 | 亚洲精品久久久久久久久久久 | 羞羞视频一区二区 | 精品国产91一区二区三区 | 亚洲免费片 | 九九热在线视频免费观看 | 日本高清无遮挡 | 性片久久| 最新se94se在线欧美 | 韩国草草影院 | 欧美aⅴ视频 | 色视频一区二区 | av在线免费观看不卡 | 日本免费aaa观看 | 日日噜噜噜噜久久久精品毛片 | 免费一区区三区四区 | 色97色| 欧美特一级片 | h视频在线观看免费 | 久久影库 | 亚洲婷婷日日综合婷婷噜噜噜 | 激情宗合网| 精品国产乱码久久久久久丨区2区 | 色七七亚洲 |