Uruchamianie Basha szczegółowo

Jeśli znalazłeś tę stronę podczas wyszukiwania, prawdopodobnie próbujesz rozwiązać jakiś problem z uruchomieniem basha.

Być może twoje środowisko bash nie ustawia zmiennej środowiskowej i nie rozumiesz dlaczego. Być może utknąłeś coś w różnych plikach lub profilach rozruchowych bash lub we wszystkich plikach losowo, dopóki nie zadziałało.

W każdym razie celem tej notatki jest możliwie najprostsze przedstawienie procedury uruchamiania basha, abyś mógł uporać się z problemami.

Диаграмма

Ten schemat blokowy podsumowuje wszystkie procesy podczas uruchamiania basha.

Uruchamianie Basha szczegółowo

Przyjrzyjmy się teraz bliżej każdej części.

Zaloguj się do powłoki?

Najpierw musisz wybrać, czy jesteś w powłoce logowania, czy nie.

Powłoka logowania to pierwsza powłoka, do której wchodzisz, logując się do sesji interaktywnej. Powłoka logowania nie wymaga nazwy użytkownika i hasła. Możesz wymusić uruchomienie powłoki logowania, dodając flagę --login kiedy wezwany bashna przykład:

bash – zaloguj się

Powłoka logowania konfiguruje środowisko podstawowe przy pierwszym uruchomieniu powłoki bash.

Interaktywny?

Następnie określasz, czy powłoka jest interaktywna, czy nie.

Można to sprawdzić poprzez obecność zmiennej PS1 (instaluje funkcję wprowadzania poleceń):

jeśli ["${PS1-}" ]; następnie echo interaktywne, w przeciwnym razie echo nieinteraktywne fi

Lub sprawdź, czy opcja jest ustawiona -i, używając specjalnej zmiennej łącznikowej - w bashu, na przykład:

$echo$-

Jeśli na wyjściu znajduje się symbol i, wówczas powłoka jest interaktywna.

W powłoce logowania?

Jeśli jesteś w powłoce logowania, bash szuka pliku /etc/profile i działa, jeśli istnieje.

Następnie wyszukuje dowolny z tych trzech plików w następującej kolejności:

~/.bash_profile ~/.bash_login ~/.profile

Kiedy znajdzie jeden, uruchamia go i pomija pozostałe.

W interaktywnej powłoce?

Jeśli jesteś w powłoce bez logowania, zakłada się, że byłeś już w powłoce z logowaniem, środowisko jest skonfigurowane i zostanie odziedziczone.

W tym przypadku wykonywane są w kolejności następujące dwa pliki, jeśli istnieją:

/etc/bash.bashrc ~/.bashrc

Bez wyjścia?

Jeśli nie jesteś w powłoce logowania ani powłoce interaktywnej, twoje środowisko rzeczywiście będzie puste. Powoduje to wiele zamieszania (patrz poniżej o zadaniach cron).

W tym przypadku bash sprawdza zmienną BASH_ENV środowisku i tworzy odpowiedni, określony tam plik.

Typowe trudności i praktyczne zasady

zadania cronowe

W 95% przypadków debuguję uruchamianie basha, dzieje się tak dlatego, że zadanie cron nie działa zgodnie z oczekiwaniami.

To cholerne zadanie działa dobrze, gdy uruchamiam go w wierszu poleceń, ale kończy się niepowodzeniem, gdy uruchamiam go w crontab.

Tutaj dwa powody:

  • Zadania Cron nie są interaktywne.
  • W przeciwieństwie do skryptów wiersza poleceń, zadania cron nie dziedziczą środowiska powłoki.

Zazwyczaj nie zauważysz ani nie przejmiesz się tym, że skrypt powłoki nie jest interaktywny, ponieważ środowisko dziedziczy z interaktywnej powłoki. Oznacza to, że wszystko PATH и alias skonfigurowany tak, jak można się spodziewać.

Dlatego często konieczne jest ustalenie konkretnego PATH dla zadania cron takiego jak tutaj:

* * * * * PATH=${PATH}:/ścieżka/do/mój/program/folder mójprogram

Skrypty nawołujące się nawzajem

Innym częstym problemem jest błędna konfiguracja skryptów do wzajemnego wywoływania się. Na przykład, /etc/profile apeluje do ~/.bashrc.

Zwykle dzieje się tak, gdy ktoś próbował naprawić jakiś błąd i wszystko wydawało się działać. Niestety, gdy trzeba oddzielić te różne typy sesji, pojawiają się nowe problemy.

Obraz Dockera w trybie piaskownicy

Aby poeksperymentować z uruchamianiem powłoki, utworzyłem obraz Dockera, którego można używać do debugowania uruchamiania powłoki w bezpiecznym środowisku.

Uruchomić:

$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash

Znajduje się plik Dockerfile tutaj.

Aby wymusić logowanie i symulować powłokę logowania:

$ bash --login

Aby przetestować zestaw zmiennych BASH_ENV:

$ env | grep BASH_ENV

Do debugowania crontab prosty skrypt będzie wykonywany co minutę (w /root/ascript):

$ crontab -l
$ cat /var/log/script.log

Źródło: www.habr.com

Dodaj komentarz