私のサーバーのSSHに問題があります。個々のスクリプト(ソースs01.shなど)を実行すると正常に動作し、コンソールにエラーが表示されます。ただし、デフォルトのスクリプトを使用してこれらのスクリプトを取得するときにエラーが発生した場合、SSH接続は予期せず終了します。主なスクリプトmaster.sh
は次のとおりです。
#!/bin/bash
set -e
source s01.sh
source s02.sh
Rscript s03.R
source s04.sh
対話型SSHセッションで、次のコマンドを使用して基本スクリプトを取得します。
source master.sh
set -eを使用すると、エラーが発生したときにスクリプトが停止することを期待していましたが、代わりにSSHセッション全体が中断されました。これは個々の購入ではなく統合スクリプトでのみ発生します。なぜこれが起こるのですか?スクリプトエラーが原因でSSHセッションが閉じないようにするには?
これにはSSHサーバー構成が含まれる可能性がありますが、どの設定を調べるべきかわかりません。
答え1
これが起こる理由は、基本スクリプトをソーシングするためです。次の2つのおもちゃの例を使用して、説明した動作を再現できます。
terdon@oregano ~ $ cat ~/scripts/foo.sh
#!/bin/bash
set -e
source /home/terdon/scripts/bar.sh
echo "done!"
terdon@oregano ~ $ cat ~/scripts/bar.sh
#!/bin/bash
echo "start"
false
これで新しい端末を開いて実行すると. ~/scripts/foo.sh
(これはsource
標準コマンドの移植不可能なbashエイリアスなので、.
同じ. foo
)source foo
、私が開いた端末は終了します。 SSHセッションで試行すると、SSHセッションは終了します。なぜ?購入は、コマンドを実行して現在のセッションに適用することを意味するためです。したがって、スクリプトの1つがエラーを引き起こすため(コマンドがfalse
終了する1
)set -e
、セッションは終了します。コマンドを実行するのではなく、コマンドをインポートして現在のシェルセッションに適用するように指示したので、スクリプトを終了するだけではありません。
しかし、あなたの例では、基本的なスクリプトをインポートする必要はないようです。必要なのは、Rスクリプトに必要な環境を設定できる他のスクリプトをインポートすることだけです。したがって、調達の代わりに実行しても大丈夫でしょう。
/path/to/master.sh
またはまだ実行可能にしていない場合:
bash /path/to/master.sh
バラよりこの投稿調達と履行の詳細をご覧ください。