Калі вы знайшлі гэтую старонку ў пошуку, то напэўна спрабуеце вырашыць нейкую праблему з запускам bash.
Магчыма, у вашым асяроддзі bash не ўстанаўліваецца пераменная асяроддзя і вы не разумееце, чаму. Магчыма, вы засунулі нешта ў розныя загрузачныя файлы bash ці ў профілі, ці ва ўсе файлы наўздагад, пакуль гэта не спрацавала.
У любым выпадку, сэнс гэтай нататкі як мага прасцей выкласці працэдуру запуску bash, каб вы маглі зладзіцца з праблемамі.
Дыяграма
Гэтая блок-схема абагульняе ўсе працэсы пры запуску bash.
Цяпер падрабязней разгледзім кожную частку.
Login Shell?
Перш трэба абраць, знаходзіцеся вы ў каманднай абалонцы ўваходу (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