Ба таври муфассал иҷро кардани Bash

Агар шумо ин саҳифаро дар ҷустуҷӯ пайдо карда бошед, шумо эҳтимол кӯшиш карда истодаед, ки як навъ мушкилоти оғози bash-ро ҳал кунед.

Шояд муҳити bash шумо тағирёбандаи муҳити зистро муқаррар накарда бошад ва шумо чаро намефаҳмед. Шумо шояд чизеро дар файлҳои гуногуни boot bash ё профилҳо ё ҳама файлҳо ба таври тасодуфӣ часпида бошед, то он даме ки он кор кунад.

Дар ҳар сурат, ҳадафи ин мақола ин аст, ки оғози bash то ҳадди имкон содда карда шавад, то шумо бо мушкилот мубориза баред.

Диаграмма

Ин диаграмма ҳамаи равандҳоро ҳангоми оғози bash ҷамъбаст мекунад.

Ба таври муфассал иҷро кардани Bash

Акнун биёед ба ҳар як қисм бодиққат назар кунем.

қабати воридшавӣ?

Аввал шумо бояд интихоб кунед, ки шумо дар қабати воридшавӣ ҳастед ё не.

Силсилаи воридшавӣ аввалин ҷабҳаест, ки шумо ҳангоми ворид шудан ба сессияи интерактивӣ ворид мекунед. Қабули воридшавӣ номи корбар ва паролро талаб намекунад. Шумо метавонед як қабати воридшавиро маҷбур кунед, ки бо илова кардани парчам оғоз кунед --login вақте ки даъват bash, масалан:

bash - ворид шудан

Қабули воридшавӣ муҳити асосиро ҳангоми бори аввал оғоз кардани қабати bash муқаррар мекунад.

Интерактив?

Пас шумо муайян мекунед, ки қабат интерактивӣ аст ё не.

Инро бо мавҷудияти тағирёбанда тафтиш кардан мумкин аст PS1 (он вазифаи вуруди фармонро муқаррар мекунад):

агар [ "${PS1-}" ]; пас echo интерактивӣ дигар echo ғайри интерактивӣ fi

Ё бубинед, ки оё интихоб муқаррар карда шудааст -i, бо истифода аз тағирёбандаи дефиси махсус - дар bash, масалан:

$echo $-

Агар дар баромад аломате бошад i, он гоҳ қабати интерактивӣ аст.

Дар қабати воридшавӣ?

Агар шумо дар қабати воридшавӣ бошед, он гоҳ bash файлро ҷустуҷӯ мекунад /etc/profile ва агар он вуҷуд дошта бошад, кор мекунад.

Он гоҳ яке аз ин се файлро бо тартиби зерин ҷустуҷӯ мекунад:

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

Вақте ки якеро пайдо мекунад, онро оғоз мекунад ва дигаронро мегузаранд.

Дар қабати интерактивӣ?

Агар шумо дар қабати интерактивии ғайрилогин бошед, тахмин карда мешавад, ки шумо аллакай дар қабати воридшавӣ будаед, муҳит танзим шудааст ва ба мерос гирифта мешавад.

Дар ин ҳолат, ду файли зерин бо тартиб иҷро карда мешаванд, агар онҳо вуҷуд дошта бошанд:

/etc/bash.bashrc ~/.bashrc

Варианти нест?

Агар шумо на дар қабати воридшавӣ ва на дар қабати интерактивӣ набошед, муҳити шумо воқеан холӣ хоҳад буд. Ин боиси нофаҳмиҳои зиёд мегардад (ба поён барои корҳои cron нигаред).

Дар ин ҳолат, bash ба тағирёбанда назар мекунад BASH_ENV муҳити шумо ва файли мувофиқеро, ки дар он ҷо нишон дода шудааст, эҷод мекунад.

Мушкилот ва қоидаҳои маъмулӣ

ҷойҳои кори cron

95% ислоҳи оғозёбии ман аз сабаби он аст, ки кори cron мувофиқи интизорӣ кор намекунад.

Ин вазифаи лаънатй вақте ки ман онро аз сатри фармон иҷро мекунам, хуб кор мекунад, аммо вақте ки ман онро аз crontab иҷро мекунам, ноком мешавад.

Ин аст, ду сабаб:

  • ҷойҳои кори cron интерактивӣ нестанд.
  • Баръакси скрипти сатри фармон, корҳои cron муҳити ҷилдиро мерос намегиранд.

Шумо одатан аҳамият намедиҳед, ки скрипти ҷабҳа интерактивӣ нест, зеро муҳити атроф аз қабати интерактивӣ мерос гирифта шудааст. Ин маънои онро дорад, ки ҳама чиз PATH и alias тавре ки шумо интизор будед, танзим кардаед.

Аз ин рӯ, аксар вақт зарур аст, ки як мушаххас PATH барои вазифаи cron ба монанди ин:

* * * * * PATH=${PATH}:/path/to/my/program/papka барномаи ман

Скриптҳое, ки якдигарро даъват мекунанд

Мушкилоти дигари маъмул ин аст, ки скриптҳо ба таври хато ба ҳамдигар занг зананд. Барои намуна, /etc/profile ишора мекунад ~/.bashrc.

Ин одатан вақте рӯй медиҳад, ки касе кӯшиш кард, ки ягон хатогиро ислоҳ кунад ва ҳама чиз кор мекард. Мутаассифона, вакте ки сухан дар бораи чудо кардани ин навъхои гуногуни сессия меравад, проблемахои нав ба миён меоянд.

Тасвири докер дар қуттии қум

Барои озмоиш бо оғози shell, ман як тасвири Docker сохтам, ки онро метавон барои ислоҳи оғозёбии shell дар муҳити бехатар истифода бурд.

Оғози:

$ 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

Манбаъ: will.com

Илова Эзоҳ