2012-04-30 221 views
3

我有一個非常基本的問題。我正在運行一個Ruby腳本來訪問Linux中目錄的內容。執行ruby腳本時,該目錄將通過命令行傳遞。在Ruby腳本中執行shell腳本命令

我的問題是如何使用命令行參數在命令行中的ruby?

我有它設置像這樣:

usrDirectory = ARGV[0] 
lsCmd = `ls -l` 

我需要使用類似的ls -l usrDirectory。 我可以直接將它插入到命令中嗎?

回答

2

以上是正確的,如果你想有ls輸出到標準輸出,這使得它乾淨了一點:

system("ls", "-l", dir) 

這將使Ruby將輸出打印到標準輸出中,而不是像上面那樣將輸出放入變量中。

+3

如果你打算使用'system',你應該使用多參數版本:'system('ls','-l',dir)' –

+0

噢。我會改變這一點。謝謝你提醒我。 – Linuxios

0

您可以使用表情擴張和逃生的命令字符串序列:

lsCmd = `ls -l #{usrDirectory}` 
0

你有兩種選擇。你可以這樣做:

lsCmd = `ls -l #{usrDirectory}` 

command = "ls -l " + usrDirectory 
lsCmd = %x[ #{command} ] 
1

你應該能夠得到你想要的東西,而不使用shell,例如:

usr_dir = "/tmp" 
files = Dir["#{usr_dir}/*"] 

p files 

不管你做什麼,是非常小心將用戶輸入的文本作爲將被解析和執行的內容的一部分傳遞給shell。例如,如果用戶輸入(而不是一個目錄名)

會發生什麼; RM -rf/*

+1

這就是爲什麼你使用這些命令的多參數版本,他們繞過了shell並直接使用你的參數作爲程序的參數。 – Linuxios

+0

是的,關鍵是不要讓shell解析它。力量太大。 – theglauber

+0

沒錯。我很確定我們同意。 – Linuxios