Старт на Bash в детайли

Ако сте намерили тази страница в търсене, вероятно се опитвате да решите проблем с инициализирането на bash.

Възможно е в средата ви 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 bash

Dockerfile се намира тук..

За принудително влизане и имитация на входящ шелл:

$ bash --login

За проверка на набора от променливи BASH_ENV:

$ env | grep BASH_ENV

За отстраняване на проблеми crontab всяка минута ще се изпълнява прост скрипт (в /root/ascript):

$ crontab -l
$ cat \/var\/log\/script.log

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster