Pagpapatakbo ng Bash nang detalyado

Kung nakita mo ang page na ito sa isang paghahanap, malamang na sinusubukan mong lutasin ang ilang problema sa pagpapatakbo ng bash.

Marahil ang iyong bash environment ay hindi nagtatakda ng environment variable at hindi mo maintindihan kung bakit. Maaaring may na-stuck ka sa iba't ibang bash boot file o profile o lahat ng file nang random hanggang sa gumana ito.

Sa anumang kaso, ang punto ng tala na ito ay upang ilatag ang pamamaraan para sa pagsisimula ng bash nang simple hangga't maaari upang maaari mong harapin ang mga problema.

Π”ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ°

Binubuod ng flowchart na ito ang lahat ng mga proseso kapag nagpapatakbo ng bash.

Pagpapatakbo ng Bash nang detalyado

Ngayon tingnan natin ang bawat bahagi.

Mag-login sa Shell?

Una kailangan mong piliin kung ikaw ay nasa login shell o wala.

Ang login shell ay ang unang shell na ipinasok mo kapag nag-log in ka para sa isang interactive na session. Ang login shell ay hindi nangangailangan ng username at password. Maaari mong pilitin na magsimula ang login shell sa pamamagitan ng pagdaragdag ng flag --login kapag tinawag bash, halimbawa:

bash --login

Ang login shell ay nagse-set up ng base environment noong una mong simulan ang bash shell.

Interactive?

Pagkatapos ay matutukoy mo kung interactive ang shell o hindi.

Ito ay masusuri sa pamamagitan ng pagkakaroon ng variable PS1 (ini-install nito ang command input function):

kung [ "${PS1-}" ]; pagkatapos echo interactive iba pa echo non-interactive fi

O tingnan kung nakatakda ang opsyon -i, gamit ang isang espesyal na variable ng gitling - sa bash, halimbawa:

$echo$-

Kung may simbolo sa output i, pagkatapos ay interactive ang shell.

Sa login shell?

Kung ikaw ay nasa isang login shell, pagkatapos ay hahanapin ng bash ang file /etc/profile at tumatakbo kung ito ay umiiral.

Pagkatapos ay hahanapin ang alinman sa tatlong file na ito sa sumusunod na pagkakasunud-sunod:

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

Kapag nakahanap ito ng isa, sisimulan ito at nilalaktawan ang iba.

Sa isang interactive na shell?

Kung ikaw ay nasa isang non-login shell, ipinapalagay na ikaw ay nasa isang login shell, ang kapaligiran ay na-configure at mamanahin.

Sa kasong ito, ang sumusunod na dalawang file ay isinasagawa sa pagkakasunud-sunod, kung mayroon sila:

/etc/bash.bashrc ~/.bashrc

Walang pagpipilian?

Kung wala ka sa alinman sa isang login shell o isang interactive na shell, kung gayon ang iyong kapaligiran ay talagang walang laman. Nagdudulot ito ng maraming kalituhan (tingnan sa ibaba ang tungkol sa mga trabaho sa cron).

Sa kasong ito, tinitingnan ng bash ang variable BASH_ENV iyong kapaligiran at lumilikha ng kaukulang file na tinukoy doon.

Mga Karaniwang Kahirapan at Panuntunan ng Thumb

mga trabaho sa cron

95% ng oras na nagde-debug ako ng bash startup ito ay dahil ang cron job ay hindi tumatakbo gaya ng inaasahan.

Ang maldita na gawaing ito gumagana nang maayos kapag pinapatakbo ko ito sa command line, ngunit nabigo kapag pinatakbo ko ito sa crontab.

Dito dalawang dahilan:

  • Ang mga Cron job ay hindi interactive.
  • Hindi tulad ng mga script ng command line, ang mga cron job ay hindi namamana ng shell environment.

Karaniwang hindi mo mapapansin o pakialam na ang isang shell script ay hindi interactive dahil ang kapaligiran ay nagmamana mula sa interactive na shell. Nangangahulugan ito na ang lahat PATH ΠΈ alias na-configure gaya ng iyong inaasahan.

Ito ang dahilan kung bakit madalas na kinakailangan upang magtakda ng isang tiyak PATH para sa isang cron na gawain tulad dito:

* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram

Mga script na tumatawag sa isa't isa

Ang isa pang karaniwang problema ay kapag ang mga script ay maling na-configure upang tawagan ang isa't isa. Halimbawa, /etc/profile umapela sa ~/.bashrc.

Karaniwan itong nangyayari kapag sinubukan ng isang tao na ayusin ang ilang error at tila gumagana ang lahat. Sa kasamaang palad, kapag kailangan mong paghiwalayin ang iba't ibang uri ng mga sesyon na ito, may mga bagong problemang lumitaw.

Larawan ng Sandboxed Docker

Upang mag-eksperimento sa pagpapatakbo ng shell, gumawa ako ng Docker na imahe na magagamit sa pag-debug sa pagpapatakbo ng shell sa isang secure na kapaligiran.

Ilunsad:

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

Dockerfile ay matatagpuan dito.

Upang pilitin ang pag-login at gayahin ang isang login shell:

$ bash --login

Upang subukan ang isang hanay ng mga variable BASH_ENV:

$ env | grep BASH_ENV

Para sa pag-debug crontab isang simpleng script ang isasagawa bawat minuto (sa /root/ascript):

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

Pinagmulan: www.habr.com

Magdagdag ng komento