Ako ste pronašli ovu stranicu u pretrazi, vjerovatno pokušavate riješiti neku vrstu problema pokretanja bash-a.
Možda vaše bash okruženje ne postavlja varijablu okruženja i ne razumijete zašto. Možda ste zaglavili nešto u razne bash boot fajlove ili profile ili sve fajlove nasumice dok nije proradilo.
U svakom slučaju, poenta ovog posta je da bash startup učini što jednostavnijim kako biste se mogli nositi s problemima.
Dijagram
Ovaj dijagram toka sažima sve procese kada se bash pokrene.
Sada pogledajmo detaljnije svaki dio.
login shell?
Prvo morate odabrati da li ste u ljusci za prijavu ili ne.
Shell za prijavu je prva ljuska koju unesete kada se prijavite na interaktivnu sesiju. Shell za prijavu ne zahtijeva korisničko ime i lozinku. Možete prisiliti ljusku za prijavu da se pokrene dodavanjem zastavice --login
kada je pozvan bash
, na primjer:
bash --login
Shell za prijavu postavlja osnovno okruženje kada prvi put pokrenete bash shell.
Interaktivan?
Zatim određujete da li je ljuska interaktivna ili ne.
Ovo se može provjeriti prisustvom varijable PS1
(postavlja funkciju unosa komande):
if [ "${PS1-}" ]; zatim echo interaktivno else echo neinteraktivno fi
Ili pogledajte da li je opcija postavljena -i
, koristeći posebnu varijablu crtice -
u bash-u, na primjer:
$echo $-
Ako postoji simbol u izlazu i
, tada je ljuska interaktivna.
U ljusci za prijavu?
Ako ste u ljusci za prijavu, bash traži datoteku /etc/profile
i radi ako postoji.
Zatim traži bilo koju od ove tri datoteke sljedećim redoslijedom:
~/.bash_profile ~/.bash_login ~/.profile
Kada pronađe jedan, pokreće ga i preskače ostale.
U interaktivnoj ljusci?
Ako ste u interaktivnoj ljusci bez prijave, pretpostavlja se da ste već bili u ljusci za prijavu, okruženje je postavljeno i bit će naslijeđeno.
U ovom slučaju, sljedeća dva fajla se izvršavaju redom, ako postoje:
/etc/bash.bashrc ~/.bashrc
Nema opcije?
Ako niste ni u ljusci za prijavu ni u interaktivnoj ljusci, tada će vaše okruženje zaista biti prazno. Ovo uzrokuje dosta zabune (pogledajte dolje za cron poslove).
U ovom slučaju, bash gleda na varijablu BASH_ENV
vaše okruženje i kreira odgovarajuću datoteku koja je tamo navedena.
Tipične poteškoće i osnovna pravila
cron poslovi
95% mog bash startup otklanjanja grešaka je zbog toga što cron posao ne radi kako se očekivalo.
Ovaj prokleti zadatak radi dobro kada ga pokrenem iz komandne linije, ali ne uspijeva kada ga pokrenem iz crontab-a.
to je dva razloga:
- cron poslovi nisu interaktivni.
- Za razliku od skriptiranja komandne linije, cron poslovi ne nasljeđuju okruženje ljuske.
Obično ne primjećujete ili ne brinete da shell skripta nije interaktivna jer je okruženje naslijeđeno od interaktivne ljuske. To znači da sve PATH
и alias
konfigurisan kako biste očekivali.
Zbog toga je često potrebno utvrditi specifičnost PATH
za cron zadatak kao što je ovaj:
* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram
Skripte se međusobno pozivaju
Još jedan čest problem je kada su skripte greškom podešene da se međusobno pozivaju. Na primjer, /etc/profile
apeluje na ~/.bashrc
.
Ovo se obično dešava kada je neko pokušao da ispravi neku vrstu greške i činilo se da sve funkcioniše. Nažalost, kada je u pitanju razdvajanje ovih različitih vrsta sesija, pojavljuju se novi problemi.
Docker slika u sandboxu
Kako bih eksperimentirao s pokretanjem ljuske, napravio sam Docker sliku koja se može koristiti za otklanjanje grešaka pri pokretanju ljuske u sigurnom okruženju.
Pokreni:
$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash
Dockerfile se nalazi
Za prisilno prijavljivanje i simulaciju ljuske za prijavu:
$ bash --login
Za testiranje skupa varijabli BASH_ENV
:
$ env | grep BASH_ENV
Za otklanjanje grešaka crontab
jednostavna skripta će se izvršavati svake minute (u /root/ascript
):
$ crontab -l
$ cat /var/log/script.log
izvor: www.habr.com