为什么这一行输出的是“z”而不是“?”
$ ruby -e 'put %x[ echo #{"?"} ]'
假设#{...} 中的表达式是一个变量,其值可能为“?”。我应该如何修改此脚本,以便输出问号而不是“z”?
(请原谅这个问题的标题——我还不太了解这里发生了什么,无法提供更具描述性的标题。)
最佳答案
它不是 ruby,它是你的 shell。
许多 shell 扩展了 ?字符以匹配命令行参数中的单个字符。 这很有用,如果你有一堆文件名 tempA,temp1,tempB,...,temp9 你想删除,但你不想删除 'temple'
% rm temp?
所以我猜您的工作目录中有一个名为“z”的文件或目录,而 ?匹配它,所以它被 shell 替换。
通常情况下,在单引号内(例如您的 ruby 脚本)它不会展开,但由于您将问号传递给 shell 命令,它会在那里展开。
% ruby -e 'puts %x[ echo ? ]'
z
%
应该向您展示相同的行为。
此外,如果您触摸其他几个单字 rune 件名,例如 a b c d,它们也应该显示出来:
% touch a b c
% ruby -e 'puts %x[ echo ? ]'
a b c z
%
如果您想在从 ruby 中调用外部 shell 命令时避免这种情况,则必须对传递的任何字符串进行转义。对于大多数用途,String#inspect
应该提供足够好的转义。
关于ruby - 为什么问号在 Ruby 中被解释为 "z",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/620031/