2011-07-17 66 views
2

我發現幾乎不可能將帶引號的參數(包含空格)傳遞給REBOL 3腳本。例如:將引用的參數傳遞給REBOL 3腳本

rebol -q script.r "foo bar" 40 

如果檢查system/script/args,它包含字符串"foo bar 40"。這沒用!信息丟失了。我需要知道"foo bar"是第一個參數,40是第二個參數。如果我檢查system/options/args,我得到以下塊:["foo" "bar" "40"]。再一次,沒用!信息丟失了。

我懷疑,解決方法是使用某種類型的參數分隔符,例如,

rebol -q script.r 'foo bar' -n 40 

這很容易通過PARSE來處理,但我還是不喜歡它。 system/options/args每個傳遞的參數不應包含一個字符串。

REBOL很高興使用,這是我發現的第一件讓我非常失望的事情。 :(

+0

我是正確的懷疑你在這裏談論REBOL 3? (在REBOL 2中,上述(錯誤)行爲似乎不存在)。 – earl

+0

我在2.7.7 OS X上觀察到相同的行爲。 – rgchris

+0

@earl Yeah,REBOL 3.在REBOL 2中沒有嘗試過再也不用了。 (我可以逃避這一點,因爲REBOL主要是我的一種興趣語言。) –

回答

4

在REBOL 3,你觀察is a known bug行爲

(目前,R3內部從操作系統內部將args作爲單個字符串傳遞給腳本,並將所有原始參數連接在一起。目前這個過程並不是完全可逆的,這是導致這個bug的原因。的列表字符串時,有效地保留原始argv但剝離由解釋器本身使用的參數。)


在REBOL 2,system/options/args是更安全的,爲命令行參數,而system/script/args可用於之間傳遞值更直接地REBOL腳本。我認爲R3會保持類似的行爲。

這裏有一個快速的腳本來檢查參數解析行爲:

REBOL [] 
print system/version 
print "options args:" 
probe system/options/args 
print "script args:" 
probe system/script/args 

REBOL 2,在OSX:

2.7.7.2.5 
options args: 
["foo bar" "40"] 
script args: 
"foo bar 40" 

REBOL 3,在OSX:

2.100.111.2.5 
options args: 
["foo" "bar" "40"] 
script args: 
"foo bar 40" 
2

可以逃脫引號:

rebol -q script.r \"foo bar\" 40 

不知道這是否是殼或REBOL的缺點

+1

它看起來像是REBOL的缺點,因爲所有其他程序(批處理腳本,C程序等)都接受雙引號字符串作爲一個參數。 – endo64

+1

在引擎蓋下,shell正在扔掉引號,但仍然通過了Rebol'argv [0] = foo bar'和'argv [1] = 40'。 – HostileFork