2010-06-03 42 views
4

我試圖訪問Ruby中的原始命令行參數字符串(即 - 不使用預分割/分離的ARGV數組)。有誰知道如何做到這一點?例如:如何在Ruby中訪問原始的命令行參數字符串?

$> ruby test.rb command "line" arguments 

我希望能夠分辨「線」了周圍的引號:

"command \"line\" arguments" 

任何提示嗎?在此先感謝

回答

6

據我所知,ruby並未從您的命令行中刪除這些雙引號。 shell使用它們將內容插入到字符串中,並將它們傳遞給ruby。

你可以得到紅寶石收到類似這樣的東西:

cmd_line = "#{$0} #{ARGV.join(' ')}" 

爲什麼你需要知道什麼是在引號?你可以使用其他分隔符(如':'或'#')嗎?

如果需要,你可以通過雙引號的轉義他們紅寶石:

$> ruby test.rb command "\"line\"" arguments 

以上cmd_line變量將接受在這種情況下以下字符串:

test.rb comand "line" arguments 
+0

我想這是接近我可以再使用 – 2010-06-03 15:18:39

+0

'逃離' 的寶石。 – ciastek 2012-04-13 23:50:44

2

我認爲這是不太可能的,據我所知,這是所有處理的殼之前,它傳遞給程序。

2

在Unix系統上,命令行shell(Bash,csh等)自動將這種語法轉換爲參數字符串並將它們發送到Ruby可執行文件。例如,*會自動擴展到目錄中的每個文件。我懷疑是否有辦法檢測到這一點,我問你爲什麼要這麼做。

0

這應該幫助:

cmdline = ARGV.map{|x| x.index(/\s/) ? "\"#{x}\"":x}.join " " 

由於shell將單詞組合在引號int o一個參數,我們需要檢查每個參數是否有空白,如果有,請在其周圍加引號。

它仍然不會保留通配符(*),env變量($ VAR)和shell在將其傳遞到腳本之前展開的其他內容。

爲了能夠通過一個命令,因爲它是沒有擴展,你不得不訴諸使其通過IO,像echo "ls *" | my_script.rb

相關問題