在不保存文件的情况下执行 ruby​​ 代码

时间:2021-04-21 16:58:23

标签: ruby string exec

我想知道如何在不保存文件的情况下执行 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​​ 代码并且不用担心代码中的引号。

3 个答案:

答案 0 :(得分:3)

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

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

注意<<'EOS' 的引号会阻止 shell 扩展 HEREDOC 内的变量,否则 $error 将在脚本代码中扩展然后传递给红宝石。此外,您可以使用任何您喜欢的代替EOS,例如:

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

IEEE 标准规定:

<块引用>

2.7.4 此处-文档

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

here-document 应被视为一个单词,它开始于 下一个 <newline> 并继续直到有一行只包含 分隔符和 <newline>,中间没有 <blank>。那么 下一个 here-document 开始,如果有的话。格式如下:

[n]<<word  
    here-document  
delimiter

其中可选的 n 代表文件描述符编号。如果数字被省略,here-document 指的是 到标准输入(文件描述符 0)。

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

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

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


更新

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

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

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

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

答案 1 :(得分: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 的实际引用。

答案 2 :(得分:1)

使用 Ruby 的 String Literals

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

%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.]' ()[] 是常见的选择,但是除了单引号和 {} 之外的任何东西都应该在 shell 的单引号参数中是安全的 {{1 }}。