У сценаріях налагодження, яка різниця між -x для встановлення -euxo pipefail?


17

Основний спосіб, яким я знаю, налагоджувати сценарії - це додавання -xдо шабангу ( #!/bin/bash -x).

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

#!/bin/bash
set -euxo pipefail

У чому головна відмінність двох способів налагодження? Чи бувають випадки, коли ви віддаєте перевагу один над іншим?

Як першокурсник, прочитавши тут , я не зміг дійти такого висновку.

Відповіді:


15

По-перше, я боюся, що пояснення -oваріанту, поданого http://explainshell.com , не зовсім коректне.

Враховуючи, що setце команда bulit-in, ми можемо побачити її документацію 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
Чи можете ви, можливо, розширити відповідь, пояснивши, чому в такому контексті рекомендується -у?
Патріс М.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.