如何将heredoc输出设置为局部变量

如何将heredoc输出设置为局部变量

我正在尝试在heredoc中将其输出设置为局部变量,如下所示:

REMOTE_OUTPUT=$(ssh remote@server /bin/bash << EOF
  find my/path/ -type f -not -path my/path/*/ -type f -mtime -0 | while read filename; do
        if grep "ERROR" $filename; then
            filenamebase=$(basename "$filename")
            echo -e "\n----------------------------------------------------------\n\n$filenamebase failure:\n"
            grep -n "ERROR" "$filename" | sed G
        fi
    done
EOF)

但即使 find&grep 循环正确并且确实应该返回输出,该变量仍保持为空。

(否则我也有兴趣将heredoc的输出写入本地文件。)

答案1

您需要引用EOF标记,例如,<<\EOF或者在变量传递到远程之前<<'EOF'停止对变量进行求值。您可以使用 say代替 来$filename查看效果。/bin/bash -v/bin/bash

我还需要将实际EOF标记放在自己的一行上,最后一行)放在下一行。

答案2

这是一个通用示例,但我能够通过交互式 nslookup 完成同样的事情:

output_text=`nslookup<<-monkies
      www.google.com
      exit
      monkies`
echo "Output: $output_text"

通过将整个命令包装在波形符中,可以将输出存储到变量中。它并不总是很漂亮(取决于heredoc执行的命令),但它确实有效。

这解决了我将heredoc输出存储到bash中的变量时遇到的问题。

相关内容