ぽらろいどの日記

新しい知見を得たり、得られた知見を記録したり共有したりする場を予定しています。

exitを含むスクリプトを、sourceで読み込む

概要

  • 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できない

  • 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を使って、終了処理を書き換える

#!/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