我发现几乎不可能将带引号的参数(包含空格)传递给 REBOL 3 脚本。例如:
rebol -q script.r "foo bar" 40
如果您检查system/script/args
,它包含字符串“foo bar 40”
。这是没用的!信息丢失了。我需要知道 "foo bar"
是第一个参数,40
是第二个参数。如果我检查system/options/args
,我会得到以下 block :["foo""bar""40"]
。再说一遍,没用!信息丢失。
我怀疑解决这个问题的方法是使用某种参数分隔符,例如,
rebol -q script.r 'foo bar' -n 40
这可以通过 PARSE 轻松处理,但我仍然不喜欢它。对于 system/options/args
来说,每个传递的参数包含一个字符串应该不是一件非常困难的事情。
REBOL 使用起来很愉快,这是我发现的第一个令我非常失望的东西。 :(
最佳答案
在 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"
关于rebol - 将带引号的参数传递给 REBOL 3 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6721636/