Pokud jste tuto stránku našli ve vyhledávání, pravděpodobně se snažíte vyřešit nějaký problém se spuštěním bash.
Možná vaše prostředí bash nenastavuje proměnné prostředí a nechápete, proč. Možná jste do různých spouštěcích souborů bash nebo profilů vložili něco, nebo jste to zkoušeli do všech souborů náhodně, dokud to nefungovalo.
V každém případě je smyslem této poznámky co nejsrozumitelněji přiblížit postup spuštění bash, abyste mohli vyřešit problémy.
Diagram
Tento blokový diagram shrnuje všechny procesy při spuštění bash.

Teď se podívejme podrobně na každou část.
Login Shell?
Nejprve musíte rozhodnout, zda jste v přihlašovací shell (login shell) či nikoli.
Přihlašovací shell je první shell, do kterého se dostanete po přihlášení do systému pro interaktivní sezení. Přihlašovací shell nevyžaduje zadání uživatelského jména a hesla. Můžete vynutit spuštění přihlašovacího shellu přidáním příznaku --login při volání, takže všechny bash, například:
bash --login
Přihlašovací shell nastavuje základní prostředí při prvním spuštění shellu bash.
Interaktivní?
Pak určíte, zda je shell interaktivní nebo ne.
To lze zkontrolovat podle přítomnosti proměnné PS1 (nastavuje funkci pro zadávání příkazů):
if [ "${PS1-}" ]; then
echo interactive
else
echo non-interactive
fi Nebo zjistit, zda je nastavený parametr -i, pomocí speciální proměnné s pomlčkou - v bash, například:
$ echo $-
Pokud ve výstupu je znak i, pak je shell interaktivní.
Ve přihlašovacím shellu?
Pokud jste v přihlašovacím shellu, bash hledá soubor /etc/profile a spouští ho, pokud existuje.
Poté hledá kterýkoli z těchto tří souborů v následujícím pořadí:
~/.bash_profile ~/.bash_login ~/.profile
Jakmile najde jeden, spustí ho a ostatní přeskočí.
V interaktivním shellu?
Pokud jste v interaktivním shellu, ale nejste v přihlašovacím shellu (non-login shell), předpokládá se, že jste již byli v přihlašovacím shellu, prostředí je nastavené a bude zděděno.
V tomto případě jsou vykonány následující dva soubory v pořadí, pokud existují:
/etc/bash.bashrc ~/.bashrc
Žádná varianta?
Pokud nejste v přihlašovacím shellu ani v interaktivním shellu, pak bude vaše prostředí skutečně prázdné. To vyvolává velké zmatení (viz níže o úlohách cron).
V tomto případě bash zkontroluje proměnnou BASH_ENV vašeho prostředí a vytvoří odpovídající soubor, který tam je uveden.
Typické potíže a empirická pravidla
Úlohy cron
V 95 % případů je ladění spouštění bash spojeno s tím, že úloha cron nefunguje tak, jak se očekávalo.
Tato Prokletá Úloha funguje správně, když ji spouštím v příkazovém řádku, ale nefunguje, když ji spouštím v crontab..
Zde dva důvody.:
- Úlohy cron nejsou interaktivní.
- Na rozdíl od skriptů v příkazovém řádku úlohy cron nezdědí prostředí shellu.
Obvykle si nevšimnete, nebo vás nezajímá, že skript shellu není interaktivní, protože prostředí se zdědí od interaktivního shellu. To znamená, že vše cest a Spravovat aliasy obrazů je nastaveno tak, jak očekáváte.
Proto často musíte nastavit konkrétní cest pro úlohu cron, jako zde:
* * * * * PATH=${PATH}:\/cesta\/k\/mému\/programu\/adresáři myprogramSkripty, které se volají navzájem.
Dalším běžným problémem je, když jsou skripty omylem nastaveny na vzájemné volání. Například, /etc/profile se obrací na ~/ .bashrc.
Obvykle se to stává, když se někdo snažil opravit nějakou chybu a vypadá to, že vše fungovalo. Bohužel, když je třeba oddělit tyto různé typy relací, vznikají nové problémy.
Docker obraz v sandboxu.
Abych experimentoval se spouštěním shellu, vytvořil jsem Docker obraz, který lze použít pro ladění spouštění shellu ve bezpečném prostředí.
Spuštění:
$ docker run -n bs -d imiell\/bash_startup
$ docker exec -ti bs bashDockerfile se nachází .
Pro nucené přihlášení a simulaci přihlašovacího shellu:
$ bash --login Pro kontrolu sady proměnných BASH_ENV:
$ env | grep BASH_ENV Pro ladění crontab každou minutu se spustí jednoduchý skript (v /root/ascript):
$ crontab -l
$ cat \/var\/log\/script.logZdroj: habr.com
