Co robi `set -x`?


260

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

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

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.


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



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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.