我需要对以下代码进行一些解释,因为它们是相同的概念,但工作原理不同。因此,我正在尝试执行以下操作:
#!/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)"
最佳答案
您完成了大部分部分的正确操作,但忘记了转义此处文档 $(..)
中的命令替换结构。不这样做将使命令在本地 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/