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.