2012-11-12 73 views
5

閱讀Ruby的文檔system方法here我很困惑。我不確定什麼是命令,什麼是選項。如果我想執行以下操作,我該怎麼辦?Ruby系統方法參數

wget -pk -nd -P /public/google www.google.com 

出於安全原因,我想用採用無殼(在我給URL中的第二和第三個形式,而不是第一)

+1

你可以使用反引號。 – alex

+0

'file = system(wget -pk -nd -P/public/google www.google.com)'。檢查這個http://stackoverflow.com/questions/690151/getting-output-of-system-calls-in-ruby – nicooga

+0

對不起,編輯澄清我的意思。 –

回答

10

考慮例子的版本之一:

system("echo *") 
system("echo", "*") 

第一個將字符串'echo *'傳遞給shell進行解析和執行;這就是爲什麼system('echo *')在shell提示符下產生與echo *相同的輸出:您將獲得當前目錄中的文件列表。相應的參數形式是:

commandline : command line string which is passed to the standard shell 

第二個完全繞過外殼。它將在PATH中查找echo,然後以字符串'*'作爲參數執行它。由於shell擴展通配符(至少在unixy系統上),*將保持爲簡單的*,您將看到*作爲輸出。這裏的相應參數的形式是:

cmdname, arg1, ... : command name and one or more arguments (no shell) 

第三種形式:當您要執行cmdname,但有它不同的名字顯示在列表ps和這樣

[cmdname, argv0], arg1, ... : command name, argv[0] and zero or more arguments (no shell) 

使用。你可以通過打開兩個終端來看到這一點。打開在其中的一個irb說:

system('sleep', '10') 

然後迅速切換到另一個,並期待在ps上市。你應該在那裏看到sleep 10。但是,如果你把這個給irb

system(['sleep', 'pancakes'], '10') 

,並檢查ps上市,你會看到pancakes 10。如果你說system('sleep 10'),類似的雙終端技巧會告訴你一個shell -c sleep 10

如果您提供一個哈希作爲第一個參數,那麼該哈希將用作生成進程的環境變量。如果你提供了一個Hash作爲最終的參數,那麼這個Hash被用作選項;如system文檔中所述,有關論點的進一步文檔可在Kernel#spawn下獲得。

+0

感謝您長時間的回答!我還不完全確定的是,什麼是「爭論」?「-pk」,「-nd」,「-P」,「/ public/google」,「www.google.com」是否都被視爲一個參數? –

+0

@MikaH:是的,這些都是爭論。 –