【问题标题】:Executing ruby code without saving a file执行 ruby​​ 代码而不保存文件
【发布时间】:2021-07-15 21:52:08
【问题描述】:

我想知道如何在不保存文件的情况下执行 ruby​​ 代码。例如:

ruby -e 'Time.now'

但是,引号是个问题,例如:

ruby -e 'puts 'A syntax error''

我可以改用双引号:

ruby -e 'puts "No error"'

或者:

ruby -e "puts 'No error'"

问题是我在容器内运行任意代码,因此无法避免手动替换的问题,并且引号也会产生错误:

ruby -e 'puts \'A syntax error\''

所以我想知道如何在没有文件的情况下执行 ruby​​ 代码,而不用担心代码中的引号。

【问题讨论】:

  • 一个heredoc怎么样?
  • 您能否提供一个最小示例来说明“我在容器内运行任意代码”的实际含义。这个任意代码来自哪里?以及你正在经历什么过程来执行它?
  • 以后请考虑等待更长的时间再选择答案。快速选择可能会阻止其他答案(请原谅草率的语法),并且可能会让那些仍在寻找答案的人感到沮丧。不用着急。许多人在这里等待至少几个小时,有些人等待更长的时间,鼓励当时正在睡觉的成员有机会做出贡献。
  • @red,好建议。
  • 哦,对不起,@CarySwoveland,我认为选择答案与我的特定问题的解决方案有关。下次会考虑,谢谢!

标签: ruby string exec


【解决方案1】:

您可以使用 Shell HEREDOC。 shell 之间的确切语法可能不同,但在 BASH 中是
编辑所有 Shell 具有相同的语法和行为同样的方式(参见下面的 IEEE 标准引用)。

ruby <<'EOS'
$error = 'A syntax error'
puts $error
EOS

注意&lt;&lt;'EOS' 的引号防止 Shell 扩展 HEREDOC 内的变量,否则 $error 在传递给 Ruby 之前会被扩展。此外,您可以使用任何您喜欢的单词来代替EOS,例如:

ruby <<'end of ruby script'
puts 'example'
end of ruby script

IEEE 标准说:

2.7.4 此处-文档

重定向运算符&lt;&lt;&lt;&lt;- 都允许将shell 输入文件(称为“here-document”)中包含的行重定向到命令的输入。

here-document 应被视为一个单词,开始于 下一个&lt;newline&gt; 并继续直到有一行只包含 分隔符和&lt;newline&gt;,中间没有&lt;blank&gt;s。然后 下一个 here-document 开始,如果有的话。格式如下:

[n]<<word  
    here-document  
delimiter

其中可选的 n 表示文件描述符编号。如果省略数字,则此处的文档是指 到标准输入(文件描述符 0)。

如果单词中的任何字符被引用,分隔符应由 对 word 执行引号删除,here-document 行应 不展开。否则,分隔符应为单词本身。

如果 word 中没有字符被引用,则 here-document 的所有行 应为参数扩展、命令替换和 算术扩展。在这种情况下,输入中的反斜杠表现为 作为双引号内的反斜杠(请参阅双引号)。然而, 双引号字符 ('"') 不应特殊处理 在此处文档中,除非双引号出现在 $()``${}

如果重定向符号为&lt;&lt;-,则所有前导&lt;tab&gt;s 应为 从输入行和包含尾随的行中剥离 分隔符


更新

也就是说,完全避免冲突是不可能的。例如,这段 Ruby 代码会破坏你的 Shell 脚本:

ruby <<'EOS'
puts <<-EOS
example
EOS
EOS

解决这个问题的唯一方法是使用一个不太可能出现在 Ruby 代码中的单词,例如:

ruby <<'2eGRng8B6NEmNphkA2K4yc9Y782PQZpWzkUW7pwGdmybuMBG5 PVtkzZkeSKGLq4'
puts <<-EOS
example
EOS
2eGRng8B6NEmNphkA2K4yc9Y782PQZpWzkUW7pwGdmybuMBG5 PVtkzZkeSKGLq4

【讨论】:

  • @red-menace,现在我明白你的建议了。很好的答案,Fravadona,这就是我要找的!
【解决方案2】:

你必须正确地转义引号,例如:

ruby -e 'puts '\''foo bar'\''; puts '\''foo bar'\''; '
#       ^-----^
#      quote this
#                ^-------^
#                quote that
#              ^^
#      escaped quote to pass to Ruby

输出:

foo bar
foo bar

请注意,大多数引号都需要在 shell 中简单地引用 Ruby 代码。转义的引用 \' 是传递给 Ruby 的实际引用。

【讨论】:

  • 你能解释为什么'变成'\''吗?
  • @Stefan,感谢您的评论,并用解释更新了答案。
【解决方案3】:

使用 Ruby 的String Literals

为避免(或至少简化)在 shell 引号内引用 String 对象的问题,您可以使用 heredocpercent-string,例如 %q 用于单引号或 %Q 用于双引号。例如:

# double-quoted percent string
ruby -e 'puts %Q(No error.)'

# single-quoted percent string
ruby -e 'puts %q(A syntax error.)'

# quoted String with nested symbols
ruby -e 'puts %Q[You can use most [percent-literal] symbols safely.]'

请注意,您几乎可以使用任何成对或不成对的符号字符来打开和关闭百分比文字。 ()[]{} 是常见的选择,但除了单引号和 \' 之外的任何内容都应该在 -e 的单引号参数内的 shell 中安全。

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 2013-08-08
    相关资源
    最近更新 更多