我試圖訪問Ruby中的原始命令行參數字符串(即 - 不使用預分割/分離的ARGV數組)。有誰知道如何做到這一點?例如:如何在Ruby中訪問原始的命令行參數字符串?
$> ruby test.rb command "line" arguments
我希望能夠分辨「線」了周圍的引號:
"command \"line\" arguments"
任何提示嗎?在此先感謝
我試圖訪問Ruby中的原始命令行參數字符串(即 - 不使用預分割/分離的ARGV數組)。有誰知道如何做到這一點?例如:如何在Ruby中訪問原始的命令行參數字符串?
$> ruby test.rb command "line" arguments
我希望能夠分辨「線」了周圍的引號:
"command \"line\" arguments"
任何提示嗎?在此先感謝
據我所知,ruby並未從您的命令行中刪除這些雙引號。 shell使用它們將內容插入到字符串中,並將它們傳遞給ruby。
你可以得到紅寶石收到類似這樣的東西:
cmd_line = "#{$0} #{ARGV.join(' ')}"
爲什麼你需要知道什麼是在引號?你可以使用其他分隔符(如':'或'#')嗎?
如果需要,你可以通過雙引號的轉義他們紅寶石:
$> ruby test.rb command "\"line\"" arguments
以上cmd_line
變量將接受在這種情況下以下字符串:
test.rb comand "line" arguments
我認爲這是不太可能的,據我所知,這是所有處理的殼之前,它傳遞給程序。
在Unix系統上,命令行shell(Bash,csh等)自動將這種語法轉換爲參數字符串並將它們發送到Ruby可執行文件。例如,*會自動擴展到目錄中的每個文件。我懷疑是否有辦法檢測到這一點,我問你爲什麼要這麼做。
這應該幫助:
cmdline = ARGV.map{|x| x.index(/\s/) ? "\"#{x}\"":x}.join " "
由於shell將單詞組合在引號int o一個參數,我們需要檢查每個參數是否有空白,如果有,請在其周圍加引號。
它仍然不會保留通配符(*),env變量($ VAR)和shell在將其傳遞到腳本之前展開的其他內容。
爲了能夠通過一個命令,因爲它是沒有擴展,你不得不訴諸使其通過IO,像echo "ls *" | my_script.rb
Ruby有用於此目的的特殊模塊。
http://ruby-doc.org/stdlib-1.9.3/libdoc/shellwords/rdoc/Shellwords.html
你想要的恰恰是:
require 'shellwords'
Shellwords.join ARGV[1..-1]
:對
我想這是接近我可以再使用 – 2010-06-03 15:18:39
'逃離' 的寶石。 – ciastek 2012-04-13 23:50:44