我正在尝试在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中的变量时遇到的问题。