Jak sprawić, aby „bash -x” (tryb debugowania) powracał do skryptów źródłowych?

9

Próbuję debugować, co bash robi podczas inicjowania logowania dla systemu Linux. Czytałem, że „bash -x” sprawi, że bash wydrukuje to, co robi, ale nie drukuje poleceń w źródłowych plikach, takich jak „set -x”. Nie mogę użyć „set -x”, ponieważ inicjalizacja przebiega przed wywołaniem. „bash -x” wydaje się powtarzać dobrze na OS X, ale może to być spowodowane wersjami basha.

Linux: 3.2.25

OS X: 3.2.48

Oto fragment nierekursywnego zachowania w systemie Linux:

bash -l -x -c 'echo 1'
# ... snip ...
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/vim.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/vim.sh
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/which-2.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/which-2.sh
# ... snip ...

Zauważ, że źródło /etc/profile.d/vim.sh jest pozyskiwane, ale jego polecenia nie są drukowane. Czy istnieje obejście bez aktualizacji? Czy jest to spowodowane różnicą wersji?

Kelvin
źródło

Odpowiedzi:

1

set -x gdzieś w pliku root (ten, który wymaga wszystkich innych plików) powinien działać. Alternatywnie, wprowadź coś takiego [[ !-z "$DEBUG" ]] && set -x w każdym pliku i zadzwoń z DEBUG=1 script.sh.

mkaito
źródło
Gdzie jest plik root? Czy jest niezależna od platformy?
Kelvin
„Plik root” oznacza po prostu plik, który wywołujesz w powłoce, a który importuje inne pliki. W moim przykładzie plik root to script.sh
mkaito
1
Ale inicjalizacja logowania bash następuje przed uruchomieniem skryptu. Jest za późno, aby uruchomić „set -x” w skrypcie. Spróbuj sam - uruchom „bash -l -x script.sh”. Zobaczysz, co dzieje się przed uruchomieniem poleceń skryptu.
Kelvin
Dlaczego na Ziemi uruchomisz skrypt bash -l? To jest przeznaczone do interaktywnych powłok. Skrypt nie jest powłoką interaktywną.
mkaito
3
Proszę, bądź trochę bardziej otwarty - oczywiście twórcy basha uznali to za przydatne. Widzę 2 zastosowania (przynajmniej): 1) Chcesz uruchomić ssh user@host 'bash -l -c command' więc masz poprawne załadowanie env. 2) Jesteś administratorem i chcesz rozwiązywać problemy co robią skrypty inicjujące przed Twój skrypt działa - bash -l -x pokaże Ci. Czasami chcesz wiedzieć, gdzie ustawiana jest zmienna env.
Kelvin
0

Ponieważ pobierasz skrypty i nie wykonujesz, pierwszym poleceniem w głównym skrypcie powinno być „set -x”

Teraz wszystkie skrypty źródłowe będą uruchamiane bardziej w debugowaniu. Pamiętaj, że kiedy tworzysz skrypt, działa on w bieżącej powłoce, więc jeśli raz ustawisz -x, będzie to dobre dla wszystkich skryptów źródłowych.

Sam
źródło