Изпълнение на Bash в детайли

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

Може би вашата bash среда не задава променлива на средата и не разбирате защо. Може да сте поставили нещо в различни файлове или профили за стартиране на bash или във всички произволни файлове, докато не проработи.

Във всеки случай целта на тази бележка е да изложи процедурата за стартиране на bash възможно най-просто, така че да можете да се справите с проблемите.

Диаграма

Тази блок-схема обобщава всички процеси при изпълнение на bash.

Изпълнение на Bash в детайли

Сега нека разгледаме по-подробно всяка част.

Влизане в Shell?

Първо трябва да изберете дали сте в обвивката за вход или не.

Обвивката за вход е първата обвивка, която влизате, когато влизате за интерактивна сесия. Обвивката за вход не изисква потребителско име и парола. Можете да принудите обвивката за влизане да стартира, като добавите флаг --login при повикване bash, например:

bash --влизане

Обвивката за влизане настройва основната среда, когато за първи път стартирате обвивката bash.

Интерактивен?

След това определяте дали черупката е интерактивна или не.

Това може да се провери чрез наличието на променливата PS1 (инсталира функцията за въвеждане на команда):

if [ "${PS1-}" ]; след това ехо интерактивно друго ехо неинтерактивно fi

Или вижте дали опцията е зададена -i, използвайки специална променлива с тире - в bash, например:

$ехо$-

Ако има символ в изхода i, тогава обвивката е интерактивна.

В обвивката за вход?

Ако сте в shell за влизане, bash търси файла /etc/profile и работи, ако съществува.

След това търси всеки от тези три файла в следния ред:

~/.bash_profile ~/.bash_login ~/.profile

Когато намери един, той го стартира и пропуска останалите.

В интерактивна обвивка?

Ако сте в обвивка без влизане, предполага се, че вече сте били в обвивка за влизане, средата е конфигурирана и ще бъде наследена.

В този случай следните два файла се изпълняват по ред, ако съществуват:

/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

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

Добавяне на нов коментар