【问题标题】:Why is the order of execution inversed in this bash script?为什么这个 bash 脚本中的执行顺序颠倒了?
【发布时间】:2013-10-16 18:14:18
【问题描述】:

我有这个脚本:

ssh -T user@$123.456.789.123 <<EOF

    cd www

    var=$(tail index.htm)

    echo $var

EOF

我认为它应该做的是:

  1. 通过SSH连接服务器,
  2. 然后切换到文件夹www
  3. 然后将index.htmtail存入变量var
  4. 最后回显结果。

相反,似乎 tail 在更改文件夹之前执行,因此找不到 index.htm 文件。

我尝试过使用不同的命令,每次我尝试存储到变量中的命令替换结果似乎都是在打开 SSH 连接之后立即执行,然后再执行任何其他脚本。

我在这里错过了什么?

【问题讨论】:

    标签: bash ssh execution tail


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

        • $(...) 仍将在本地展开,就像此处未引用的文档一样。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-01
        • 2016-11-20
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        • 2021-06-10
        相关资源
        最近更新 更多