-eがbashスクリプト内で設定されているかどうかを確認することは可能ですか?


9

シェル関数が機能するために-e / + eの特定の設定を必要とする場合、その設定をローカルに設定し、関数を終了する前に以前の設定に復元することは可能ですか?

myfunction()
{
   # Query here if -e is set and remember in a variable?
   # Or push the settings to then pop at the end of the function?
   set +e
   dosomething
   doanotherthing
   # Restore -e/+e as appropriate, don't just do unconditional   set -e
}

回答:


12

変数に現在設定されているフラグがある$-ため、関数の開始時にこれを保持し、後で復元できます。

save=$-
...
if [[ $save =~ e ]]
then set -e
else set +e
fi

ことに留意すべきである$-またで働く/bin/shだけで例えばグロブを使用して、あなたはおそらくそれを解析するbashismsを必要としないcase提供
ヨシップ・ロダン

2

変数SHELLOPTSを介してフラグ値を読み取ることができます。

  > set +e 
  > echo $SHELLOPTS
    braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
  > set -e 
  > echo $SHELLOPTS
    braceexpand:emacs:errexit:hashall:histexpand:history:interactive-comments:monitor

を設定するとset -e、の値errexit$SHELLOPTS表示されることがわかります。そこから確認できます。

ただし、(必要に応じて)次の点を覚えておくことで回避できます:マニュアルによると:

-e

.....このオプションは、シェル環境と各サブシェル環境に個別に適用されます。

したがって、サブシェルで関数を実行すると、次のようになります。

   zz="$(myfunction)"

errexit呼び出し環境で変数が設定されているかどうかを心配する必要はありません。好きなように設定できます。


ありがとう、SHELLOPTSは知っておくと役に立ちます。私は$-meuhによって提案された$-をプログラムでチェックする方が簡単だと思っています。そのため、私はその答えを受け入れました。
usta 2015年

サブシェルについてのメモも役に立ちますが、呼び出しサイトの変更を避けたかったのです。そうでない場合は、おそらくmyfunction呼び出しをmyfunction || trueに変更して、呼び出しに対する-eの影響を抑制しset +e、関数内で最初から行う必要はないでしょう。
usta 2015年

@MariusMatutiae:20000おめでとうございます。
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.