機能がある場合:
myfunction() {
[ -d somedirectory ] && [ "some other condition" ] || { echo "error" >&2 ; exit 1; }
global_var=somevalue
}
他の関数から呼び出されます。
some_other_function() {
myfunction
# Do something with "$global_var"
}
これは期待どおりに機能します。条件がmyfunction
失敗すると、エラーの終了によりスクリプト全体が終了します。他のコードが実行されるのを防ぎます。
(ソースファイル内)他のスクリプトと関数定義を共有する非常に大きなスクリプトをリファクタリングするときは、いくつかのグローバル変数を次のように返してそれを削除したいと思います。
myfunction() {
[ -d somedirectory ] && [ "some other condition" ] || { echo "error" >&2 ; exit 1; }
local somevar=somevalue
# do stuff with "$somevar", then...
# return value of somevar to calling function.
printf %s "$somevar"
}
some_other_function() {
local anothervar="$(myfunction)"
# Do something with "$another_var"
}
ただし、ここでエラー終了は期待どおりに機能しません。スクリプトを終了せずにコマンドを置き換えるため、サブシェルで実行されている関数のみを終了します。
(グローバル変数を使用する代わりに)関数からテキスト値を返すようにこの大きなスクリプトをモジュール化する方法はありますか?そして、まだ関数はスクリプト全体でエラー終了を許可しますか?
答え1
メインシェルに信号を送信する必要があります。
# start of the main script:
MAIN_SHELL_PID=$$
[...]
myfunction() {
... || { echo "error" >&2 ; kill -HUP "$MAIN_SHELL_PID"; }
}
答え2
より簡単な解決策は、ローカル宣言と割り当てを2つの別々のステートメントに書き込むことです。これにより、関数の終了状態が割り当ての終了状態を維持するため、関数にエラーが発生した場合にwhileスクリプトを終了するのに役立ちます。
some_other_function() {
local anothervar
anothervar="$(myfunction)"
# Do something with "$another_var"
}