This question already has answers here:
How to cat <<EOF >> a file containing code?
(3个答案)
去年关门了。
我需要对以下代码进行一些解释,因为它们是相同的概念,但工作方式不同。所以,我要做的是:
这是我得到的输出:
我试过以下方法:
因此,您需要转义整个命令替换构造,以便在远程主机中移动整个here doc扩展。
或者完全使用其他形式的heredocs,允许您不解释heredoc文本中的变量。只需将分隔标识符引用为
(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