個々のコマンドに対して set -e を無効にする方法は?

個々のコマンドに対して set -e を無効にする方法は?

set -e コマンドは、いずれかのコマンドがゼロ以外の終了コードを返した場合に、bash スクリプトを直ちに失敗させます。

  1. スクリプト内の個々のコマンドに対してこの動作を無効にする簡単でエレガントな方法はありますか?

  2. この機能はBashリファレンスマニュアルのどこに記載されていますか(http://www.gnu.org/software/bash/manual/bashref.html)?

答え1

  1. このようなもの:

    #!/usr/bin/env bash
    
    set -e
    echo hi
    
    # disable exitting on error temporarily
    set +e
    aoeuidhtn
    echo next line
    
    # bring it back
    set -e
    ao
    
    echo next line
    

    走る:

    $ ./test.sh
    hi
    ./test.sh: line 7: aoeuidhtn: command not found
    next line
    ./test.sh: line 11: ao: command not found
    
  2. set組み込みヘルプに説明されています:

    $ type set
    set is a shell builtin
    $ help set
    (...)
    Using + rather than - causes these flags to be turned off.
    

同じことがここにも記載されています:https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin

答え2

エラー時の救済の設定を解除する代わりに、何があっても成功を強制することもできます。次のようにします。

cmd_to_run || true

0(true)を返すので、set -eはトリガーされないはずです。

答え3

戻り/エラー コード (関数またはフォーク) をキャッチしようとしている場合は、次のようにします。

function xyz {
    return 2
}

xyz && RC=$? || RC=$?

答え4

もう 1 つのアプローチは、かなり簡単だと思います (setに加えて他のオプションにも適用されます-e)。

設定を復元するために使用します$-

例えば:

oldopt=$-
set +e
# now '-e' is definitely disabled.
# do some stuff...

# Restore things back to how they were
set -$oldopt

ただし-e、具体的には、他の人が言及したオプション(|| trueまたは「 内に置くif」)の方が慣用的かもしれません。

関連情報