Rhedeg Bash yn fanwl

Os daethoch o hyd i'r dudalen hon mewn chwiliad, mae'n debyg eich bod yn ceisio datrys rhyw broblem gyda rhedeg bash.

Efallai nad yw eich amgylchedd bash yn gosod newidyn amgylchedd ac nad ydych chi'n deall pam. Efallai eich bod wedi glynu rhywbeth mewn amrywiol ffeiliau cist bash neu broffiliau neu bob ffeil ar hap nes iddo weithio.

Mewn unrhyw achos, pwynt y nodyn hwn yw gosod y weithdrefn ar gyfer cychwyn bash mor syml Γ’ phosibl fel y gallwch chi ddelio Γ’ phroblemau.

Diagram

Mae'r siart llif hwn yn crynhoi'r holl brosesau wrth redeg bash.

Rhedeg Bash yn fanwl

Nawr gadewch i ni edrych yn agosach ar bob rhan.

Shell Mewngofnodi?

Yn gyntaf mae angen i chi ddewis a ydych chi yn y gragen mewngofnodi ai peidio.

Y gragen mewngofnodi yw'r gragen gyntaf y byddwch chi'n ei nodi pan fyddwch chi'n mewngofnodi ar gyfer sesiwn ryngweithiol. Nid oes angen enw defnyddiwr a chyfrinair ar y gragen mewngofnodi. Gallwch orfodi'r gragen mewngofnodi i ddechrau trwy ychwanegu baner --login pan y'i gelwir bash, er enghraifft:

bash --login

Mae'r gragen mewngofnodi yn sefydlu'r amgylchedd sylfaenol pan fyddwch chi'n cychwyn y gragen bash gyntaf.

Rhyngweithiol?

Yna byddwch chi'n penderfynu a yw'r gragen yn rhyngweithiol ai peidio.

Gellir gwirio hyn gan bresenoldeb y newidyn PS1 (mae'n gosod y swyddogaeth mewnbwn gorchymyn):

os [ "${ PS1-}" ]; yna adlais rhyngweithiol arall adleisio anrhyngweithiol fi

Neu weld a yw'r opsiwn wedi'i osod -i, gan ddefnyddio newidyn cysylltnod arbennig - mewn bash, er enghraifft:

$echo$-

Os oes symbol yn yr allbwn i, yna mae'r gragen yn rhyngweithiol.

Yn y gragen mewngofnodi?

Os ydych chi mewn cragen mewngofnodi, yna mae bash yn edrych am y ffeil /etc/profile ac yn rhedeg os yw'n bodoli.

Yna chwiliwch am unrhyw un o'r tair ffeil hyn yn y drefn ganlynol:

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

Pan fydd yn dod o hyd i un, mae'n ei gychwyn ac yn hepgor y lleill.

Mewn cragen ryngweithiol?

Os ydych mewn cragen nad yw'n mewngofnodi, tybir eich bod eisoes wedi bod mewn cragen mewngofnodi, mae'r amgylchedd wedi'i ffurfweddu a bydd yn cael ei etifeddu.

Yn yr achos hwn, gweithredir y ddwy ffeil ganlynol mewn trefn, os ydynt yn bodoli:

/etc/bash.bashrc ~/.bashrc

Dim opsiwn?

Os nad ydych mewn cragen mewngofnodi neu gragen ryngweithiol, yna bydd eich amgylchedd yn wir yn wag. Mae hyn yn achosi llawer o ddryswch (gweler isod am swyddi cron).

Yn yr achos hwn mae bash yn edrych ar y newidyn BASH_ENV eich amgylchedd ac yn creu'r ffeil gyfatebol a nodir yno.

Anawsterau Cyffredin a Rheolau Bawd

swyddi cron

95% o'r amser yr wyf yn dadfygio startup bash oherwydd nad yw'r swydd cron yn rhedeg yn Γ΄l y disgwyl.

Y gorchwyl damn hwn yn gweithio'n iawn pan fyddaf yn ei redeg ar y llinell orchymyn, ond yn methu pan fyddaf yn ei redeg yn crontab.

Yma dau reswm:

  • Nid yw swyddi Cron yn rhyngweithiol.
  • Yn wahanol i sgriptiau llinell orchymyn, nid yw swyddi cron yn etifeddu'r amgylchedd cregyn.

Yn nodweddiadol ni fyddwch yn sylwi nac yn poeni nad yw sgript cragen yn rhyngweithiol oherwydd bod yr amgylchedd yn etifeddu o'r gragen ryngweithiol. Mae hyn yn golygu bod popeth PATH ΠΈ alias wedi'i ffurfweddu fel y byddech chi'n ei ddisgwyl.

Dyna pam ei bod yn aml yn angenrheidiol i osod penodol PATH ar gyfer tasg cron fel yma:

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

Sgriptiau yn galw ei gilydd

Problem gyffredin arall yw pan fydd sgriptiau'n cael eu ffurfweddu ar gam i alw ei gilydd. Er enghraifft, /etc/profile yn cyfeirio at ~/.bashrc.

Mae hyn fel arfer yn digwydd pan fydd rhywun yn ceisio trwsio rhywfaint o wall ac roedd yn ymddangos bod popeth yn gweithio. Yn anffodus, pan fydd angen i chi wahanu'r gwahanol fathau hyn o sesiynau, mae problemau newydd yn codi.

Llun Sandboxed Docker

Er mwyn arbrofi Γ’ rhedeg cragen, creais ddelwedd Docker y gellir ei defnyddio i ddadfygio rhedeg cragen mewn amgylchedd diogel.

Lansio:

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

Mae Dockerfile wedi'i leoli yma.

I orfodi mewngofnodi ac efelychu cragen mewngofnodi:

$ bash --login

I brofi set o newidynnau BASH_ENV:

$ env | grep BASH_ENV

Ar gyfer dadfygio crontab bydd sgript syml yn cael ei gweithredu bob munud (yn /root/ascript):

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

Ffynhonnell: hab.com

Ychwanegu sylw