それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bash で source か実行かを区別する。python/ruby の main 的なこと

bash スクリプトで main を作りたい。

スクリプトファイルは、sourceで読み込まれることがある。 実行されたときだけ、sourceで読み込まれたときだけ実行したい。という希望もまた存在する。

python の場合

python の場合は、main を使って次のようにかける。

if __name__ == '__main__':
    sys.exit(main(sys.argv))

bash の場合

bash の場合は、次のように書くことでsourceを判別できる。

if [ "$0" = "$BASH_SOURCE" ]; then
    echo "Error: Script must be sourced"
    exit 1
fi

BASH_SOURCE という変数をつかってbash sourceを判定できる。

bash って本当に便利ですね。POSIX互換?bash 互換で十分では。

sh の場合

sh の場合、完璧ではないが、ある程度の防衛策がある。

if [[ "$(basename -- "$0")" == "script.sh" ]]; then
    >&2 echo "Don't run $0, source it"
    exit 1
fi

POSIX互換でもできるけど、僕はbashでいいかな。

安心

これで、bash スクリプトを関数定義ごとに分割して書くことができる。安心である。

参考資料

Bash: detect execute vs source in a script? - Super User