Bash-ті егжей-тегжейлі іске қосу

Егер сіз бұл бетті іздеуде тапсаңыз, сіз bash іске қосу арқылы қандай да бір мәселені шешуге тырысып жатқан шығарсыз.

Мүмкін сіздің bash ортаңыз айнымалы ортаны орнатпайды және неге екенін түсінбейсіз. Сіз әртүрлі bash жүктеу файлдарында немесе профильдерінде немесе барлық файлдарда жұмыс істегенге дейін кездейсоқ бірдеңені жабыстырған болуыңыз мүмкін.

Қалай болғанда да, бұл жазбаның мәні - проблемаларды шешу үшін bash-ті бастау процедурасын мүмкіндігінше қарапайым етіп көрсету.

Диаграмма

Бұл блок-схема bash іске қосу кезіндегі барлық процестерді қорытындылайды.

Bash-ті егжей-тегжейлі іске қосу

Енді әр бөлікті толығырақ қарастырайық.

Shell жүйесіне кіру керек пе?

Алдымен сіз кіру қабығында екеніңізді немесе жоқ екеніңізді таңдауыңыз керек.

Кіру қабығы интерактивті сеанс үшін жүйеге кірген кезде енгізілетін бірінші қабық болып табылады. Кіру қабығы пайдаланушы аты мен құпия сөзді қажет етпейді. Жалаушаны қосу арқылы кіру қабығын күштеп бастауға болады --login шақырғанда bash, мысалы:

bash - кіру

Кіру қабығы bash қабықшасын алғаш рет іске қосқан кезде негізгі ортаны орнатады.

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

Содан кейін қабықтың интерактивті немесе жоқ екенін анықтайсыз.

Мұны айнымалының болуы арқылы тексеруге болады PS1 (ол пәрменді енгізу функциясын орнатады):

егер [ "${PS1-}" ]; содан кейін
  жаңғырық интерактивті
басқа
  жаңғырық интерактивті емес
fi

Немесе опция орнатылғанын тексеріңіз -i, арнайы сызықша айнымалысы арқылы - bash-де, мысалы:

$echo$-

Егер шығыста таңба болса i, онда қабық интерактивті болады.

Жүйеге кіру қабығында?

Егер сіз кіру қабығында болсаңыз, 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/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 қарапайым сценарий әр минут сайын орындалады (in /root/ascript):

$ crontab -l
$ cat /var/log/script.log

Ақпарат көзі: www.habr.com

пікір қалдыру