Débogage des scripts, quelle est la différence entre -x et set -euxo pipefail?


17

Le principal moyen que je connais pour déboguer des scripts est d'ajouter -xau shabang ( #!/bin/bash -x).

Je suis récemment tombé sur une nouvelle façon, ajoutant set -euxo pipefailjuste sous le shabang, comme dans:

#!/bin/bash
set -euxo pipefail

Quelle est la principale différence entre les deux méthodes de débogage? Y a-t-il des moments où vous préféreriez l'un au dessus de l'autre?

En tant que première année, après avoir lu ici , je ne pouvais pas tirer une telle conclusion.

Réponses:


15

Tout d'abord, je crains que l'explication de l' -ooption proposée par http://explainshell.com ne soit pas entièrement correcte.

Étant donné qu'il sets'agit d'une commande intégrée, nous pouvons voir sa documentation helpen exécutant help set:

  -o option-name
      Set the variable corresponding to option-name:
          allexport    same as -a
          braceexpand  same as -B
          emacs        use an emacs-style line editing interface
          errexit      same as -e
          errtrace     same as -E
          functrace    same as -T
          hashall      same as -h
          histexpand   same as -H
          history      enable command history
          ignoreeof    the shell will not exit upon reading EOF
          interactive-comments
                       allow comments to appear in interactive commands
          keyword      same as -k
          monitor      same as -m
          noclobber    same as -C
          noexec       same as -n
          noglob       same as -f
          nolog        currently accepted but ignored
          notify       same as -b
          nounset      same as -u
          onecmd       same as -t
          physical     same as -P
          pipefail     the return value of a pipeline is the status of
                       the last command to exit with a non-zero status,
                       or zero if no command exited with a non-zero status
          posix        change the behavior of bash where the default
                       operation differs from the Posix standard to
                       match the standard
          privileged   same as -p
          verbose      same as -v
          vi           use a vi-style line editing interface
          xtrace       same as -x

Comme vous pouvez le voir, cela -o pipefailsignifie:

la valeur de retour d'un pipeline est l'état de la dernière commande à quitter avec un état non nul, ou zéro si aucune commande n'est sortie avec un état non nul

Mais cela ne dit pas: Write the current settings of the options to standard output in an unspecified format.

Maintenant, -xest utilisé pour le débogage comme vous le savez déjà et -earrêtera de s'exécuter après la première erreur du script. Considérez un script comme celui-ci:

#!/usr/bin/env bash

set -euxo pipefail
echo hi
non-existent-command
echo bye

La echo byeligne ne sera jamais exécutée lorsqu'elle -eest utilisée car non-existent-commandne renvoie pas 0:

+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found

Sans -ela dernière ligne serait imprimée car même si une erreur s'est produite, nous n'avons pas dit Bashde quitter automatiquement:

+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
+ echo bye
bye

set -e est souvent placé en haut du script pour s'assurer que le script sera arrêté lors de la première erreur - par exemple, si le téléchargement d'un fichier a échoué, il n'est pas logique de l'extraire.


J'ai lu la réponse mais je ne suis pas sûr d'obtenir ceci: Quelle est la syntaxe que vous recommandez d'utiliser (je pense que c'est légèrement différent, comme ça set -uxo pipefail).
JohnDoea

Si vous voulez dire set -eque cela causera juste, le script se terminera par erreur. Dans votre exemple, ce n'est qu'une des nombreuses options avec -uxo pipefail.
Arkadiusz Drabczyk

Je voulais dire que je ne sais pas si vous me proposez d'utiliser ou de ne pas utiliser l' eargument.
JohnDoea

1
Cela dépend de vos besoins. Ce n'est pas défini par défaut, c'est donc à l'auteur. Si vous êtes sûr que toutes les commandes utilisées dans le script retourneront toujours 0en cas de succès et non nul en cas d'échec, cela -eest utile, mais comme tout le reste, il doit être utilisé avec prudence.
Arkadiusz Drabczyk

1
Pouvez-vous développer la réponse en expliquant pourquoi -u est recommandé dans ce contexte?
Patrice M.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.