Pagdagan sa Bash sa detalye

Kung nakit-an nimo kini nga panid sa usa ka pagpangita, tingali naningkamot ka nga masulbad ang pipila ka mga problema sa pagpadagan sa bash.

Tingali ang imong bash nga palibot wala magbutang usa ka variable sa palibot ug wala nimo masabtan kung ngano. Mahimong adunay usa ka butang nga gi-stuck sa lainlaing mga bash boot file o mga profile o tanan nga mga file nga random hangtod nga kini nagtrabaho.

Sa bisan unsa nga kaso, ang punto niini nga nota mao ang pagbutang sa pamaagi sa pagsugod sa bash sa yano kutob sa mahimo aron imong maatubang ang mga problema.

Diagram

Kini nga flowchart nagsumaryo sa tanan nga mga proseso kung nagdagan sa bash.

Pagdagan sa Bash sa detalye

Karon atong susihon pag-ayo ang matag bahin.

Login sa Shell?

Una kinahanglan nimo nga pilion kung naa ka sa login shell o wala.

Ang login shell mao ang una nga shell nga imong gisudlan kung nag log in ka alang sa usa ka interactive nga sesyon. Ang login shell wala magkinahanglan og username ug password. Mahimo nimong pugson ang pag-login shell sa pagsugod pinaagi sa pagdugang og bandila --login sa dihang gitawag bashsama pananglit:

bash --login

Ang login shell nagpahimutang sa base nga palibot sa una nimo nga pagsugod sa bash shell.

Interactive?

Dayon imong mahibal-an kung ang kabhang interactive o dili.

Kini masusi pinaagi sa presensya sa variable PS1 (kini nag-instalar sa command input function):

kon [ "${PS1-}" ]; unya echo interactive lain echo non-interactive fi

O tan-awa kung ang kapilian gitakda -i, gamit ang espesyal nga hyphen variable - sa bash, pananglitan:

$echo$-

Kung adunay simbolo sa output i, unya ang kabhang mao ang interactive.

Sa login shell?

Kung naa ka sa usa ka shell sa pag-login, unya pangitaon sa bash ang file /etc/profile ug modagan kon kini anaa.

Dayon pangitaa ang bisan asa niining tulo ka mga file sa mosunod nga han-ay:

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

Sa diha nga kini makakaplag sa usa, kini magsugod niini ug molaktaw sa uban.

Sa usa ka interactive nga kabhang?

Kung naa ka sa usa ka shell nga dili pag-login, gituohan nga naa ka na sa usa ka shell sa pag-login, ang palibot gi-configure ug mapanunod.

Sa kini nga kaso, ang mosunod nga duha ka mga file gipatuman sa han-ay, kung kini anaa:

/etc/bash.bashrc ~/.bashrc

Walay kapilian?

Kung wala ka sa usa ka login shell o usa ka interactive shell, nan ang imong palibot mahimong walay sulod. Kini ang hinungdan sa daghang kalibog (tan-awa sa ubos bahin sa mga trabaho sa cron).

Sa kini nga kaso ang bash nagtan-aw sa variable BASH_ENV imong palibot ug nagmugna sa katugbang nga file nga gitakda didto.

Kasagarang mga Kalisud ug Mga Lagda sa Kumagko

cron nga mga trabaho

95% sa oras nga akong gi-debug ang pagsugod sa bash tungod kay ang trabaho sa cron dili molihok sama sa gipaabut.

Kining maldito nga buluhaton maayo ang pagtrabaho kung gipadagan ko kini sa linya sa mando, apan napakyas kung gipadagan ko kini sa crontab.

kini mao ang duha ka rason:

  • Ang mga trabaho sa Cron dili interactive.
  • Dili sama sa mga script sa command line, ang mga trabaho sa cron dili makapanunod sa palibot sa shell.

Kasagaran dili ka makamatikod o magtagad nga ang script sa shell dili interactive tungod kay ang palibot nakapanunod gikan sa interactive nga kabhang. Kini nagpasabot nga ang tanan PATH ΠΈ alias gi-configure sama sa imong gipaabut.

Mao kini ang hinungdan nga kanunay gikinahanglan ang pagtakda sa usa ka espesipiko PATH alang sa usa ka cron nga buluhaton sama dinhi:

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

Mga script nga nagtawag sa usag usa

Ang laing komon nga problema mao kung ang mga script nasayop sa pag-configure aron sa pagtawag sa usag usa. Pananglitan, /etc/profile nag-apelar sa ~/.bashrc.

Kasagaran kini mahitabo kung adunay usa nga misulay sa pag-ayo sa pipila ka mga sayup ug ang tanan ingon og nagtrabaho. Ikasubo, kung kinahanglan nimo nga ibulag kini nga lainlaing mga klase sa mga sesyon, adunay bag-ong mga problema.

Imahe sa Sandboxed Docker

Aron mag-eksperimento sa pagpadagan sa usa ka kabhang, naghimo ako usa ka imahe sa Docker nga magamit sa pag-debug sa pagpadagan sa usa ka kabhang sa usa ka luwas nga palibot.

Paglusad:

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

Ang Dockerfile nahimutang dinhi.

Sa pagpugos sa pag-login ug pag-simulate sa usa ka login shell:

$ bash --login

Sa pagsulay sa usa ka hugpong sa mga variable BASH_ENV:

$ env | grep BASH_ENV

Para sa debugging crontab usa ka yano nga script ang ipatuman matag minuto (sa /root/ascript):

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

Source: www.habr.com

Idugang sa usa ka comment