bashでpythonの if __name__ == '__main__': っぽいことをする方法

スポンサード リンク

pythonならば,スクリプトを直接実行にのみ実行するコードは

if __name__ == '__main__':

の後に記述すれば良い。ここに書かれたコードはimportされた場合には実行されないようにできる。

同様にシェルスクリプトで,すなわちbashで source した場合には実行されないようにする方法を調べたのでメモ。

bashでは, if __name__ == '__main__': の代わりに

[[ ${0} != "${BASH_SOURCE[0]}" ]] && return 0

を記述しておくと, source しても後の行は実行されなくなる。

テストするために以下のサンプルシェルスクリプト test.sh を作成する。

#!/bin/bash

function something_good(){
    echo "function something_good(){"
    echo '${BASH_SOURCE} =' ${BASH_SOURCE}
    echo '$0 =' $0
}

echo "before"
echo '${BASH_SOURCE} =' ${BASH_SOURCE}
echo '$0 =' $0

[[ ${0} != "${BASH_SOURCE[0]}" ]] && return 0

echo "after"
echo '${BASH_SOURCE} =' ${BASH_SOURCE}
echo '$0 =' $0

実行例を以下に示す。確かに, [[ ${0} != "${BASH_SOURCE[0]}" ]] && return 0 以下の行は source 時には実行されていないことがわかる。

# bash test.sh
before
${BASH_SOURCE} = test.sh
$0 = test.sh
after
${BASH_SOURCE} = test.sh
$0 = test.sh

# source test.sh
before
${BASH_SOURCE} =
$0 = test.sh

# something_good
function something_good(){
${BASH_SOURCE} =
$0 = something_good

# ./test.sh
before
${BASH_SOURCE} = ./test.sh
$0 = ./test.sh
after
${BASH_SOURCE} = ./test.sh
$0 = ./test.sh

# . ./test.sh
before
${BASH_SOURCE} =
$0 = ./test.sh

Comments !

social