Что делает `set -x`?

261

У меня есть сценарий оболочки со следующей строкой:

[ "$DEBUG" == 'true' ] && set -x
Ole
источник
15
Взгляните:help -m set | less
Cyrus
4
Спасибо за help -m setсовет. Это работает. Я пытался man setдо того, как спросить, однако на Ubuntu естьNo manual entry for set
Ole
2
@Ole, setвстроен в bash, так что если вы man bashможете найти его в разделе «Команды SHELL BUILTIN». При просмотре страницы человека , вероятно , можно перейти к нему, ища для этого регулярного выражения: \bset \[.
Пользователь5910

Ответы:

365

set -xвключает режим оболочки, в котором все выполненные команды выводятся на терминал. В вашем случае он явно используется для отладки, что является типичным вариантом использования set -x: печать каждой команды во время ее выполнения может помочь вам визуализировать поток управления сценария, если он не работает должным образом.

set +x отключает это.

Джон Цвинк
источник
5
Как снова отключить эту функцию?
feedc0de
85
@DanielBrunner: set +xотключает его.
Джон Цвинк
2
Это ОЧЕНЬ полезно! Я бы хотел, чтобы кто-то сказал мне это раньше. Существуют ли другие интересные трюки, подобные этому, которые могут повысить наш мета-навык по написанию сценариев?
Студент
7
@Student: set -eвверху вашего скрипта заставит скрипт завершиться с ошибкой всякий раз, когда ошибка происходит (и не обрабатывается явно). Я нахожу это чрезвычайно предпочтительным по умолчанию, которое заключается в том, чтобы продолжать идти волей-неволей (как печально известный Visual Basic On Error Resume Next).
Джон Цвинк
1
@JohnZwinck, к сожалению, set -eимеет очень нежелательные побочные эффекты, вплоть до того, что делает проверку кода практически невозможной (потому что поведение данной строки зависит от того, как работает стек вызовов - если функция вызывается в «проверенном» контексте, set -eона отключена для этого вызова и всего, что он в свою очередь вызывает). Смотрите упражнения в BashFAQ # 105 .
Чарльз Даффи
78

set -x

Печатает трассировку простых команд для команд, команд case, команд выбора и арифметики для команд и их аргументов или связанных списков слов после их раскрытия и перед выполнением. Значение переменной PS4 раскрывается, а результирующее значение выводится перед командой и ее расширенными аргументами.

[ источник ]

пример

set -x
echo `expr 10 + 20 `
+ expr 10 + 20
+ echo 30
30

set +x
echo `expr 10 + 20 `
30

Приведенный выше пример иллюстрирует использование set -x. Когда это используется, выше арифметическое выражение было расширено. Мы могли видеть, как одиночная линия оценивалась шаг за шагом.

  • Первый шаг exprбыл оценен.
  • Второй шаг echoбыл оценен.

Чтобы узнать больше о наборе → перейдите по этой ссылке

когда дело доходит до вашего сценария оболочки,

[ "$DEBUG" == 'true' ] && set -x

Ваш сценарий мог печатать некоторые дополнительные строки информации, когда режим выполнения выбран как DEBUG. Традиционно люди включали режим отладки, когда скрипт вызывался с необязательным аргументом, таким как-d

Раджу
источник
6

-u: по умолчанию отключено. При активации отображается сообщение об ошибке при использовании ненастроенной переменной.

-v: по умолчанию неактивно. После активации исходное содержимое информации будет отображаться (без переменного разрешения) перед выводом информации.

-x: по умолчанию неактивно. Если эта функция активирована, ее содержимое будет отображаться до ее запуска (после разрешения переменной появляется символ ++).

Сравните следующие различия:

/ # set -v && echo $HOME
/root
/ # set +v && echo $HOME
set +v && echo $HOME
/root

/ # set -x && echo $HOME
+ echo /root
/root
/ # set +x && echo $HOME
+ set +x
/root

/ # set -u && echo $NOSET
/bin/sh: NOSET: parameter not set
/ # set +u && echo $NOSET
lupguo
источник