只是想知道是否有人可以解释为什么这有效:
echo `cat <<EOF
{"branch":"foo","value":"bar"}
EOF`
但这并没有:
echo <<EOF
{"branch":"foo","value":"bar"}
EOF
(第二个片段不会向标准输出回显任何内容。)
答案1
因为 echo 永远不会从 stdIn 读取。尝试这个:
echo foo bar | echo
但是 cat 会这样做,当且仅当它的参数中没有文件时:
echo foo bar | cat
你的第一个例子是插入结果...
作为 echo 的参数。你的第二个例子是将 HEREDOC 提供给 echo,因此被忽略。
另外,您的第一个示例没有保护 echo 的参数,这意味着 shell 将其传递给 echo 后再次扩展它。
将有害字符视为 bang,这是行不通的:
echo `cat <<EOF
{"branch":"foo","value":"bar!"}
EOF`
这会:
echo "`cat <<EOF
{"branch":"foo","value":"bar!"}
EOF`"