以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上面找找有沒有人寫出可以跨平台的功能了。
沒有留言:
張貼留言