ruby - 为什么问号在 Ruby 中被解释为 "z"

标签 ruby

为什么这一行输出的是“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/

相关文章:

ruby - `include?' 中没有将 false 隐式转换为 String>

ruby - 将数组元素转换为哈希

ruby - 如何用数组编码哈希?

ruby - 错误 : failed to build gem native extension, Linux 虚拟机

ruby - Sorbet T::Struct 的序列化和反序列化

ruby - 如何在 Pry 中自定义 Ruby 命令的返回输出

json - Ruby 无法解析 Json

ruby - 在 Mongoid 中插入

ruby-on-rails - Sidekiq 工作线程中的 Redis 性能不佳

ruby-on-rails - Heroku -/usr/bin/env : ruby1. 9.1: 没有那个文件或目录