GNU/Linux >> Tutoriels Linux >  >> Linux

Que fait 'set -e', et pourquoi pourrait-il être considéré comme dangereux ?

Solution 1 :

set -e provoque la fermeture du shell si une sous-commande ou un pipeline renvoie un statut différent de zéro.

La réponse que l'intervieweur cherchait probablement est :

Il serait dangereux d'utiliser "set -e" lors de la création de scripts init.d :

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

Soyez prudent lorsque vous utilisez set -e dans les scripts init.d. L'écriture de scripts init.d corrects nécessite l'acceptation de divers états de sortie d'erreur lorsque les démons sont déjà en cours d'exécution ou déjà arrêtés sans abandonner le script init.d, et les bibliothèques de fonctions init.d courantes ne peuvent pas être appelées en toute sécurité avec set -e en vigueur. Pour les scripts init.d, il est souvent plus facile de ne pas utiliser set -e et de vérifier à la place le résultat de chaque commande séparément.

Il s'agit d'une question valable du point de vue de l'intervieweur, car elle évalue les connaissances pratiques des candidats en matière de scripts et d'automatisation au niveau du serveur

Solution 2 :

À partir du 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.

Malheureusement, je ne suis pas assez créatif pour penser à la raison pour laquelle ce serait dangereux, à part "le reste du script ne sera pas exécuté" ou "cela pourrait peut-être masquer de vrais problèmes".

Solution 3 :

A noter que set -e peut être activé et désactivé pour différentes sections d'un script. Il n'est pas nécessaire qu'il soit activé pendant toute l'exécution du script. Il pourrait même être conditionnellement activé. Cela dit, je ne m'en sers jamais puisque je fais moi-même la gestion des erreurs (ou pas).

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

Il convient également de noter ceci dans la section de la page de manuel Bash sur le trap commande qui décrit également comment set -e fonctionne dans certaines circonstances.

L'interruption ERR n'est pas exécutée si la commande qui a échoué fait partie de la liste de commandes suivant immédiatement un mot clé while ou until, une partie du test dans une instruction if, une partie d'une commande exécutée dans une liste &&ou ⎪⎪, ou si la valeur de retour de la commande est être inversé via !. Ce sont les mêmes conditions auxquelles obéit l'option errexit.

Il existe donc certaines conditions dans lesquelles un statut différent de zéro ne provoquera pas de sortie.

Je pense que le danger est de ne pas comprendre quand set -e entre en jeu et quand ce n'est pas le cas et s'y fier de manière incorrecte sous une hypothèse invalide.

Veuillez également consulter BashFAQ/105 Pourquoi set -e (ou set -o errexit, ou trap ERR) ne fait-il pas ce que j'attendais ?

Solution 4 :

Gardez à l'esprit qu'il s'agit d'un quiz pour un entretien d'embauche. Les questions peuvent avoir été écrites par le personnel actuel, et elles peuvent être erronées. Ce n'est pas nécessairement mauvais, et tout le monde fait des erreurs, et les questions d'entretien restent souvent dans un coin sombre sans examen, et ne sortent que lors d'un entretien.

Il est tout à fait possible que 'set -e' ne fasse rien que nous considérerions comme "dangereux". Mais l'auteur de cette question peut croire à tort que 'set -e' est dangereux, en raison de sa propre ignorance ou de ses préjugés. Peut-être qu'ils ont écrit un script shell buggé, il a horriblement bombardé, et ils ont pensé à tort que 'set -e' était à blâmer, alors qu'en fait ils ont négligé d'écrire une vérification d'erreur appropriée.

J'ai participé à probablement 40 entretiens d'embauche au cours des 2 dernières années, et les enquêteurs posent parfois des questions erronées ou ont des réponses erronées.

Ou peut-être s'agit-il d'une question piège, qui serait boiteuse, mais pas tout à fait inattendue.

Ou peut-être est-ce une bonne explication :http://www.mail-archive.com/[email protected]/msg473314.html

Solution 5 :

set -e indique à bash, dans un script, de quitter chaque fois que quelque chose renvoie une valeur de retour différente de zéro.

Je pouvais voir à quel point cela serait ennuyeux et bogué, pas sûr que ce soit dangereux, à moins que vous n'ayez ouvert des autorisations sur quelque chose, et avant que vous ne puissiez les restreindre à nouveau, votre script est mort.


Linux
  1. Qu'est-ce qu'un Makefile et comment ça marche ?

  2. Qu'est-ce qu'un serveur Linux et pourquoi votre entreprise en a-t-elle besoin ?

  3. Qu'est-ce qu'une commande Chown sous Linux et comment l'utiliser

  4. Qu'est-ce qu'une commande cURL et comment l'utiliser ?

  5. LANG=C se trouve dans un certain nombre de scripts /etc/init.d/*. Que fait LANG=C et pourquoi avez-vous besoin de définir LANG=C.

Commande de fichier Linux :que fait-elle et comment l'utiliser

Commande Linux Tail :qu'est-ce que c'est et comment l'utiliser

Qu'est-ce que la commande source sous Linux et comment ça marche ?

Qu'est-ce que la commande Grep sous Linux ? Pourquoi est-il utilisé et comment fonctionne-t-il ?

Qu'est-ce que sudo rm -rf sous Linux et est-ce dangereux ?

Qu'est-ce que le courrier et comment est-il navigué ?