普段Bashを使うことが多いので、よく使うコマンドとかワンコマンドで自動化したいものを関数化しています。関数のログとか未定義の変数を使用時にエラーメッセージを出力するようにしたかったのでsetコマンドを使用しています。ただそれを関数内だけ有効にしないと関数以外の普通のコマンドを実行した時も出力されてしまうので、setコマンドのオプションを無効化する必要がありました。
備忘録としてその方法を説明したいと思います。
setコマンドオプションの無効化
公式マニュアル
setコマンドオプションの無効化ですが、公式マニュアルには以下のように書かれていました。
Using + rather than - causes these options to be turned off.
-でオプションを指定して有効化しますが、+を使えばオプションを無効にすることができます。
方法
まずは-で有効化したいオプションを指定します。指定できるオプションはマニュアルを参照してください。
set -eux
3つのオプションを無効にするには+を使います。
set +eux
それぞれを関数の先頭行と最終行に記述すれば、関数内だけ実行コマンドのログやエラーメッセージを出力できるようになります。こんな感じに↓
function test {
    set -eux
    # Shellに設定されているオプションの確認
    # つまり、差分をとればsetで設定されたものが確認できる
    echo $SHELLOPTS
    echo "test"
    set +eux
    echo $SHELLOPTS
}
実行ログ
先頭に+が付いているのがxオプションによって出力されたログになります。
+ echo braceexpand:emacs:errexit:hashall:histexpand:history:interactive-comments:monitor:nounset:xtrace
braceexpand:emacs:errexit:hashall:histexpand:history:interactive-comments:monitor:nounset:xtrace
+ echo test
test
+ set +eux
braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
set -euxとset +euxの差分は以下の3つのオプションです。
| option | description | 
|---|---|
| errexit | -eによって指定する何かしらのコマンドがexit code0以外を出力した際に即座にerror exit | 
| nounset | -uによって指定する未定義の変数の利用があればエラーメッセージを出力してerror exit | 
| xtrace | -xによって指定する実行ログを出力する | 


