Scripts de depuração, qual é a diferença entre -x para definir -euxo pipefail?

17

A principal maneira que conheço para depurar scripts é adicionar -xao shabang ( #!/bin/bash -x).

Recentemente, me deparei com uma nova maneira, adicionando set -euxo pipefaillogo abaixo do shabang, como em:

#!/bin/bash
set -euxo pipefail

Qual é a principal diferença entre as duas formas de depuração? Há momentos em que você prefere um acima do outro?

Como calouro, depois de ler aqui , não consegui extrair essa conclusão.

JohnDoea
fonte

Respostas:

15

Primeiro, receio que a explicação da -oopção oferecida pelo http://explainshell.com não esteja totalmente correta.

Dado que seté um comando bulit-in, podemos ver sua documentação helpexecutando 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

Como você pode ver, -o pipefailsignifica:

o valor de retorno de um pipeline é o status do último comando para sair com um status diferente de zero ou zero se nenhum comando sair com um status diferente de zero

Mas não diz: Write the current settings of the options to standard output in an unspecified format.

Agora, -xé usado para depuração como você já a conhece e -epara de executar após o primeiro erro no script. Considere um script como este:

#!/usr/bin/env bash

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

A echo byelinha nunca será executada quando -efor usada porque non-existent-commandnão retorna 0:

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

Sem -ea última linha seria impressa, porque mesmo que um erro acontecesse, não dissemos Bashpara sair automaticamente:

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

set -e geralmente é colocado na parte superior do script para garantir que o script seja interrompido quando o primeiro erro for encontrado - por exemplo, se o download de um arquivo falhou, não faz sentido extraí-lo.

Arkadiusz Drabczyk
fonte
Eu li a resposta, mas não tenho certeza se entendi: Qual é a sintaxe que você recomenda usar (acredito que seja um pouco diferente, assim set -uxo pipefail).
JohnDoea
Se você quer dizer set -eque apenas causará, o script será encerrado por erro. No seu exemplo, é apenas uma das muitas opções -uxo pipefail.
Arkadiusz Drabczyk 7/08
Eu quis dizer que não tenho certeza se você me sugere usar ou não o eargumento.
JohnDoea
1
Depende de suas necessidades. Como não está definido por padrão, é responsabilidade do autor. Se você tiver certeza de que todos os comandos usados ​​no script sempre retornam 0com sucesso e diferentes de zero na falha, -eé útil, mas, como todo o resto, deve ser usado com cuidado.
Arkadiusz Drabczyk
1
Você pode talvez expandir a resposta, explicando por que -u é recomendado nesse contexto?
Patrice M.