Running Bash yn detail

As jo ​​​​dizze side fûn hawwe yn in sykopdracht, besykje jo wierskynlik wat probleem op te lossen mei it útfieren fan bash.

Miskien stelt jo bash-omjouwing gjin omjouwingsfariabele yn en jo begripe net wêrom. Jo hawwe miskien wat yn ferskate bash-bootbestannen of profilen of alle bestannen willekeurich stutsen oant it wurke.

Yn alle gefallen is it punt fan dizze notysje om de proseduere foar it begjinnen fan bash sa ienfâldich mooglik út te lizzen, sadat jo problemen kinne omgean.

Diagram

Dit flowchart vat alle prosessen gear by it útfieren fan bash.

Running Bash yn detail

Litte wy no elk diel fan tichterby besjen.

Oanmelde Shell?

Earst moatte jo kieze oft jo yn 'e login shell binne of net.

De login shell is de earste shell dy't jo ynfiere as jo ynlogge foar in ynteraktive sesje. De login shell hat gjin brûkersnamme en wachtwurd nedich. Jo kinne de oanmeldshell twinge om te begjinnen troch in flagge ta te foegjen --login wannear neamd bashbygelyks:

bash --login

De oanmeldshell stelt de basisomjouwing yn as jo de bash-shell foar it earst begjinne.

Ynteraktyf?

Dan bepale jo oft de shell ynteraktyf is of net.

Dit kin kontrolearre wurde troch de oanwêzigens fan 'e fariabele PS1 (it ynstallearret de kommando-ynfierfunksje):

if ["${PS1-}" ]; dan echo ynteraktyf oars echo net-ynteraktyf fi

Of sjoch as de opsje is ynsteld -i, mei in spesjale hyphen fariabele - yn bash, bygelyks:

$echo$-

As der in symboal yn de útfier i, dan is de shell ynteraktyf.

Yn de login shell?

As jo ​​​​yn in login-shell binne, dan siket bash nei it bestân /etc/profile en rint as it bestiet.

Sykje dan ien fan dizze trije bestannen yn 'e folgjende folchoarder:

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

As it ien fynt, begjint it en slacht de oaren oer.

Yn in ynteraktive shell?

As jo ​​binne yn in net-login shell, It wurdt oannommen dat jo hawwe al west yn in oanmeld shell, de omjouwing is konfigurearre en wurdt erfde.

Yn dit gefal wurde de folgjende twa bestannen yn folchoarder útfierd, as se bestean:

/etc/bash.bashrc ~/.bashrc

Gjin opsje?

As jo ​​​​net yn in oanmeldshell of in ynteraktive shell binne, dan sil jo omjouwing yndie leech wêze. Dit soarget foar in soad betizing (sjoch hjirûnder oer cron-banen).

Yn dit gefal sjocht bash nei de fariabele BASH_ENV jo omjouwing en makket it dêroer oantsjutte bestân oan.

Algemiene swierrichheden en thumbregels

cron jobs

95% fan 'e tiid dat ik debug bash opstarten is it om't de cron baan net rint as ferwachte.

Dizze ferdomde taak wurket prima as ik it útfiere op 'e kommandorigel, mar mislearret as ik it yn crontab útfiere.

it is twa redenen:

  • Cron banen binne net ynteraktyf.
  • Oars as kommandorigelskripts, ervje cron-banen de shell-omjouwing net.

Typysk sille jo net fernimme of skele dat in shellskript net ynteraktyf is, om't de omjouwing erft fan 'e ynteraktive shell. Dit betsjut dat alles PATH и alias ynsteld as jo soene ferwachtsje.

Dêrom is it faak nedich om in spesifyk yn te stellen PATH foar in cron-taak lykas hjir:

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

Skripten dy't elkoar oproppe

In oar mienskiplik probleem is wannear't skripts fersin binne konfigureare om elkoar te skiljen. Bygelyks, /etc/profile ferwiist nei ~/.bashrc.

Dit bart normaal as immen besocht wat flater te reparearjen en alles like te wurkjen. Spitigernôch, as jo dizze ferskillende soarten sesjes skiede moatte, ûntsteane nije problemen.

Sandboxed Docker-ôfbylding

Om te eksperimintearjen mei it útfieren fan in shell, haw ik in Docker-ôfbylding makke dy't kin wurde brûkt om it útfieren fan in shell yn in feilige omjouwing te debuggen.

Launch:

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

Dockerfile is te finen hjir.

Om oanmelding te twingen en in oanmeldshell te simulearjen:

$ bash --login

Om in set fan fariabelen te testen BASH_ENV:

$ env | grep BASH_ENV

Foar debuggen crontab in ienfâldich skript sil elke minút wurde útfierd (yn /root/ascript):

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

Boarne: www.habr.com

Add a comment