Detailní spuštění Bash

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.

Detailní 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 myprogram

Skripty, 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 bash

Dockerfile se nachází zde.

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.log

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster