Hardloop Bash in detail

As jy hierdie bladsy in 'n soektog gevind het, probeer jy waarskynlik 'n probleem oplos deur bash te hardloop.

Miskien stel jou bash-omgewing nie 'n omgewingsveranderlike in nie en jy verstaan ​​nie hoekom nie. Jy het dalk iets in verskeie bash-opstartlêers of -profiele of alle lêers lukraak vasgesteek totdat dit gewerk het.

In elk geval, die punt van hierdie nota is om die prosedure vir die begin van bash so eenvoudig as moontlik uit te lê sodat jy probleme kan hanteer.

Diagram

Hierdie vloeidiagram som al die prosesse op wanneer bash uitgevoer word.

Hardloop Bash in detail

Kom ons kyk nou na elke deel van naderby.

Teken in Shell?

Eerstens moet jy kies of jy in die aanmelddop is of nie.

Die aanmelddop is die eerste dop wat u invoer wanneer u vir 'n interaktiewe sessie aanmeld. Die login shell vereis nie 'n gebruikersnaam en wagwoord nie. Jy kan die aanmelddop dwing om te begin deur 'n vlag by te voeg --login wanneer geroep word bash, byvoorbeeld:

bash --login

Die aanmelddop stel die basisomgewing op wanneer u die bash-dop die eerste keer begin.

Interaktief?

Dan bepaal jy of die dop interaktief is of nie.

Dit kan gekontroleer word deur die teenwoordigheid van die veranderlike PS1 (dit installeer die opdrag-invoerfunksie):

if [ "${PS1-}" ]; dan eggo interaktief anders eggo nie-interaktiewe fi

Of kyk of die opsie gestel is -i, deur 'n spesiale koppeltekenveranderlike te gebruik - in bash, byvoorbeeld:

$echo$-

As daar 'n simbool in die uitvoer is i, dan is die dop interaktief.

In die aanmelddop?

As jy in 'n aanmelddop is, soek bash vir die lêer /etc/profile en loop as dit bestaan.

Soek dan vir enige van hierdie drie lêers in die volgende volgorde:

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

Wanneer dit een vind, begin dit dit en slaan die ander oor.

In 'n interaktiewe dop?

As jy in 'n nie-aanmelddop is, word aanvaar dat jy reeds in 'n aanmelddop was, die omgewing is gekonfigureer en sal geërf word.

In hierdie geval word die volgende twee lêers in volgorde uitgevoer, indien hulle bestaan:

/etc/bash.bashrc ~/.bashrc

Geen opsie nie?

As jy nie in 'n aanmelddop of 'n interaktiewe dop is nie, sal jou omgewing inderdaad leeg wees. Dit veroorsaak baie verwarring (sien hieronder oor cron-bane).

In hierdie geval kyk bash na die veranderlike BASH_ENV jou omgewing en skep die ooreenstemmende lêer wat daar gespesifiseer is.

Algemene probleme en duimreëls

cron werk

95% van die tyd ontfout ek bash-opstart, dit is omdat die cron-werk nie werk soos verwag nie.

Hierdie verdomde taak werk goed as ek dit op die opdragreël laat loop, maar misluk wanneer ek dit in crontab laat loop.

Hier twee redes:

  • Cron-take is nie interaktief nie.
  • Anders as opdragreëlskrifte, erf cron-take nie die dopomgewing nie.

Tipies sal jy nie agterkom of omgee dat 'n dopskrif nie interaktief is nie omdat die omgewing van die interaktiewe dop erf. Dit beteken dat alles PATH и alias gekonfigureer soos jy sou verwag.

Dit is hoekom dit dikwels nodig is om 'n spesifieke stel PATH vir 'n cron-taak soos hier:

* * * * * PATH=${PAD}:/pad/na/my/program/gids myprogram

Skripte wat mekaar roep

Nog 'n algemene probleem is wanneer skrifte verkeerdelik gekonfigureer word om mekaar te bel. Byvoorbeeld, /etc/profile beroep op ~/.bashrc.

Dit gebeur gewoonlik wanneer iemand probeer het om 'n fout reg te stel en alles blyk te werk. Ongelukkig, wanneer jy hierdie verskillende tipe sessies moet skei, ontstaan ​​nuwe probleme.

Sandboxed Docker-beeld

Om te eksperimenteer met die bestuur van 'n dop, het ek 'n Docker-beeld geskep wat gebruik kan word om 'n dop in 'n veilige omgewing te ontfout.

Begin:

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

Dockerfile is geleë hier.

Om aanmelding te dwing en 'n aanmelddop te simuleer:

$ bash --login

Om 'n stel veranderlikes te toets BASH_ENV:

$ env | grep BASH_ENV

Vir ontfouting crontab 'n eenvoudige skrif sal elke minuut uitgevoer word (in /root/ascript):

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

Bron: will.com

Voeg 'n opmerking