2016-08-23 21 views
2

シェルスクリプトにssh heredocがあります。もしheredocのコマンドの1つがエラーになっていたら、シェルスクリプトを終了するにはどうしたらいいですか?heredocコマンドが失敗した場合のスクリプトの終了方法

私のシェルスクリプトは、ここでこの

#!/bin/bash 

set -o errexit 

loginto_vm() { 

    ssh [email protected] << ENDSSH 

ls n1n 

cd n1n 

ENDSSH 

    echo 'done' 

} 

loginto_vm 

のように、それは「N1N」が存在しない場合のsshヒアドキュメントを終了し、echo文を印刷し、私はそれがスクリプト

+0

!/ binに/ bashの セット-o ERREXIT loginto_vm(){IP @ SSHホスト<< ENDSSH LS N1NのCD N1NのENDSSHエコー[完了 '} loginto_vm – anil

+0

CDは、非ゼロを返す必要がありますsshはゼロ以外の値を返さなければならず、 'set -o errexit'のセマンティクスがスクリプトを中止させることを期待するでしょう。しかし、 'set -o errexit'は多くの古いシェルで予期せぬ動作をすることが知られており、現代シェルでは間違いなくエッジケースがあります。本当に避けなければなりません。 'ssh host @ IP << ENDSSHを実行するだけです。出口 ' –

答えて

0

を終了したいされますここの宣言の中のコマンドは、リモートシェルによって実行されます。ここに表示されるようにするには、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

次の場合に終了するシェルを指示することができます任意のシェルスクリプトのようなもののエラー:

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

出力:

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

Notice afterが印刷されません。

関連する問題