Ако ја најдовте оваа страница во пребарувањето, веројатно се обидувате да решите некој проблем со трчање баш.
Можеби вашата bash околина не поставува променлива на околината и не разбирате зошто. Можеби сте заглавиле нешто во разни датотеки за подигање на bash или профили или сите датотеки по случаен избор додека не функционира.
Во секој случај, поентата на оваа забелешка е да се постави процедурата за започнување на баш што е можно поедноставно за да можете да се справите со проблемите.
Дијаграм
Овој дијаграм на текови ги сумира сите процеси при извршување на bash.
Сега да го разгледаме подетално секој дел.
Најавете се Шел?
Прво треба да изберете дали сте во школката за најавување или не.
Школката за најавување е првата школка што ја внесувате кога се најавувате за интерактивна сесија. Школката за најавување не бара корисничко име и лозинка. Можете да ја принудите школката за најавување да започне со додавање знаме --login
кога ќе се повикаат bash
, на пример:
баш --најава
Школката за најавување ја поставува основната средина кога за прв пат ќе ја стартувате bash школката.
Интерактивна?
Потоа одредувате дали школката е интерактивна или не.
Ова може да се провери со присуство на променливата PS1
(ја инсталира функцијата за внесување команди):
ако [ "${PS1-}" ]; потоа ехо интерактивно друго ехо неинтерактивно фи
Или видете дали опцијата е поставена -i
, користејќи специјална променлива цртичка -
во баш, на пример:
$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
за крона задача како овде:
* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram
Скрипти кои се повикуваат едни со други
Друг вообичаен проблем е кога скриптите се погрешно конфигурирани да се повикуваат едни со други. На пример, /etc/profile
апелира до ~/.bashrc
.
Ова обично се случува кога некој се обидел да поправи некоја грешка и се чинеше дека сè функционира. За жал, кога треба да ги одвоите овие различни типови на сесии, се појавуваат нови проблеми.
Sandboxed 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