2014年2月12日 星期三

以Ruby語言執行系統命令

以Ruby語言去執行系統命令,有下列三種方式

  • exec args
  • system args
  • %x(args) 或 `args`

exec args

exec會中斷目前Ruby正在進行的process,然後執行系統命令。所以這個指令還蠻少用的,可以在irb裡面試試

root$ irb
2.1.0 :001 > exec 'pwd'
/Users/wemee/Documents/GitHub/test
root$

irb直接被中斷掉,然後進入bash執行pwd,所以大概只能用在linux的crontab裡面,定期執行一次就中斷

system args

system則會保留目前Ruby的process,執行完系統命令後,依照執行結果回傳: true: 執行成功 false: 執行失敗,譬如移動不存在的檔案 * nil: 執行的指令本身就打錯

system 'pwd'    # => true
system 'mv not_exist_file.txt foo.txt'  # => false
system 'wrong instruction'  # => nil 

%x(args) 或 `args`

這兩個也都不會重斷Ruby的process,並且執行完後,完整回傳系統命令回傳的字串。%x(args) 或 `args`兩種寫法執行結果都一樣,所以我都寫`args`,而且ruby-style-guide也多半認為少用%x比較好。

dir = `pwd`     # => dir = "/Users/root/projects\n"
files = `ls`    # => files = "main.rb\ntemp.txt\ntest.txt\n"

這邊可以接著用string.chmop把最後面字尾那個"\n"刪掉,或用用string.gsub("\n", " ")把所有的"\n"替換成空白欄位。


最後,執行這些指令之前,記得檢查一下你的系統唷,很多linux的指令,跟windows上面的指令不同,回傳值也不同。如果一定要用的話,最好去先找找官方的函式庫有沒有可以利用的,或到GitHub上面找找有沒有人寫出可以跨平台的功能了。

沒有留言:

張貼留言