Pokud jste našli tuto stránku ve vyhledávání, pravděpodobně se snažíte vyřešit nějaký problém s běžícím bashem.
Možná vaše prostředí bash nenastavuje proměnnou prostředí a vy nechápete proč. Možná jste něco zapíchli do různých zaváděcích souborů nebo profilů bash nebo do všech souborů náhodně, dokud to nefungovalo.
V každém případě je smyslem této poznámky co nejjednodušeji rozložit postup spuštění bashe, abyste se mohli vypořádat s problémy.
Диаграмма
Tento vývojový diagram shrnuje všechny procesy při spuštění bash.
Nyní se na jednotlivé části podíváme blíže.
Přihlašovací shell?
Nejprve si musíte vybrat, zda jste v přihlašovacím shellu nebo ne.
Přihlašovací shell je první shell, který zadáte, když se přihlašujete k interaktivní relaci. Přihlašovací shell nevyžaduje uživatelské jméno a heslo. Spuštění přihlašovacího shellu můžete vynutit přidáním příznaku --login
při zavolání bash
, Například:
bash --přihlášení
Přihlašovací shell nastaví základní prostředí při prvním spuštění bash shellu.
Interaktivní?
Poté určíte, zda je shell interaktivní nebo ne.
To lze zkontrolovat přítomností proměnné PS1
(nainstaluje funkci zadávání příkazů):
if [ "${PS1-}" ]; pak echo interaktivní else echo neinteraktivní fi
Nebo se podívejte, zda je tato možnost nastavena -i
pomocí speciální proměnné pomlčky -
v bash, například:
$echo$-
Pokud je ve výstupu symbol i
, pak je shell interaktivní.
V přihlašovacím shellu?
Pokud jste v přihlašovacím prostředí, bash hledá soubor /etc/profile
a běží, pokud existuje.
Poté vyhledá kterýkoli z těchto tří souborů v následujícím pořadí:
~/.bash_profile ~/.bash_login ~/.profile
Když jednoho najde, spustí ho a ostatní přeskočí.
V interaktivním prostředí?
Pokud jste v nepřihlašovacím prostředí, předpokládá se, že jste již byli v přihlašovacím prostředí, prostředí je nakonfigurováno a bude zděděno.
V tomto případě jsou následující dva soubory spuštěny v pořadí, pokud existují:
/etc/bash.bashrc ~/.bashrc
Žádná možnost?
Pokud nejste v přihlašovacím ani interaktivním prostředí, vaše prostředí bude skutečně prázdné. To způsobuje spoustu zmatků (viz níže o úlohách cron).
V tomto případě se bash dívá na proměnnou BASH_ENV
prostředí a vytvoří odpovídající soubor, který je zde zadán.
Běžné potíže a pravidla palce
cron pracovní místa
V 95 % případů, kdy ladím spouštění bash, je to proto, že úloha cron neběží podle očekávání.
Tenhle zatracený úkol funguje dobře, když jej spustím na příkazovém řádku, ale selže, když jej spustím v crontab.
Zde ze dvou důvodů:
- Cron úlohy nejsou interaktivní.
- Na rozdíl od skriptů příkazového řádku úlohy cron nedědí prostředí shellu.
Obvykle si nevšimnete nebo vás nezajímá, že skript shellu není interaktivní, protože prostředí dědí z interaktivního shellu. To znamená, že všechno PATH
и alias
nakonfigurovaný tak, jak byste očekávali.
Často je proto nutné nastavit konkrétní PATH
pro úlohu cronu jako zde:
* * * * * PATH=${PATH}:/cesta/k/mému/programu/složce můjprogram
Skripty se navzájem volají
Dalším běžným problémem je, když jsou skripty mylně nakonfigurovány tak, aby se navzájem volaly. Například, /etc/profile
apeluje na ~/.bashrc
.
To se obvykle stává, když se někdo pokusil opravit nějakou chybu a zdálo se, že vše funguje. Bohužel, když potřebujete oddělit tyto různé typy relací, vyvstávají nové problémy.
Obrázek Sandboxed Docker
Abych experimentoval se spuštěním shellu, vytvořil jsem obraz Dockeru, který lze použít k ladění běhu shellu v zabezpečeném prostředí.
Zahájení:
$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash
Dockerfile se nachází
Chcete-li vynutit přihlášení a simulovat přihlašovací shell:
$ bash --login
Chcete-li otestovat sadu proměnných BASH_ENV
:
$ env | grep BASH_ENV
Pro ladění crontab
každou minutu bude spuštěn jednoduchý skript (in /root/ascript
):
$ crontab -l
$ cat /var/log/script.log
Zdroj: www.habr.com