Детално Running Bash

Ако ја најдовте оваа страница во пребарувањето, веројатно се обидувате да решите некој проблем со трчање баш.

Можеби вашата bash околина не поставува променлива на околината и не разбирате зошто. Можеби сте заглавиле нешто во разни датотеки за подигање на bash или профили или сите датотеки по случаен избор додека не функционира.

Во секој случај, поентата на оваа забелешка е да се постави процедурата за започнување на баш што е можно поедноставно за да можете да се справите со проблемите.

Дијаграм

Овој дијаграм на текови ги сумира сите процеси при извршување на bash.

Детално Running 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

Додадете коментар