2

我发现几乎不可能将带引号的参数(包含空格)传递给 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 使用起来很愉快,这是我发现的第一个让我非常失望的东西。:(

4

2 回答 2

4

在 REBOL 3 中,您观察到的行为是一个已知的错误

(目前,R3 在内部将 args 作为单个字符串从操作系统传递给脚本,将进程中的所有原始参数连接起来。目前这个过程不是完全可逆的,这就是这个 bug 的原因。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"
于 2011-07-18T18:11:17.500 回答
2

您可以转义引号:

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

不知道这是shell还是REBOL的缺点?

于 2011-07-17T04:45:50.777 回答