「ソース」を使用してスクリプトを実行するときに設定を適切に復元する方法は?


9

sourceそのタスクは環境を変更することなので、を使用して実行する必要があるスクリプトを書いています。スクリプトの実行中にset -eエラーが発生するとスクリプトが停止するようにしたいと思います。スクリプトは次のようになります。

#!/bin/bash
set -e
# do something
cd somewhere
source anotherScript

問題はset -e、スクリプトの終了後も自然に有効なままになることです。setスクリプトが停止したときに、変更されたオプションが以前の値に正しく復元されるようにするにはどうすればよいでしょうか(何らかの方法で-正常に完了するか、エラーで)。



同じ問題(-x/ xtraceオプションの場合)は、エコーコマンドの実行トレースを抑制しますか?
スコット

回答:


3

あなたがそれをアクティブにする方法とまったく同じ:buitinを呼び出すset

$ set -o errexit
$ set -o | grep errexit
errexit         on
$ set +o errexit
$ set -o | grep errexit
errexit         off

以下からのbash(1)manページ、下SHELL BUILTIN COMMANDS節、 `セット」コマンド:

-o option-name
The option-name can be one of the following:
    errexit Same as -e.

3
これらの設定を(すべて)保存して後で復元する方法はありますか?
PetrPudlák2013

set -o現在の設定を確認するために実行します。スクリプトでこれらのいずれかを設定/設定解除するときは、明示的にしてください。
dawud 2013

12

このコマンドset +oは、現在の設定を同じ状態を復元するコマンドとしてリストします。例:

$ set +o
set +o allexport
set -o braceexpand
set -o emacs
set +o errexit
set +o errtrace
...

この出力をシェル変数に保存すると、後ですべてのオプションを簡単に復元できます。

SAVED_OPTIONS=$(set +o)
set -e
# do something
eval "$SAVED_OPTIONS"

Bashには、shoptコマンドを使用して調整される多くの非標準(POSIXではない)オプションも含まれています。コマンドshopt -pを使用して、同様の方法でこれらのオプションを保存できます。

1つのオプションのみを保存および復元する場合は、$-環境変数を使用できます。これは、現在のオプションセットを文字としてリストします。たとえば、

$ echo $-
himBH

次のようなものを使用して、特定のオプションを保存および復元できます。

[[ $- = *e* ]]
SAVED_ERREXIT=$?
set -e
# do something
(( $SAVED_ERREXIT )) && set +e

eval呼び出しで "$ SAVED_OPTIONS"の前後の引用符を逃さないことが非常に重要であることに注意してください。
Matt

3

RETURNトラップを使用する

RETURN トラップはソーススクリプトでも機能します。

RETURNトラップで指定されたコマンドは、シェル関数またはシェルスクリプトが実行された、.またはsource戻った後に実行が再開する前に実行されます。

https://www.gnu.org/software/bash/manual/bash.html

main_script.sh

#!/usr/bin/env bash
echo "inside main script"
shopt -o errexit
source a_script_to_be_sourced.sh
echo "back inside main script"
shopt -o errexit

a_script_to_be_sourced.sh

trap "$(shopt -p -o errexit)" RETURN
set -e # Equivalents: set -o errexit; shopt -s -o errexit
echo "inside sourced script"
shopt -o errexit

テスト

$ ./main_script.sh 
inside main script
errexit         off
inside sourced script
errexit         on
back inside main script
errexit         off

2

以前にアクティブ化された設定の復元は、次のようにすばやく実行できます。

PREV_SETTING=$-  # e.g. himxBH  (there was xtrace)

set +x
# do your script without xtrace, ...

set -$PREV_SETTING

逆の方法(オフの状態に戻す)では、そのようなショートカットはなく、Seppoの答えはすべてのケースをカバーしています。


書かれたコードは-bash: set: -i: invalid option-iフラグがインタラクティブシェルを示しているために生成されます。
dpw
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.