GNU/Linux >> Linux の 問題 >  >> Linux

「set -e」は何をしますか?なぜ危険と見なされるのでしょうか?

解決策 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 に指示します。

何かのパーミッションを開いて、それらを再度制限する前に、スクリプトが停止しない限り、それがどれほど迷惑でバグが多く、危険かどうかはわかりませんでした.


Linux
  1. なぜデイスとそれは何ですか?

  2. LANG=C は多くの /etc/init.d/* スクリプトにあります。 LANG=C の機能と、LANG=C を設定する必要がある理由。

  3. Matrox GPU とは何ですか? また、大学の UNIX サーバーに Matrox GPU があるのはなぜですか?

  1. Makefileとは何ですか?どのように機能しますか?

  2. LinuxでのChownコマンドとは何ですか?その使用方法

  3. メールとは何ですか? どのようにナビゲートされますか?

  1. cURLコマンドとは何ですか?その使用方法は?

  2. Webサーバーとは何ですか?Webサーバーはどのように機能しますか?

  3. TAMとは何ですか?なぜあなたはTAMになりたいのですか?