Ak ste našli túto stránku vo vyhľadávaní, určite sa snažíte vyriešiť nejaký problém so spustením bash.
Možno vo vašom prostredí bash nenastavuje premennú prostredia a neviete prečo. Možno ste do rôznych spúšťacích súborov bash alebo profilov vložili niečo, alebo ste vyskúšali všetky súbory, kým to nefungovalo.
V každom prípade, zmyslom tejto poznámky je čo najjednoduchšie vysvetliť postup spustenia bash, aby ste sa mohli vysporiadať s problémami.
Diagram
Tento blokový diagram sumarizuje všetky procesy pri spúšťaní bash.

Teraz sa podrobnejšie pozrime na každú časť.
Login Shell?
Najprv musíte zistiť, či sa nachádzate v príkazovom shelli prihlásenia (login shell) alebo nie.
Shell prihlásenia je prvý shell, do ktorého sa dostanete pri prihlásení do systému pre interaktívnu reláciu. Shell prihlásenia nevyžaduje zadanie používateľského mena a hesla. Môžete donútiť spustenie shellu prihlásenia pridaním premennej --login pri volaní bash, napríklad:
bash --login
Shell prihlásenia nastavuje základné prostredie pri prvom spustení shellu bash.
Interaktívny?
Potom určujete, či je shell interaktívny alebo nie.
To môžete skontrolovať prítomnosťou premennej PS1 (nastavuje funkciu zadávania príkazov):
if [ "${PS1-}" ]; then
echo interaktívny
else
echo neinteraktívny
fi Alebo sa môžete pozrieť, či je nastavený parameter -i, pomocou špeciálnej premennej pomlčky - v bash, napríklad:
$ echo $-
Ak je v nádobe znak i, potom je shell interaktívny.
V shelli prihlásenia?
Ak ste v shelli prihlásenia, bash hľadá súbor /etc/profile a spúšťa ho, ak existuje.
Potom hľadá ktorúkoľvek z týchto troch súborov v nasledujúcom poradí:
~/.bash_profile ~/.bash_login ~/.profile
Keď nájde jeden, spustí ho a preskočí ostatné.
V interaktívnom shelle?
Ak sa nachádzate v interaktívnom shelle bez prihlásenia (non-login shell), predpokladá sa, že ste už boli v shelli prihlásenia, prostredie je nastavené a bude zdedené.
V tomto prípade sa postupne vykonajú nasledujúce dva súbory, ak existujú:
/etc/bash.bashrc ~/.bashrc
Žiadna možnosť?
Ak nie ste ani v shelli prihlásenia, ani v interaktívnom shelle, vaše prostredie bude skutočne prázdne. To spôsobuje veľký zmätok (pozri nižšie o úlohách cron).
V takom prípade bash hľadá premennú BASH_ENV vášho prostredia a vytvorí zodpovedajúci súbor, ktorý je tam uvedený.
Typické problémy a empirické pravidlá
Cron úlohy
V 95% prípadoch je moja debuggovanie spustenia bash spojené s tým, že cron úloha nefunguje podľa očakávania.
Tá prekliata úloha funguje normálne, keď ju spustím v príkazovom riadku, ale zlyhá pri spustení v crontab.
Tu dve príčiny:
- Cron úlohy nie sú interaktívne.
- Na rozdiel od skriptov v príkazovom riadku, cron úlohy nezdedí prostredie terminálu.
Zvyčajne si nevšimnete alebo vás nezaujíma, že skript terminálu nie je interaktívny, pretože prostredie sa dedí z interaktívneho terminálu. To znamená, že všetko PATH a alias sú nastavené tak, ako očakávate.
Preto je často potrebné nastaviť konkrétny PATH pre cron úlohu, ako tu:
* * * * * PATH=${PATH}:\/path\/to\/my\/program\/folder myprogramSkripty, ktoré sa volajú navzájom
Ďalší bežný problém, keď sú skripty omylom nastavené na vzájomné volanie. Napríklad /etc/profile odkazuje na ~~/.bashrc.
Zvyčajne sa to stáva, keď sa niekto pokúsil opraviť nejakú chybu a zdalo sa, že všetko funguje. Žiaľ, pri potrebe oddeliť tieto rôzne typy relácií vznikajú nové problémy.
Docker obraz v pieskovisku
Aby som experimentoval so spustením terminálu, vytvoril som Docker obraz, ktorý sa dá použiť na ladenie spustenia terminálu v bezpečnom prostredí.
Spustenie:
$ docker run -n bs -d imiell\/bash_startup
$ docker exec -ti bs bashDockerfile sa nachádza .
Pre nútené prihlásenie a napodobnenie prihlásenia terminálu:
$ bash --login Pre kontrolu súboru premenných BASH_ENV:
$ env | grep BASH_ENV Pre ladenie crontab každú minútu sa vykoná jednoduchý skript (v /root/ascript):
$ crontab -l
$ cat \/var\/log\/script.logZdroj: habr.com
