2016-08-23 207 views
2

我的shell脚本中有一个ssh heredoc,如果heredoc中的某个命令出现错误,我该如何退出shell脚本。如果heredoc命令失败,如何从脚本中退出

我的shell脚本会是这样

#!/bin/bash 

set -o errexit 

loginto_vm() { 

    ssh [email protected] << ENDSSH 

ls n1n 

cd n1n 

ENDSSH 

    echo 'done' 

} 

loginto_vm 

这从SSH定界符退出,如果“N1N”是不存在的,并打印echo语句,但我想它从脚本

+0

!/斌/庆典 集-o errexit loginto_vm(){ SSH主机IP @<< ENDSSH LS N1N CD N1N ENDSSH回声 '完成'} loginto_vm – anil

+0

CD应该返回非零,所以ssh应该返回非零值,并且你会期望'set -o errexit'的语义导致脚本中止。然而,'set -o errexit'已知在许多旧壳中都有意想不到的行为,现代壳中无疑存在边缘情况,你真的应该避免它。只要执行'ssh host @ IP << ENDSSH || exit' –

回答

0

出口这里的命令由远程shell执行。你需要在这里的文件里面传入set -o errexit,以便它在那里可见;它完全独立于运行ssh命令的外壳。

1

您可以在定界符检查任何关键命令的退出状态并以一个错误退出SSH - 再检查SSH退出状态退出脚本

ssh [email protected] <<ENDSSH 
ls n1n || exit 1 
cd n1n || exit 2 
ENDSSH 
(($?)) && exit 1 
echo 'done' 
0

您可以指示shell退出,如果什么错误,如在任何shell脚本:

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

输出:

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

通知after未打印。

相关问题