bash の関数で exit したときの挙動が呼び出し方によって変わる件

bash の関数で exit した場合、呼び出し元に戻ることなくプロセスが終了すると思っていたけど、どうやら呼び出し方によって挙動が変わるみたい。

1

まずこちらのコード。関数abc で exit しているので、Hello は出力されません。

#!/bin/bash

function abc {  
  echo 123
  exit 1;
}

abc

echo "Hello."  

実行結果

$ sh sample.sh
123  

2

次にこれ。関数abc の標準出力をパイプで別のコマンドに渡しています。

#!/bin/bash

function abc {  
  echo 123
  exit 1;
}

abc | grep 1

echo "Hello."  

パイプで渡される前に exit を通るので、Hello されないことを期待。

実行結果

$ sh sample.sh
123  
Hello.  

期待を裏切られる。

3

じゃぁ変数に代入したらどうなるんだろう?と思って試してみた。

#!/bin/bash

function abc {  
  echo 123
  exit 1;
}

a=`abc`

echo "Hello."  

実行結果

$ sh sample.sh
Hello.  

Hello された。


というわけで、関数の中で exit するときは exit されることを常に期待してはいけないようです。。 ちなみに、呼び出し元に返り値を返したいときは return を使いましょう。