Спасибо за 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: печать каждой команды во время ее выполнения может помочь вам визуализировать поток управления сценария, если он не работает должным образом.
Это ОЧЕНЬ полезно! Я бы хотел, чтобы кто-то сказал мне это раньше. Существуют ли другие интересные трюки, подобные этому, которые могут повысить наш мета-навык по написанию сценариев?
Студент
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. Когда это используется, выше арифметическое выражение было расширено. Мы могли видеть, как одиночная линия оценивалась шаг за шагом.
Первый шаг exprбыл оценен.
Второй шаг echoбыл оценен.
Чтобы узнать больше о наборе → перейдите по этой ссылке
когда дело доходит до вашего сценария оболочки,
["$DEBUG"=='true']&&set-x
Ваш сценарий мог печатать некоторые дополнительные строки информации, когда режим выполнения выбран как DEBUG. Традиционно люди включали режим отладки, когда скрипт вызывался с необязательным аргументом, таким как-d
-u: по умолчанию отключено. При активации отображается сообщение об ошибке при использовании ненастроенной переменной.
-v: по умолчанию неактивно. После активации исходное содержимое информации будет отображаться (без переменного разрешения) перед выводом информации.
-x: по умолчанию неактивно. Если эта функция активирована, ее содержимое будет отображаться до ее запуска (после разрешения переменной появляется символ ++).
Сравните следующие различия:
/# set -v && echo $HOME/root
/# set +v && echo $HOMEset+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
help -m set | less
help -m set
совет. Это работает. Я пыталсяman set
до того, как спросить, однако на Ubuntu естьNo manual entry for set
set
встроен в bash, так что если выman bash
можете найти его в разделе «Команды SHELL BUILTIN». При просмотре страницы человека , вероятно , можно перейти к нему, ища для этого регулярного выражения:\bset \[
.Ответы:
set -x
включает режим оболочки, в котором все выполненные команды выводятся на терминал. В вашем случае он явно используется для отладки, что является типичным вариантом использованияset -x
: печать каждой команды во время ее выполнения может помочь вам визуализировать поток управления сценария, если он не работает должным образом.set +x
отключает это.источник
set +x
отключает его.set -e
вверху вашего скрипта заставит скрипт завершиться с ошибкой всякий раз, когда ошибка происходит (и не обрабатывается явно). Я нахожу это чрезвычайно предпочтительным по умолчанию, которое заключается в том, чтобы продолжать идти волей-неволей (как печально известный Visual BasicOn Error Resume Next
).set -e
имеет очень нежелательные побочные эффекты, вплоть до того, что делает проверку кода практически невозможной (потому что поведение данной строки зависит от того, как работает стек вызовов - если функция вызывается в «проверенном» контексте,set -e
она отключена для этого вызова и всего, что он в свою очередь вызывает). Смотрите упражнения в BashFAQ # 105 .set -x
[ источник ]
пример
Приведенный выше пример иллюстрирует использование
set -x
. Когда это используется, выше арифметическое выражение было расширено. Мы могли видеть, как одиночная линия оценивалась шаг за шагом.expr
был оценен.echo
был оценен.Чтобы узнать больше о наборе → перейдите по этой ссылке
когда дело доходит до вашего сценария оболочки,
Ваш сценарий мог печатать некоторые дополнительные строки информации, когда режим выполнения выбран как
DEBUG
. Традиционно люди включали режим отладки, когда скрипт вызывался с необязательным аргументом, таким как-d
источник
Сравните следующие различия:
источник