Script di debug, qual è la differenza tra -x per impostare -euxo pipefail?


17

Il modo principale che conosco per eseguire il debug degli script è l'aggiunta -xa shabang ( #!/bin/bash -x).

Di recente mi sono imbattuto in un nuovo modo, aggiungendo set -euxo pipefailproprio sotto lo shabang, come in:

#!/bin/bash
set -euxo pipefail

Qual è la differenza principale tra i due modi di debug? Ci sono momenti che preferiresti uno sopra l'altro?

Come matricola, dopo aver letto qui , non sono riuscito a trarre tale conclusione.

Risposte:


15

Innanzitutto, temo questa spiegazione -o dell'opzione da http://explainshell.com non sia del tutto corretta.

Dato che setè un comando bulit-in, possiamo vedere la sua documentazione conhelp eseguendo 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

Come potete vedere -o pipefail significa:

il valore restituito di una pipeline è lo stato dell'ultimo comando da uscire con uno stato diverso da zero o zero se nessun comando è uscito con uno stato diverso da zero

Ma non dice: Write the current settings of the options to standard output in an unspecified format.

Ora, -xviene utilizzato per il debug come già lo conosci e -einterromperà l'esecuzione dopo il primo errore nello script. Considera uno script come questo:

#!/usr/bin/env bash

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

La echo byeriga non verrà mai eseguita quando -eviene utilizzata perché non-existent-commandnon restituisce 0:

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

Senza -el'ultima riga verrebbe stampata perché anche se si è verificato un errore non abbiamo detto Bashdi uscire automaticamente:

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

set -e viene spesso collocato nella parte superiore dello script per assicurarsi che lo script venga arrestato quando si verifica il primo errore, ad esempio se il download di un file non riesce non ha senso estrarlo.


Ho letto la risposta ma non sono sicuro di ottenere questo: qual è la sintassi che mi consiglia di utilizzare (credo che sia leggermente diverso, come questo set -uxo pipefail).
JohnDoea,

Se vuoi dire set -eche causerà solo la fine dello script in caso di errore. Nel tuo esempio è solo una delle tante opzioni insieme a -uxo pipefail.
Arkadiusz Drabczyk il

Volevo dire che non sono sicuro se mi suggerisci di usare o meno l' eargomento.
JohnDoea,

1
Dipende dalle vostre esigenze. Non è impostato di default, quindi dipende dall'autore. Se sei sicuro che tutti i comandi utilizzati nello script torneranno sempre 0in esito positivo e diversi da zero in caso di insuccesso, allora -eè utile, ma come tutto il resto dovrebbe essere usato con cautela.
Arkadiusz Drabczyk il

1
Puoi forse espandere la risposta, spiegando perché -u è raccomandato in questo contesto?
Patrice M.,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.