Kryerja e Bash në detaje

Nëse e keni gjetur këtë faqe në kërkim, ndoshta po tentoni të zgjidhni ndonjë problem me hapjen e bash-it.

Mund të jetë se në mjedisin tuaj, bash nuk po vendos variablin e ambientit dhe nuk e kuptoni pse. Ndoshta keni ngulitur diçka në skedarët e ngarkesës së ndryshme të bash-it ose në profile, ose në të gjithë skedarët për ndonjë arsye derisa e keni bërë që të funksionojë.

Në çdo rast, kuptimi i kësaj shënimi është për të shpjeguar sa më thjeshtë procedurën e hapjes së bash-it, kështu që ju mund të përballeni me problemet.

Diagrami

Kjo bllok-shembuj përmbledh të gjitha proceset gjatë hapjes së bash-it.

Kryerja e Bash në detaje

Tani le të shqyrtojmë çdo pjesë në detaje.

Shell-i i hyrjes?

Së pari duhet të zgjidhni nëse ndodheni në një shell të hyrjes (login shell) apo jo.

Shell-i i hyrjes është shell-i i parë në të cilin hyni kur hyni në sistem për një seancë interaktive. Shell-i i hyrjes nuk kërkon hyrjen e emrit të përdoruesit dhe fjalëkalimit. Mund të detyroni hapjen e shell-it të hyrjes duke shtuar flamurin --login në thirrje bash, për shembull:

bash --login

Shell-i i hyrjes konfiguronte ambientin themelor në hapjen e parë të shell-it të bash-it.

Interaktive?

Pastaj përcaktoni nëse shell-i është interaktiv apo jo.

Kjo mund të kontrollohet nga prania e variablit PS1 (ajo vendos funksionin për futje të komandave):

if [ "${PS1-}" ]; then
  echo interactive
else
  echo non-interactive
fi

Ose të shihni nëse është vendosur parametri -i, me ndihmën e variablit special të defisit - në bash, për shembull:

$ echo $-

Nëse në rezultat ka një simbol i, atëherë shell-i është interaktiv.

NĂ« shell-in e hyrjes?

Nëse ndodheni në shell-in e hyrjes, bash kërkon skedarin /etc/profile dhe e hap nëse ekziston.

Më pas kërkon ndonjë nga këto tre skedarë në rendin e mëposhtëm:

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

Kur gjen një, e hap atë dhe i kalon të tjerët.

NĂ« shell-in interaktive?

Nëse jeni në një shell interaktive pa hyrje (non-login shell), supozohet se tashmë keni kaluar në shell-in e hyrjes, ambienti është konfiguruar dhe do të trashëgohet.

Në këtë rast, ekzekutohen në rendin e mëposhtëm këta dy skedarë, nëse ekzistojnë:

/etc/bash.bashrc
~/.bashrc

Asnjë variant?

Nëse nuk ndodheni as në shell-in e hyrjes, as në atë interaktive, atëherë ambienti juaj do të jetë vërtet bosh. Kjo shkakton konfuzion të madh (shih më poshtë rreth detyrave cron).

Në këtë rast, bash shikon për variablin BASH_ENV të mjedisit tuaj dhe krijon skedarin përkatës që është e përmendur atje.

Vështirësitë tipike dhe rregullat empirike

Detyrat cron

Në 95% të rasteve, debugging i ekzekutimit të bash është i lidhur me faktin se detyra cron nuk funksionon siç pritej.

Kjo detyrë e mallkuar funksionon siç duhet kur e ekzekutoj në komandën e linjës, por dështon kur ekzekutohet në crontab.

Këtu ka dy arsye:

  • Detyrat cron nuk janĂ« interaktive.
  • NĂ« krahasim me skriptet nĂ« komandĂ«n e linjĂ«s, detyrat cron nuk trashĂ«gojnĂ« mjedisin e shell-it.

Zakonesht nuk e vëreni ose nuk ju intereson se skripti i shell-it nuk është interaktiv, sepse mjedisi trashëgohet nga shell-i interaktiv. Kjo do të thotë se të gjitha për dhe alias janë të konfigurura ashtu siç e prisni.

Kjo është arsyeja pse shpesh duhet të vendosni një specifik për për detyrën cron, si këtu:

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

Skriptet që thirren njëra-tjetrën

Një tjetër problem i zakonshëm është kur skriptet gabimisht konfigurohen për të thirrur njëra-tjetrën. Për shembull, /etc/profile addresses ~/ .bashrc.

zakonisht ndodh kështu kur dikush përpiqet të rregullojë ndonjë gabim dhe duket sikur gjithçka funksionon. Fatkeqësisht, kur nevojiten të ndahet këto lloje të sesioneve, lindin probleme të reja.

Imazhi Docker në sandë

Për të eksperimentuar me ekzekutimin e shell-it, krijova një imazh Docker që mund të përdoret për debugging të ekzekutimit të shell-it në një mjedis të sigurt.

Fillimi:

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

Dockerfile ndodhet këtu.

Për t'u identifikuar me forcë dhe për të imituar shell-in e hyrjes:

$ bash --login

Për të kontrolluar setin e variablave BASH_ENV:

$ env | grep BASH_ENV

Për debugging crontab çdo minutë do të ekzekutojë një skript të thjeshtë (në /root/ascript):

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

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster