sh -c 不识别 heredoc 语法

sh -c doesn't recognize heredoc syntax

我认为下面的两个命令应该是相同的,但是鉴于 heredoc,shell 会产生错误。是否可以将 heredoc 传递给 sh 的 -c 参数?

heredoc 示例

/bin/sh -c <<EOF
echo 'hello'
EOF

# ERROR: /bin/sh: -c: option requires an argument

简单的字符串示例

/bin/sh -c "echo 'hello'"

# prints hello

命令不等价。

/bin/sh -c <<EOF
echo 'hello'
EOF

相当于

echo "echo 'hello'" | /bin/sh -c

或者,here-string:

/bin/sh -c <<< "echo 'hello'"

sh -c 需要一个参数。它适用于

echo "echo 'hello'" | /bin/sh

我尝试post将其作为评论,但格式化代码在评论中效果不佳。使用@Benjamin W. 接受的答案作为指导,我能够让它与这个片段一起工作

( cat <<EOF
echo 'hello'
EOF
) | /bin/sh

神奇之处在于 cat 如何处理输入。来自手册页:

If file is a single dash (`-') or absent, cat reads from the standard input.

因此 cat 可以将 stdin 重定向到 stdout 并且可以通过管道传输到 /bin/sh