解決策 1:
set -e
サブコマンドまたはパイプラインがゼロ以外のステータスを返す場合、シェルを終了させます。
インタビュアーがおそらく求めていた答えは次のとおりです:
<ブロック引用>init.d スクリプトを作成するときに「set -e」を使用するのは危険です:
http://www.debian.org/doc/debian-policy/ch-opersys.html 9.3.2 から --
<ブロック引用>init.d スクリプトで set -e を使用する場合は注意してください。正しい init.d スクリプトを作成するには、init.d スクリプトを中止せずにデーモンが既に実行中または停止している場合にさまざまなエラー終了ステータスを受け入れる必要があり、一般的な init.d 関数ライブラリは set -e が有効な状態で呼び出すのは安全ではありません。 init.d スクリプトの場合、多くの場合、set -e を使用せず、代わりに各コマンドの結果を個別に確認する方が簡単です。
これは、サーバーレベルのスクリプトと自動化に関する候補者の実用的な知識を評価するものであるため、面接担当者の観点からは有効な質問です。
解決策 2:
bash(1)
から :
-e Exit immediately if a pipeline (which may consist of a
single simple command), a subshell command enclosed in
parentheses, or one of the commands executed as part of
a command list enclosed by braces (see SHELL GRAMMAR
above) exits with a non-zero status. The shell does not
exit if the command that fails is part of the command
list immediately following a while or until keyword,
part of the test following the if or elif reserved
words, part of any command executed in a && or ││ list
except the command following the final && or ││, any
command in a pipeline but the last, or if the command’s
return value is being inverted with !. A trap on ERR,
if set, is executed before the shell exits. This option
applies to the shell environment and each subshell envi-
ronment separately (see COMMAND EXECUTION ENVIRONMENT
above), and may cause subshells to exit before executing
all the commands in the subshell.
残念ながら、「スクリプトの残りの部分が実行されない」または「おそらく実際の問題を覆い隠す可能性がある」以外に、なぜ危険なのかを考えるほど創造的ではありません。
解決策 3:
set -e
であることに注意してください。 スクリプトのさまざまなセクションでオンとオフを切り替えることができます。スクリプト全体の実行のためにオンにする必要はありません。条件付きで有効にすることもできます。とはいえ、自分でエラー処理を行っている (またはしていない) ため、これを使用することはありません。
some code
set -e # same as set -o errexit
more code # exit on non-zero status
set +e # same as set +o errexit
more code # no exit on non-zero status
また、これは trap
の Bash man ページ セクションからのものです。 set -e
の方法も説明するコマンド 特定の状況下で機能します。
ERR トラップは、失敗したコマンドが while または until キーワードの直後のコマンド リストの一部である場合、if ステートメントのテストの一部である場合、&&または ⎪⎪ リストで実行されたコマンドの一部である場合、またはコマンドの戻り値が! によって反転されます。これらは、errexit オプションが従う条件と同じです。
そのため、ゼロ以外のステータスが終了を引き起こさないいくつかの条件があります。
set -e
を理解していないのが危険だと思います が機能し、機能しない場合、無効な仮定の下で誤ってそれに依存しています。
また、BashFAQ/105 set -e (または set -o errexit、または trap ERR) が期待どおりに機能しないのはなぜですか? も参照してください。
解決策 4:
これは就職の面接のためのクイズであることを覚えておいてください.質問は現役スタッフが書いたもので、間違っている可能性があります。これは必ずしも悪いことではなく、誰もが間違いを犯します。面接の質問は、多くの場合、レビューなしで暗い隅に置かれ、面接中にのみ出てきます.
「set -e」が「危険」と見なすようなことを何もしない可能性は十分にあります。しかし、その質問の著者は、自分の無知または偏見のために、「set -e」が危険であると誤って信じている可能性があります。おそらく、彼らはバグのあるシェル スクリプトを作成し、それがひどく爆撃され、実際には適切なエラー チェックを作成することを怠ったにもかかわらず、'set -e' が原因であると誤って考えました。
私は過去 2 年間でおそらく 40 件の就職面接に参加しましたが、面接官は時々間違った質問をしたり、間違った答えをしたりします。
あるいはひっかけ問題かもしれません。これはつまらないかもしれませんが、完全に予想外というわけではありません。
または、これは良い説明かもしれません:http://www.mail-archive.com/[email protected]/msg473314.html
解決策 5:
set -e
何かがゼロ以外の戻り値を返すたびに終了するように、スクリプトで bash に指示します。
何かのパーミッションを開いて、それらを再度制限する前に、スクリプトが停止しない限り、それがどれほど迷惑でバグが多く、危険かどうかはわかりませんでした.