この質問trap
のために関数内で使用して遊んでいましたが、この二次的な質問を思いつきました。次のコードがあるとします。
d() {
trap 'return' ERR
false
echo hi
}
を実行d
するtrap
と、シェルは「hi」を出力せずに関数から戻ります。ここまでは順調ですね。しかし、もう一度実行すると、シェルから次のメッセージが表示されます。
-bash: return: 関数またはソース スクリプトからのみ「戻る」ことができます
最初は、これは ERR sig が 2 回発生したことを意味すると想定しました。1 回目false
はゼロ以外の終了ステータスが返されたとき (関数内)、もう 1 回は関数自体がゼロ以外の終了ステータスで返されたとき (関数外) です。しかし、その仮説はこのテストに耐えられません。
e() {
trap 'echo +;return' ERR
false
echo hi
}
上記を実行すると、どれだけ頻繁に実行しても、関数またはソーススクリプトからのみreturn
警告が表示されなくなります。シェルが引数内の単純なコマンドとは異なる複合コマンドを扱うのはなぜtrap
ですか?
私の目標は、関数を終了させたコマンドの実際の終了ステータスを維持することでしたが、上記の動作の原因が何であれ、終了ステータスのキャプチャも複雑になると思います。
f() {
trap '
local s=$?
echo $s
return $s' ERR
false
echo hi
}
bash> f; echo $?
1
0
ワット?$s
ここで が 2 つの異なる値に展開される理由と、同じ原因であることが判明した場合は、上記の と の区別をreturn
誰かが説明できますかecho +; return
?