为什么在这个bash脚本中反转的执行顺序是什么?

时间:2013-10-16 18:14:19

标签: bash ssh execution tail

我有这个脚本:

ssh -T user@$123.456.789.123 <<EOF

    cd www

    var=$(tail index.htm)

    echo $var

EOF

我认为它应该做的是:

  1. 通过 SSH
  2. 连接到服务器
  3. 然后切换到 www
  4. 文件夹
  5. 然后将 index.htm tail 存储到变量 var
  6. 最后 echo 结果。
  7. 相反,似乎 tail 在更改文件夹之前执行,因此找不到 index.htm 文件。

    我尝试过不同的命令,每次看起来命令替换的结果我试图存储到变量中,在打开SSH连接之后,在任何其他脚本之前执行。

    我在这里缺少什么?

3 个答案:

答案 0 :(得分:3)

在将此文档的内容传递给$(...)之前,ssh正在本地展开。要将文字文本发送到远程服务器,请引用此处的文档分隔符。

ssh -T user@$123.456.789.123 <<'EOF'
    cd www
    var=$(tail index.htm)
    echo "$var"
EOF

(另外,引用$var的扩展以保护shell中的任何嵌入间距。)

答案 1 :(得分:2)

tail正在本地计算机上的bash脚本中运行,而不是在远程主机上运行。在您执行ssh命令之前,已经进行了替换。

您的脚本可以简单地替换为:

ssh -T user@$123.456.789.123 tail www/index.htm

答案 2 :(得分:2)

如果要将这些命令发送到远程服务器,可以编写

ssh -T user@$123.456.789.123 'cd www && var=$(tail index.htm) && echo $var'

请注意,在前一个结果上调整下一个命令允许SSH返回有意义的返回码。在您的heredoc中,无论发生什么(例如tail失败),SSH将返回$?= 0,因为echo不会失败。

另一个选择是在那里创建一个脚本并使用ssh启动它。