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.

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 myprogramSkriptet 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 bashDockerfile ndodhet .
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.logBurimi: habr.com
