概要
- exitを含むスクリプトを、sourceで読み込むときの問題と対策
例題
関数をテストしたい
- 以下のファイルを読み込んで、関数をテストするスクリプトを作りたい
#!/bin/bash
sub_var="this is sub_var."
# この関数をテストしたい
print_sub_var() {
echo "${sub_var}"
}
if [[ "$1" == "print" ]]; then
print_sub_var
fi
exit 0
問題点
sourceできない
#!/bin/bash -x
source ./sub.sh
if [[ "$(print_sub_var)" == "this is sub_var." ]]; then
echo success!
fi
$ ./main.sh
+ . ./sub.sh
++ sub_var='this is sub_var.'
++ [[ '' == \p\r\i\n\t ]]
++ exit 0
解決策
関数だけを切り出して、別ファイルにする
aliasを使って、終了処理を書き換える
- aliasを使って、exitをtrueに書き換える
#!/bin/bash -x
shopt -s expand_aliases
alias exit="true"
source ./sub.sh
unalias exit
if [[ "$(print_sub_var)" == "this is sub_var." ]]; then
echo success!
fi
exit()関数を自作して、終了処理を書き換える
- exit()関数を自作して、exitをtrueに書き換える
- exitの中身を暫定的にすり替えるだけなので、わりと汎用的かも?
#!/bin/bash -x
exit(){ true; }
source ./sub.sh
unset exit
if [[ "$(print_sub_var)" == "this is sub_var." ]]; then
echo success!
fi