シェルオプションを変更して復元する方法について、さまざまなスタック交換サイトとUNIXヘルプフォーラムで多くの質問を読みました。ここで見つけた最も包括的な質問は、「set -x」を「元に戻す」方法です。
受信した知恵は、いずれかの結果をオフに保存することであると考えられるset +oかshopt -po、その後、evalそれが後に以前の設定を復元します。
ただし、bash 3.xおよび4.xを使用した私自身のテストでは、errexitコマンド置換を行うときにオプションが正しく保存されません。
問題を示すスクリプトの例を次に示します。
set -o errexit
set -o nounset
echo "LOCAL SETTINGS:"
set +o
OLDOPTS=$(set +o)
echo
echo "SAVED SETTINGS:"
echo "$OLDOPTS"
そして出力(無関係な変数のいくつかを削除しました):
LOCAL SETTINGS:
set -o errexit
set -o nounset
SAVED SETTINGS:
set +o errexit
set -o nounset
これは非常に危険なようです。私が書くほとんどのスクリプトはerrexit、コマンドが失敗した場合に実行を停止することに依存しています。これによって引き起こされたスクリプトの1つにバグを見つけerrexitました。最後に復元するはずの関数がそれを上書きし、スクリプトの実行中はデフォルトのオフに戻しました。
私ができることは、必要に応じてオプションを設定し、終了する前にすべてのオプションを適切に復元できる関数を作成することです。しかし、コマンド置換によって呼び出されたサブシェルでerrexitは継承されていないようです。
set +oコマンド置換を使用したり、FIFOフープをジャンプしたりせずに結果を保存する方法に困っています。からは読み取ることができますが$SHELLOPTS、書き込み可能ではないか、またはevalフォーマット可能ではありません。
サブシェル関数を使用することも選択肢の1つであることは知っていますが、その場合、出力をログに記録したり、複数の変数を返したりするために多くの問題が生じます。
おそらく関連している:https : //stackoverflow.com/questions/29532904/bash-subshell-errexit-semantics(bash 4.4以降には回避策があるようですが、私はむしろポータブルソリューションを持っていると思います)
shoptセットオプション(nullglobなど)を復元しません。