コマンド置換でスクリプトを終了中にエラーが発生しました。

コマンド置換でスクリプトを終了中にエラーが発生しました。

機能がある場合:

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"; }
}

おすすめ記事