我发现将引用的参数(包含空格)传递给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 :(得分:4)
在REBOL 3中,您观察到的行为is a known bug。
(目前,R3内部将args从操作系统传递到脚本作为单个字符串,连接过程中的所有原始参数。目前这个过程不完全可逆,这是导致此错误的原因.R3可能应该通过而是将参数作为字符串列表,有效地保留原始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"
答案 1 :(得分:2)
你可以逃避引号:
rebol -q script.r \"foo bar\" 40
不知道这是shell还是REBOL的缺点?