Ако сте намерили тази страница в търсене, вероятно се опитвате да решите проблем с инициализирането на bash.
Възможно е в средата ви bash да не установява променливи на средата и да не разбирате защо. Може би сте добавили нещо в различни стартиращи файлове на bash или в профили, или в случайни файлове, докато не е проработило.
Във всеки случай, смисълът на тази бележка е да изложи процедурата за стартиране на bash по най-простия начин, така че да можете да справите с проблемите.
Диаграма
Тази блок-схема обобщава всички процеси при стартиране на bash.

Сега да разгледаме по-подробно всяка част.
Входна оболочка?
Първо е нужно да изберете дали сте в входна командна обвивка (login shell) или не.
Входната обвивка е първата обвивка, в която попадате при влизане в системата за интерактивна сесия. Входната обвивка не изисква въвеждане на потребителско име и парола. Можете да принудите старта на входна обвивка, добавяйки флага --login при извикване bash, например:
bash --login
Входната обвивка настройва основната среда при първоначалното стартиране на bash.
Интерактивна?
След това определяте дали обвивката е интерактивна или не.
Това можете да проверите по наличието на променлива PS1 (тя задава функцията за въвеждане на команди):
if [ "${PS1-}" ]; then
echo interactive
else
echo non-interactive
fi Или да видите дали е зададен параметъра -i, чрез специалната променлива с тире - в bash, например:
$ echo $-
Ако в изхода има символ i, то обвивката е интерактивна.
Входната обвивка?
Ако сте в входна обвивка, то bash търси файла /etc/profile и го стартира, ако съществува.
След това търси всеки от тези три файла в следния ред:
~/.bash_profile ~/.bash_login ~/.profile
Когато намери един, го стартира и пропуска другите.
В интерактивна обвивка?
Ако сте в интерактивна обвивка без вход (non-login shell), се предполага, че вече сте били в входната обвивка, средата е настроена и ще бъде наследена.
В този случай се изпълняват последователно следните два файла, ако съществуват:
/etc/bash.bashrc ~/.bashrc
Няма вариант?
Ако не сте нито в входна обвивка, нито в интерактивна обвивка, тогава средата ви наистина ще бъде пуста. Това може да предизвика голяма объркване (вижте по-долу за cron задания).
В този случай bash разглежда променливата BASH_ENV на вашата среда и създава съответния файл, който е указан там.
Типични трудности и емпирични правила
Cron задания
В 95% случаев, отладка запуска bash е свързана с това, че cron задачата не работи, както се очаква.
Тази проклета задача работи нормално, когато я стартирам в командния ред, но проваля се при стартиране в crontab.
Тук две причини:
- Cron задачите не са интерактивни.
- За разлика от скриптовете в командния ред, cron задачите не наследяват средата на шелла.
Обикновено не забелязвате или не се тревожите, че шелл скриптът не е интерактивен, защото средата се наследява от интерактивния шелл. Това означава, че всичко PATH и alias са настроени така, както очаквате.
Ето защо често е необходимо да установите конкретен PATH за cron задачата, както тук:
* * * * * PATH=${PATH}:\/path\/to\/my\/program\/folder myprogramСкриптове, извикващи един друг
Още един разпространен проблем, когато скриптовете погрешно са настроени да се извикват взаимно. Например, /etc/profile прави запитване към ~/.bashrc.
Обикновено така се случва, когато някой се опитва да коригира грешка и изглежда, че всичко заработва. За съжаление, когато трябва да разделите тези различни типове сесии, възникват нови проблеми.
Docker образ в пясъчник
За да експериментирам с стартиране на шелл, създадох Docker образ, който може да се използва за отстраняване на грешки при стартиране на шелл в безопасна среда.
Стартиране:
$ docker run -n bs -d imiell\/bash_startup
$ docker exec -ti bs bashDockerfile се намира .
За принудително влизане и имитация на входящ шелл:
$ bash --login За проверка на набора от променливи BASH_ENV:
$ env | grep BASH_ENV За отстраняване на проблеми crontab всяка минута ще се изпълнява прост скрипт (в /root/ascript):
$ crontab -l
$ cat \/var\/log\/script.logИзточник: habr.com
