ここでのロジックは、 && を使用することです すでに エラーチェック。 if 内で bash が失敗を処理しないのと同じ方法 set -e であっても、中止する価値がある条件 .
コマンドを括弧で囲むと、実際にはそれらのコマンドをサブシェル内で実行しているため、スクリプト自体はそのサブシェルの戻りのみを認識します。つまり、&& を認識しません。
リファレンスマニュアルを引用:
<ブロック引用>失敗したコマンドが、while または until キーワードの直後のコマンド リストの一部である場合、if ステートメントのテストの一部である場合、&&または || で実行されるコマンドの一部である場合、シェルは終了しません。最後の &&または || に続くコマンドを除くリスト、パイプライン内の最後のコマンド以外のコマンド、またはコマンドの戻りステータスが ! で反転されている場合。