Отладочные сценарии, в чем разница между -x и set -euxo pipefail?


17

Основной способ отладки скриптов, который я знаю, - добавление -xв shabang ( #!/bin/bash -x).

Недавно я наткнулся на новый способ, добавив set -euxo pipefailпрямо под шабан, как в:

#!/bin/bash
set -euxo pipefail

В чем основное различие между двумя способами отладки? Есть ли моменты, когда вы бы предпочли одно над другим?

Будучи новичком, после прочтения здесь я не мог извлечь такой вывод.

Ответы:


15

Во-первых, я боюсь, что объяснение -oварианта, предоставляемого http://explainshell.com , не совсем корректно.

Учитывая, что setэто встроенная команда, мы можем увидеть ее документацию help, выполнив 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

Как видите, -o pipefailозначает:

возвращаемое значение конвейера - это состояние последней команды, которая должна выйти с ненулевым статусом, или ноль, если ни одна команда не вышла с ненулевым статусом.

Но это не говорит: Write the current settings of the options to standard output in an unspecified format.

Теперь -xиспользуется для отладки, как вы уже знаете, и -eпрекратит выполнение после первой ошибки в скрипте. Рассмотрим такой скрипт:

#!/usr/bin/env bash

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

echo byeЛиния никогда не будет выполняться , когда -eиспользуется , потому что non-existent-commandне возвращает 0:

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

Без -eпоследней строки будет напечатано, потому что даже если произошла ошибка, мы не сказали, Bashчтобы автоматически выйти:

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

set -e часто ставится вверху сценария, чтобы убедиться, что сценарий будет остановлен при первой ошибке - например, если загрузка файла не удалась, извлечь его не имеет смысла.


Я прочитал ответ, но не уверен, что понял: какой синтаксис вы рекомендуете использовать (я думаю, что он немного другой set -uxo pipefail).
JohnDoea

Если вы имеете в виду, set -eэто просто приведет к тому, что сценарий завершится при ошибке. В вашем примере это только один из многих вариантов вместе с -uxo pipefail.
Аркадиуш Драбчик

Я хотел сказать, что не уверен, предлагаете ли вы мне использовать или не использовать eаргумент.
JohnDoea

1
Это зависит от ваших требований. Это не установлено по умолчанию, так что это зависит от автора. Если вы уверены, что все команды, используемые в скрипте, всегда будут возвращаться 0при успехе, а при неудаче -e- не ноль, тогда это полезно, но, как и все остальное, следует использовать с осторожностью.
Аркадиуш Драбчик,

1
Можете ли вы расширить ответ, объяснив, почему в этом контексте рекомендуется -u?
Патрис М.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.