Co robi `set -x`?

260

Mam skrypt powłoki z następującym wierszem:

[ "$DEBUG" == 'true' ] && set -x
Ole
źródło
15
Spójrz:help -m set | less
Cyrus
4
Dzięki za help -m setwskazówkę. To działa. Próbowałem man setprzed pytaniem, jednak na ubuntu jestNo manual entry for set
Ole
2
@Ole, setjest wbudowany w bash, więc jeśli man bashmożesz go znaleźć w sekcji SHELL BUILTIN COMMANDS. Podczas przeglądania strony man prawdopodobnie można skakać do niego, szukając tego regexp: \bset \[.
User5910

Odpowiedzi:

364

set -xwłącza tryb powłoki, w którym wszystkie wykonywane polecenia są drukowane na terminalu. W twoim przypadku jest on wyraźnie używany do debugowania, co jest typowym przypadkiem użycia set -x: drukowanie każdej wykonanej komendy może pomóc w wizualizacji przepływu sterowania skryptu, jeśli nie działa zgodnie z oczekiwaniami.

set +x wyłącza to.

John Zwinck
źródło
5
Jak ponownie wyłączyć tę funkcję?
feedc0de
85
@DanielBrunner: set +xwyłącza to.
John Zwinck
2
To jest BARDZO przydatne! Chciałbym, żeby ktoś mi to powiedział wcześniej. Czy istnieją inne ciekawe sztuczki, które mogą zwiększyć naszą meta-umiejętność pisania skryptów?
Student
7
@Student: set -eu góry skryptu spowoduje, że skrypt zakończy działanie z błędem, ilekroć wystąpi błąd (i nie jest jawnie obsługiwany). Uważam, że jest to zdecydowanie lepsza opcja niż domyślna, polegająca na ciągłym chciwości (podobnie jak niesławny Visual Basic On Error Resume Next).
John Zwinck
1
@JohnZwinck niestety set -ema bardzo niepożądane skutki uboczne, do tego stopnia, że ​​sprawia, że ​​przegląd kodu jest prawie niemożliwy (ponieważ zachowanie danej linii zależy od tego, co jest na górze stosu wywołań - jeśli funkcja jest wywoływana w kontekście „sprawdzonym”, set -ejest wyłączona dla tego wywołania i wszystkiego, co z kolei wywołuje). Zobacz ćwiczenia w BashFAQ # 105 .
Charles Duffy
77

set -x

Wyświetla ślad prostych poleceń dla poleceń, poleceń przypadku, poleceń wyboru i arytmetyki poleceń i ich argumentów lub powiązanych list słów po ich rozwinięciu i przed ich wykonaniem. Wartość zmiennej PS4 jest rozszerzana, a wynikowa wartość jest drukowana przed poleceniem i jego rozwiniętymi argumentami.

[ źródło ]

Przykład

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

set +x
echo `expr 10 + 20 `
30

Powyższy przykład ilustruje użycie set -x. Gdy jest używany, powyższe wyrażenie arytmetyczne zostało rozszerzone. Widzieliśmy, jak krok po kroku ocenia się linię pojedynczą.

  • Pierwszy krok exprzostał oceniony.
  • Drugi krok echozostał oceniony.

Aby dowiedzieć się więcej o zestawie → odwiedź ten link

jeśli chodzi o skrypt powłoki,

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

Twój skrypt mógł drukować dodatkowe wiersze informacji, gdy tryb wykonywania został wybrany jako DEBUG. Tradycyjnie ludzie włączali tryb debugowania, gdy skrypt wywoływany był z opcjonalnym argumentem, takim jak-d

Raju
źródło
6

-u: domyślnie wyłączone. Po aktywacji wyświetlany jest komunikat o błędzie podczas używania nieskonfigurowanej zmiennej.

-v: domyślnie nieaktywne. Po aktywacji oryginalna treść informacji zostanie wyświetlona (bez zmiennej rozdzielczości) przed wyświetleniem informacji.

-x: domyślnie nieaktywne. Jeśli aktywowane, treść polecenia zostanie wyświetlona przed uruchomieniem polecenia (po rozwiązaniu zmiennej wyświetlany jest symbol ++).

Porównaj następujące różnice:

/ # 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
źródło