LoginSignup
0
1

More than 3 years have passed since last update.

【Bash】Shellの関数内だけsetコマンドオプションを有効化

Last updated at Posted at 2019-10-26

普段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 -euxset +euxの差分は以下の3つのオプションです。

option description
errexit -eによって指定する
何かしらのコマンドがexit code0以外を出力した際に即座にerror exit
nounset -uによって指定する
未定義の変数の利用があればエラーメッセージを出力してerror exit
xtrace -xによって指定する
実行ログを出力する

:wave::wave:

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1