4

私は親関数と子関数を持っています:

parent() {

   child aa1 bb1 cc1
   child aa2 bb2 cc2
   child aa3 bb3 cc3
   child aa4 bb4 cc4

}

child() {
  ....
  if [ some error reason ]; then return 1; fi
  ...
}

return 1(子の) を親で返すようにし、残りの子呼び出しを実行しないようにする方法は?

このような各子呼び出しの後に戻り値のチェックを追加せずに

parent() {

   child aa1 bb1 cc1
   e=$?; [ "$e" != "0" ] && return $e
   child aa2 bb2 cc2
   e=$?; [ "$e" != "0" ] && return $e
   child aa3 bb3 cc3
   e=$?; [ "$e" != "0" ] && return $e
   child aa4 bb4 cc4
   e=$?; [ "$e" != "0" ] && return $e

}
4

3 に答える 3

6

|| return各通話の末尾に追加します。によって返される値returnは、指定されていない場合、最後に実行されたコマンドの戻りステータスです。(リマインダーの小次郎に感謝します)。

または、それをサポートしているset -e場合に使用するだけです (ただし、正しく機能しない場合についていくつかの非自明な制限があるため、使用を避けるように提案する人もいます)。コマンドの前に実行すると、「単純なコマンド」が失敗するとシェルがすぐに終了しますが、以前のソリューションはより柔軟です。ashset -e

于 2015-02-16T14:21:29.113 に答える
4

関数を追加set -eします。parent

parent() {
   set -e
   child aa1 bb1 cc1
   child aa2 bb2 cc2
   child aa3 bb3 cc3
   child aa4 bb4 cc4
}

次に、次のように呼び出します。

( parent )

これはサブシェルでparent関数を実行し、関数呼び出しのいずれかからゼロ以外の終了ステータスがあるとすぐにサブシェルが終了します。chile

于 2015-02-16T14:24:14.213 に答える
2

と以外の解決策がありset -eます|| return

シンプルです。exit代わりに使用するだけreturnで、親はサブシェルで呼び出す必要があります。

parent() {
   child aa1 bb1 cc1
   child aa2 bb2 cc2
   child aa3 bb3 cc3
   child aa4 bb4 cc4
}

child() {
  ....
  if [ some error reason ]; then exit 1; fi
  ...
}

そして、私はこの方法で親を呼び出します:

( parent )
于 2015-02-19T08:50:03.587 に答える