我需要对以下代码进行一些解释,因为它们是相同的概念,但工作原理不同。所以,我正在尝试执行以下操作:
#!/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的替代形式,它允许您not解释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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)