为什么问号在Ruby中被解释为“z”

时间:2009-03-06 19:04:06

标签: ruby

为什么这一行输出“z”而不是“?”

$ ruby​​ -e'put%x [echo#{“?”}]'

假设#{...}内的表达式是一个可能具有值“?”的变量。我该如何修改这个脚本,以便输出问号而不是“z”?

(请原谅这个问题的标题 - 我还不清楚这里发生了什么,以提供更具描述性的标题。)

2 个答案:

答案 0 :(得分:7)

这不是红宝石,而是你的外壳。

许多炮弹扩大了?用于匹配命令行参数中的单个字符的字符。 它很有用,如果你有一堆文件名tempA,temp1,tempB,...,temp9你要删除,但你不想删除'temple'

% rm temp?

所以我猜你的工作目录中有一个名为'z'的文件或目录,而且?匹配它,所以它被shell取代。

通常,当在单引号内(如ruby脚本)时,它不会被扩展,但由于你将问号传递给shell命令,它会在那里扩展。

% ruby -e 'puts %x[ echo ? ]'
z
%

应该向您显示相同的行为。

此外,如果您触摸其他单个字符文件名(例如b c d),那么这些文件也应显示出来:

% touch a b c
% ruby -e 'puts %x[ echo ? ]'
a b c z
%

如果要在ruby中调用外部shell命令时要避免这种情况,则必须转义传出的任何字符串。在大多数情况下String#inspect应该提供足够好的逃避。

答案 1 :(得分:1)

不是吗?

irb(main):001:0> puts %x[echo #{"?"}]
?
=> nil

使用#{}将为您提供内部任何变量​​的值 - 我不确定您为什么要使用它而不是

puts %x[echo "?"]

或只是

puts '?'