関数のサブシェルの終了コードが誤って処理される

関数のサブシェルの終了コードが誤って処理される

Bash 5.2.15がリリースされました。

次のスクリプトを実行すると、エコーは実行されないと予想されます。

#!/bin/bash

set -e  

function func() {
  (
    exit 1 
  )

   echo 'should not be run because of set -e'
}

func || true

実際に動作しますが、これは私にとってバグのようです。

|| true関数が呼び出されるサイトから削除されると(正しく)実行されません。

私の説明は、「エラー飲み込み」が|| trueコードの誤った部分に適用されることです。まるでサブシェルの閉じ括弧(私はそうではありません)と同じ行に書いたのと同じです。

私は何を逃したことがありませんか?

ベストアンサー1

これは録音された[強調する私のもの]:

-e
パイプライン(パイプラインを参照)(単一の単純コマンド(単純コマンドを参照)で構成できます)、リスト(コマンドリストを参照)、または複合コマンド(複合コマンドを参照)がゼロ以外の状態を返す場合は、直ちに終了してください。&&失敗したコマンドがリストから実行されたコマンドの[...]部分である場合、シェルは終了しません(||最後または次のコマンドを除く)。&&||[… ]。サブシェルの外部の複合コマンドが無視されたときにコマンドが失敗したため、ゼロ以外の状態を返した場合、-eシェルは終了しません。 [… ]

[… ]

複合コマンドまたはシェル関数が無視されたコンテキストで実行される場合、複合コマンド-eまたは関数の本文内で実行されるすべてのコマンドは、この設定が設定され、コマンドが失敗状態を返しても-eこの設定の影響を受けません。-e[… ]

これはfunc || true -eあなたが無視||されます関数全体で無視されます。

おすすめ記事