2022/04/20

[linux] bash の -u と -e

私が bash のスクリプトで bash のオプションとしてしばしば使うのは -u と -e だ。

https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html


-u は、設定されていない変数やパラメータをエラーとして扱うというもの。

私はこの「パラメータ」だけに反応していて、つまり bash の引数である $1 とか $2 を参照しようとして引数として与えられていなかったらエラーになるんだろう、と思い込んでいた。

さっきまで。

しかしよく読むと変数も対象ではないか。

#!/bin/bash -u

$GOPATH/bin/aaa

これで GOPATH に設定し忘れて実行してもエラーになってくれる。
私の開発スタイルだと GOPATH は未設定の状態がデフォルトなので、こうやってエラーになってくれると非常に助かるのだ。

ちなみに今までは、

if [ -z "$GOPATH" ]; then
  echo no GOPATH
  exit 1
fi

みたいなのを書いていた。。。


もう1つが -e で、これは戻り値が 0 以外だったら即時終了するというもの。

まあそのままなのだが、これを付けていると本当に即時終了するので、開発中のデバッグでぐるぐる回すスクリプトなんかで使っているといつの間にか終了してしまっているということがしばしばあり、使うのを敬遠していた。

先ほど -u で気付いたようにこちらも何かあるかもしれないと読んでいると「ERRのトラップ」という言葉が出てきた。

err1.sh というファイルを作ってみた。

#!/bin/bash -eu

function mya() {
    echo MYA-
}

# trap mya ERR

function err1() {
    echo \"err1\"
    return 1
}

err1
echo end.

$ ./err1.sh
"err1"
MYA-

おお!

「trap mya ERR」をコメントアウトすると「"err1"」だけ出力された。

 

全部捕捉されるかは分からんが、助けになりそうだ。