„Bash“ paleidimas išsamiai

Jei ieškodami radote šį puslapį, tikriausiai bandote išspręsti problemą, susijusią su bash paleidimu.

Galbūt jūsų bash aplinka nenustato aplinkos kintamojo ir jūs nesuprantate kodėl. Galbūt ką nors įstrigote įvairiuose bash įkrovos failuose ar profiliuose arba visuose failuose atsitiktinai, kol tai suveikė.

Bet kuriuo atveju šios pastabos esmė yra kuo paprasčiau išdėstyti bash paleidimo procedūrą, kad galėtumėte susidoroti su problemomis.

Schema

Šioje struktūrinėje diagramoje apibendrinami visi procesai paleidžiant bash.

„Bash“ paleidimas išsamiai

Dabar atidžiau pažvelkime į kiekvieną dalį.

Prisijungti Shell?

Pirmiausia turite pasirinkti, ar esate prisijungimo apvalkale, ar ne.

Prisijungimo apvalkalas yra pirmasis apvalkalas, kurį įvedėte prisijungdami prie interaktyvios sesijos. Prisijungimo apvalkalui nereikia vartotojo vardo ir slaptažodžio. Galite priversti prisijungimo apvalkalą paleisti pridėdami vėliavėlę --login kai skambina bash, pavyzdžiui:

bash -- prisijunkite

Prisijungimo apvalkalas nustato bazinę aplinką, kai pirmą kartą paleidžiate bash apvalkalą.

Interaktyvus?

Tada nustatote, ar apvalkalas yra interaktyvus, ar ne.

Tai galima patikrinti pagal kintamojo buvimą PS1 (jis įdiegia komandų įvesties funkciją):

if [ "${PS1-}" ]; tada echo interaktyvus else echo neinteraktyvus fi

Arba pažiūrėkite, ar parinktis nustatyta -i, naudojant specialų brūkšnelio kintamąjį - bash, pavyzdžiui:

$echo$-

Jei išvestyje yra simbolis i, tada apvalkalas yra interaktyvus.

Prisijungimo apvalkale?

Jei esate prisijungimo apvalkale, tada bash ieško failo /etc/profile ir veikia, jei yra.

Tada ieško bet kurio iš šių trijų failų tokia tvarka:

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

Radęs vieną, jis jį paleidžia, o kitus praleidžia.

Interaktyviame apvalkale?

Jei esate neprisijungimo apvalkale, daroma prielaida, kad jau buvote prisijungimo apvalkale, aplinka sukonfigūruota ir bus paveldima.

Šiuo atveju šie du failai vykdomi eilės tvarka, jei jie yra:

/etc/bash.bashrc ~/.bashrc

Nėra pasirinkimo?

Jei nesate nei prisijungimo, nei interaktyviame apvalkale, jūsų aplinka tikrai bus tuščia. Tai sukelia daug painiavos (žr. toliau apie cron darbus).

Šiuo atveju bash žiūri į kintamąjį BASH_ENV jūsų aplinką ir sukuria atitinkamą ten nurodytą failą.

Dažni sunkumai ir nykščio taisyklės

cron darbai

95 % atvejų derinu „bash“ paleidimą, nes cron darbas neveikia taip, kaip tikėtasi.

Ši prakeikta užduotis veikia gerai, kai paleidžiu jį komandinėje eilutėje, bet nepavyksta, kai paleidžiu jį programoje crontab.

Čia dvi priežastys:

  • Cron darbai nėra interaktyvūs.
  • Skirtingai nuo komandinės eilutės scenarijų, cron užduotys nepaveldi apvalkalo aplinkos.

Paprastai nepastebėsite ir nesirūpinsite, kad apvalkalo scenarijus nėra interaktyvus, nes aplinka paveldima iš interaktyvaus apvalkalo. Tai reiškia, kad viskas PATH и alias sukonfigūruotas taip, kaip tikitės.

Štai kodėl dažnai reikia nustatyti konkretų PATH tokiai cron užduočiai kaip čia:

* * * * * PATH=${PATH}:/kelias/į/mano/programa/aplankas manoprograma

Scenarijai, skambinantys vienas kitam

Kita dažna problema yra tada, kai scenarijai klaidingai sukonfigūruojami skambinti vienas kitam. Pavyzdžiui, /etc/profile kreipiasi į ~/.bashrc.

Paprastai taip nutinka, kai kas nors bandė ištaisyti kokią nors klaidą ir atrodė, kad viskas veikia. Deja, kai reikia atskirti šiuos skirtingus seansų tipus, iškyla naujų problemų.

„Sandboxed Docker“ vaizdas

Norėdamas eksperimentuoti su apvalkalo paleidimu, sukūriau „Docker“ vaizdą, kurį galima naudoti derinant apvalkalo veikimą saugioje aplinkoje.

Paleisti:

$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash

„Dockerfile“ yra čia.

Norėdami priversti prisijungti ir imituoti prisijungimo apvalkalą:

$ bash --login

Norėdami patikrinti kintamųjų rinkinį BASH_ENV:

$ env | grep BASH_ENV

Dėl derinimo crontab paprastas scenarijus bus vykdomas kiekvieną minutę (in /root/ascript):

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

Šaltinis: www.habr.com

Добавить комментарий