为什么将 HEREDOC 作为字符串传递给 `ruby -e` 不起作用?

ico*_*ast 4 quoting ruby here-document

由于我不明白的原因,似乎不可能将 heredoc 作为表达式传递给 Ruby 解释器:

$ ruby -e <<END
heredoc> puts 'hi'
heredoc> END

ruby: no code specified for -e (RuntimeError)
Run Code Online (Sandbox Code Playgroud)

同样的事情也发生在 Perl 上,这让我们很痛苦地发现它与 Ruby 无关。

$ perl -e<<END
heredoc> print 'hi'
heredoc> END
No code specified for -e.
Run Code Online (Sandbox Code Playgroud)

甚至sed

$ echo "blah" | sed -e <<END
pipe heredoc> s/.*/Hi/
pipe heredoc> END
sed: option requires an argument -- e
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... [file ...]
Run Code Online (Sandbox Code Playgroud)

如何将 heredoc 作为表达式传递给 Ruby?(或 Perl,或 Sed...)

Kaz*_*Kaz 5

这是因为创建一个巨大的字符串并将其作为参数传递不是“此处文档”所做的。他们创建一个流,它可以连接到某个作业的输入。

具体来说,

cat <<!
foo
!
Run Code Online (Sandbox Code Playgroud)

不等于

cat foo
Run Code Online (Sandbox Code Playgroud)

.

说到cat这里,它可以帮助我们。警告:以下无用使用cat

echo $(cat <<!
foo
!
)
Run Code Online (Sandbox Code Playgroud)

看,我们可以传递一个 here doc 作为参数,这要归功于应用了cat一个 here doc 的命令替换。