bashで関数の戻り値を標準出力で返すということは普通に行うことと思います。
その時に関数の戻り値が予期せぬ値になるケースがありました。
調べたところ、関数内で呼んでいる関数がechoを呼んでいる場合に
戻り値がその出力を含む挙動になっていました。
以下が問題のshellです。
#!/bin/bash
funcA() {
echo "a"
}
funcB() {
funcA
echo "b"
}
b_result=$(funcB)
echo $b_result
上記を実行した場合の期待する出力は"b"ですが実際に実行すると以下のようになります。
a b
funcAの出力がfuncBの標準出力に含まれてしまいます。
上記を回避するためにはfuncAの呼び出し部分で戻り値を受けるように変更します。
#!/bin/bash
funcA() {
echo "a"
}
funcB() {
local temp=$(funcA) #←戻り値を受けるようにする。
echo "b"
}
b_result=$(funcB)
echo $b_result
これで期待した"b"という戻り値を取得することができます。