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.
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 bash
sama 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
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