bash - 为什么此 shell 脚本适用于一个实例而不适用于另一个实例?

标签 bash shell heredoc

我需要对以下代码进行一些解释,因为它们是相同的概念,但工作原理不同。因此,我正在尝试执行以下操作:

#!/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/

相关文章:

php - 让 Netbeans 识别 PHP 中的 HTML 标签 HEREDOC

linux - AWK 脚本不打印 CSV 文件的最后一列

linux - SSH - 仅输入一次密码

linux - 如何在 bash 中获取键值对文件以转义空格?

linux - 如何在不提示密码的情况下以不同的用户身份运行 shell 脚本

linux - 在 bash 函数中,如何将 stdin 放入变量中

bash 多个 heredocs 等

linux - 如何使用 IF/Then Bash 命令比较 2 个文件中的行数

linux - 将程序输出分配给 shell 脚本中的变量

bash - 此处文档给出 'unexpected end of file' 错误