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.

JohnDoea
la source

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.

Arkadiusz Drabczyk
la source
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.