【问题标题】:how to exit from script if heredoc command is failing如果 heredoc 命令失败,如何退出脚本
【发布时间】:2016-12-30 08:20:36
【问题描述】:

我的 shell 脚本中有一个 ssh heredoc,如果 heredoc 中的其中一个命令出错,我该如何退出我的 shell 脚本。

我的shell脚本会是这样的

#!/bin/bash

set -o errexit

loginto_vm() {

    ssh host@IP << ENDSSH

ls n1n

cd n1n

ENDSSH

    echo 'done'

}

loginto_vm

如果“n1n”不存在并打印 echo 语句,它将从 ssh heredoc 退出,但我希望它从脚本中退出

【问题讨论】:

  • !/bin/bash set -o errexit loginto_vm() { ssh host@IP
  • cd 应该返回非零值,因此 ssh 应该返回非零值,并且您会期望 set -o errexit 的语义会导致脚本中止。但是,众所周知,set -o errexit 在许多旧 shell 中会出现意外行为,而现代 shell 中无疑存在边缘情况,你真的应该避免它。就做ssh host@IP &lt;&lt; ENDSSH || exit

标签: bash shell ssh heredoc


【解决方案1】:

您可以在 heredoc 中检查任何关键命令的退出状态,并在出现错误时退出 ssh - 然后检查 ssh 退出状态以退出脚本

ssh host@IP <<ENDSSH
ls n1n || exit 1
cd n1n || exit 2
ENDSSH
(($?)) && exit 1
echo 'done'

【讨论】:

    【解决方案2】:

    如果出现任何 shell 脚本中的错误,您可以指示 shell 退出:

    $ sudo su <<EOF              
    set -e
    echo before
    bad-command
    echo after
    EOF
    

    输出:

    before
    sh: line 3: bad-command: command not found
    

    通知after 未打印。

    【讨论】:

    • 如此简单但有效
    【解决方案3】:

    here decument 中的命令由远程 shell 执行。您需要在此处的文档中传入set -o errexit,以便它在那里可见;它完全独立于运行ssh 命令的shell。

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多