Ако сте намерили тази страница при търсене, вероятно се опитвате да разрешите някакъв проблем с изпълнение на 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