質問: 表題の通り、リモートのLinux環境とローカルのLinux環境で同じコマンドを実行し、結果が同一であることを確認するテストスクリプトを書いています。 そこで ``` set -eu diff <(コマンド) <(ssh remote-host コマンド) ``` と書くと目的は達成されるのですが、両方でコマンド実行そのものが失敗した場合、どちらも結果は空文字列となるためテストが通ってしまいます。 そこで ``` set -eu コマンド > local_result ssh remote-host コマンド > remote_result diff local_result remote_result ``` とやれば、コマンドそのものの実行失敗も検知できるようになります。 ところが最初のコマンドと違い、ローカルとリモートでコマンドは並列実行されます。順列実行となってしまいます。 質問は、並列実行を保ったままコマンドの実行失敗も検知できるようにできないか、です。 良い方法があったら教えていただけないでしょうか。
回答: 間に合わせのアイデアですが。 ``` #!/bin/bash set -eu function l() { $* || echo error on local } function r() { ssh remote-host $* || echo error on remote } diff <(l ローカルコマンド) <(r リモートコマンド) ``` なんのことはない、エラーが起きたら`error on local`または`error on remote`を標準出力へ出力するというものです。 当然ながら正常に実行した結果がこれらのメッセージと同一だとエラー発生を検出できません。そこはだぶらないようなエラーメッセージを工夫する前提です。 また質問者さんの2番目の方法と同様、実行するコマンドがパイプラインを含むと、パイプライン最終段以外のエラーは検出できません。必要に応じてpipefailオプションというのを使うと最終段以外のエラーも検出できるようですが、あいにく自分は使ったことないです。