Що робить `set -x`?


260

У мене є сценарій оболонки із таким рядком:

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

15
Погляньте:help -m set | less
Сайрус

4
Дякую за help -m setпораду. Це працює. Я намагався man setперед запитанням, проте на ubuntu єNo manual entry for set
Ole

2
@Ole, setвбудований у bash, тому якщо man bashви зможете знайти його в розділі SHELL BUILTIN COMMANDS. Переглядаючи сторінку чоловіка, ви, ймовірно, можете перейти на неї, шукаючи цей regexp : \bset \[.
Користувач5910

Відповіді:


364

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 .
Чарльз Даффі

77

set -x

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