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?
bash -l
? To jest przeznaczone do interaktywnych powłok. Skrypt nie jest powłoką interaktywną.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.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.
źródło