This question already has answers here:
How to cat <<EOF >> a file containing code?
(3个答案)
去年关门了。
我需要对以下代码进行一些解释,因为它们是相同的概念,但工作方式不同。所以,我要做的是:
#!/bin/sh

ssh -T username@host << EOF

relative="$HOME/Documents"
command=$(find \$relative -name GitHub)
command2=$(echo \$relative)
echo "HERE: \$command"
echo "HERE: \$command2"

EOF

这是我得到的输出:
find: ‘$relative’: No such file or directory
HERE:
HERE: /home/username/Documents

我试过以下方法:
"\$relative"
'\$relative'
"\${relative}"
"\$(relative)"

最佳答案

你大部分都做对了,但是忘记了在here doc$(..)中转义命令替换结构。不这样做将使命令在本地shell中展开,而不是在远程主机中展开。
另外,在运行find命令时,转义的\$relative会将文本字符串传递给它不理解的find命令,即在本地计算机上发生以下情况

find \$relative
#   ^^^^ since $relative won't expand, find throws an error

因此,您需要转义整个命令替换构造,以便在远程主机中移动整个here doc扩展。
ssh -T username@host << EOF
relative="\$HOME/Documents"
command=\$(find "\$relative" -name GitHub)
command2=\$(echo "\$relative")
echo "HERE: \$command"
echo "HERE: \$command2"
EOF

或者完全使用其他形式的heredocs,允许您不解释heredoc文本中的变量。只需将分隔标识符引用为'EOF'
ssh -T username@host <<'EOF'
relative="$HOME/Documents"
command=$(find "$relative" -name GitHub)
command2=$(echo "$relative")
echo "HERE: $command"
echo "HERE: $command2"
EOF

关于bash - 为什么此Shell脚本仅对一个实例有效,而对另一个实例无效? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53493901/

10-10 17:45