GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was macht 'set -e' und warum könnte es als gefährlich angesehen werden?

Lösung 1:

set -e bewirkt, dass die Shell beendet wird, wenn ein Unterbefehl oder eine Pipeline einen Status ungleich Null zurückgibt.

Die Antwort, nach der der Interviewer wahrscheinlich gesucht hat, lautet:

Es wäre gefährlich, "set -e" beim Erstellen von init.d-Skripten zu verwenden:

Von http://www.debian.org/doc/debian-policy/ch-opersys.html 9.3.2 --

Seien Sie vorsichtig bei der Verwendung von set -e in init.d-Skripten. Das Schreiben korrekter init.d-Skripte erfordert das Akzeptieren verschiedener Fehler-Exit-Status, wenn Daemons bereits ausgeführt oder bereits gestoppt wurden, ohne das init.d-Skript abzubrechen, und allgemeine init.d-Funktionsbibliotheken können nicht sicher aufgerufen werden, wenn set -e wirksam ist. Für init.d-Skripte ist es oft einfacher, set -e nicht zu verwenden und stattdessen das Ergebnis jedes Befehls separat zu prüfen.

Dies ist eine gültige Frage aus Sicht des Interviewers, da sie das praktische Wissen eines Kandidaten über Skripterstellung und Automatisierung auf Serverebene misst

Lösung 2:

Ab 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.

Leider bin ich nicht kreativ genug, um darüber nachzudenken, warum es gefährlich wäre, außer "der Rest des Skripts wird nicht ausgeführt" oder "es könnte möglicherweise echte Probleme maskieren".

Lösung 3:

Zu beachten ist, dass set -e kann für verschiedene Abschnitte eines Skripts ein- und ausgeschaltet werden. Es muss nicht für die gesamte Ausführung des Skripts eingeschaltet sein. Es könnte sogar bedingt aktiviert werden. Das heißt, ich benutze es nie, da ich meine eigene Fehlerbehandlung mache (oder auch nicht).

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

Bemerkenswert ist auch dies aus dem Bash-Manpage-Abschnitt auf trap Befehl, der auch beschreibt, wie set -e funktioniert unter bestimmten Umständen.

Die ERR-Trap wird nicht ausgeführt, wenn der fehlgeschlagene Befehl Teil der Befehlsliste ist, die unmittelbar auf ein while- oder until-Schlüsselwort folgt, Teil des Tests in einer if-Anweisung, Teil eines Befehls, der in einer &&- oder ⎪⎪-Liste ausgeführt wird, oder wenn der Rückgabewert des Befehls ist wird über ! invertiert. Dies sind die gleichen Bedingungen, denen auch die Option errexit unterliegt.

Es gibt also einige Bedingungen, unter denen ein Nicht-Null-Status keinen Exit bewirkt.

Ich denke, die Gefahr liegt darin, wenn set -e nicht verstanden wird ins Spiel kommt und wenn dies nicht der Fall ist, und sich unter einer ungültigen Annahme falsch darauf verlässt.

Siehe auch BashFAQ/105. Warum macht set -e (oder set -o errexit oder trap ERR) nicht das, was ich erwartet habe?

Lösung 4:

Denken Sie daran, dass dies ein Quiz für ein Vorstellungsgespräch ist. Die Fragen wurden möglicherweise von den derzeitigen Mitarbeitern geschrieben und sind möglicherweise falsch. Das ist nicht unbedingt schlecht, und jeder macht Fehler, und Interviewfragen sitzen oft ohne Überprüfung in einer dunklen Ecke und kommen erst während eines Interviews heraus.

Es ist durchaus möglich, dass 'set -e' nichts tut, was wir als "gefährlich" betrachten würden. Aber der Autor dieser Frage könnte aufgrund seiner eigenen Unwissenheit oder Voreingenommenheit fälschlicherweise glauben, dass „set -e“ gefährlich ist. Vielleicht haben sie ein fehlerhaftes Shell-Skript geschrieben, das fürchterlich bombardiert wurde, und sie dachten fälschlicherweise, dass 'set -e' schuld war, obwohl sie es in Wirklichkeit versäumt haben, eine ordnungsgemäße Fehlerprüfung zu schreiben.

Ich habe in den letzten 2 Jahren an ungefähr 40 Vorstellungsgesprächen teilgenommen, und die Interviewer stellen manchmal falsche Fragen oder haben falsche Antworten.

Oder vielleicht ist es eine Fangfrage, die lahm wäre, aber nicht ganz unerwartet.

Oder vielleicht ist dies eine gute Erklärung:http://www.mail-archive.com/[email protected]/msg473314.html

Lösung 5:

set -e weist bash in einem Skript an, sich zu beenden, wenn irgendetwas einen Rückgabewert ungleich Null zurückgibt.

Ich konnte sehen, wie das ärgerlich und fehlerhaft wäre, nicht sicher, ob es gefährlich wäre, es sei denn, Sie hätten Berechtigungen für etwas geöffnet, und bevor Sie sie wieder einschränken könnten, starb Ihr Skript.


Linux
  1. Was ist ein Makefile und wie funktioniert es?

  2. Was ist ein Chown-Befehl unter Linux und wie wird er verwendet?

  3. Was ist ein cURL-Befehl und wie wird er verwendet?

  4. Was ist ein TAM und warum möchten Sie vielleicht einer werden?

  5. Was bedeutet Env X=() { :;}; Command’ Bash Do und warum ist es unsicher?

Linux-Dateibefehl:Was macht er und wie wird er verwendet?

Linux-Tail-Befehl:Was es ist und wie man es verwendet

Was ist Source Command in Linux und wie funktioniert es?

Was ist der Grep-Befehl unter Linux? Warum wird es verwendet und wie funktioniert es?

Was ist sudo rm -rf unter Linux und ist es gefährlich?

Was ist `S_ISREG()` und was macht es?