Запуск Bash у дэталях

Калі вы знайшлі гэтую старонку ў пошуку, то напэўна спрабуеце вырашыць нейкую праблему з запускам bash.

Магчыма, у вашым асяроддзі 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

Дадаць каментар