Nëse e keni gjetur këtë faqe në kërkimin tuaj, ndoshta po përpiqeni të zgjidhni ndonjë problem me funksionimin e bash-it.
Mund të ndodhë që në ambientin tuaj, bash-i nuk po vendos një variabël mjedisor dhe nuk po kuptoni pse. Ndoshta keni futur diçka në skedarët e ndryshëm të ngarkimit të bash-it ose në profile, ose në të gjithë skedarët për të provuar deri sa të funksionojë.
Në çdo rast, qëllimi i këtij shënimi është t'ju paraqesë sa më thjesht procedurën për të drejtuar bash-in, për t'ju ndihmuar të zgjidhni problemet.
Diagrami
Ky diagram përmbledh të gjithë proceset gjatë lançimit të bash-it.

Tani do të shqyrtojmë çdo pjesë më në detaje.
Shell Daten?
Së pari, duhet të zgjidhni nëse ndodheni në një shell hyrës (login shell) apo jo.
Shell hyrës është shell-i fillestar ku hyni në sistem gjatë një seance interaktive. Shell-i hyrës nuk kërkon hyrjen e emrit të përdoruesit dhe fjalëkalimit. Mund ta detyroni lançimin e shell-it hyrës duke shtuar flamurin --login kur thërrisni bash, për shembull:
bash --login
Shell-i hyrës konfiguroni mjedisin fillestar gjatë lançimit të parë të bash-it.
Interaktiv?
Pastaj, keni për të përcaktuar nëse shell-i është interaktiv apo jo.
Kjo mund të kontrollohet nga prania e variablës PS1 (ajo vendos funksionin e inputit të komandave):
if [ "${PS1-}" ]; then
echo interaktiv
else
echo jo-interaktiv
fi Ose të shikoni nëse parametri është vendosur -i, me një variabël të veçantë të defishet - në bash, për shembull:
$ echo $-
Nëse në dalje ka karakterin i, atëherë shell-i është interaktiv.
NĂ« shell-in e hyrjes?
Nëse ndodhesh në shell-in e hyrjes, atëherë bash kërkon skedarin /etc/profile dhe e ekzekuton, nëse ekziston.
Pastaj kërkon cilin nga këto tre skedarë në rendin e mëposhtëm:
~/.bash_profile ~/.bash_login ~/.profile
Kur gjen një, e ekzekuton atë dhe kalon tek të tjerët.
NĂ« shell-in interaktiv?
Nëse je në një shell interaktive pa hyrje në sistem (non-login shell), supozohet që ke qenë tashmë në shell-in e hyrjes, ambienti është konfiguruar dhe do të trashëgohet.
Në këtë rast, ekzekutohen rregullisht këta dy skedarë, nëse ekzistojnë:
/etc/bash.bashrc ~/.bashrc
Asnjë opsion?
Nëse nuk je as në një shell hyrjeje, as në një shell interaktive, atëherë ambienti yt në të vërtetë do të jetë bosh. Kjo ndikon në krijimin e konfuzionit të madh (shih më poshtë për detyrat cron).
Në këtë rast, bash shikon në variablin BASH_ENV të ambientit tënd dhe krijon skedarin përkatës që është specifikuar atje.
Vështirësitë tipike dhe rregullat empirike
Detyrat cron
Në 95% të rasteve, debugimi i ekzekutimit të bash është i lidhur me faktin se detyra cron nuk funksionon siç pritej.
Kjo detyrë e mallkuar funksionon normalisht kur e ekzekutoj në komandën e linjës, por dështim në ekzekutimin në crontab.
Këtu dy arsye:
- Detyrat cron nuk janë interaktive.
- Ndryshe nga skriptet në komandën e linjës, detyrat cron nuk trashëgojnë ambientin e molluskit.
Zakonisht nuk e vëreni ose nuk ju intereson që skripti i molluskit nuk është interaktiv, sepse ambienti trashëgohet nga mollusku interaktiv. Kjo do të thotë se të gjitha PATH dhe alias janë konfiguruar siç e prisni.
Kjo është arsyeja pse shpesh duhet të vendosni një PATH për detyrën cron, si këtu:
* * * * * PATH=${PATH}:/path/to/my/program/folder myprogramSkripte që thërrasin njëri-tjetrin
Një tjetër problem i zakonshëm ndodh kur skriptet gabimisht janë të konfiguruara për të thirrur njëri-tjetrin. Për shembull, /etc/profile i drejtohet ~/.bashrc.
Zakonisht ndodh kështu kur dikush ka provuar të rregullonte një gabim dhe duket se gjithçka punon. Fatkeqësisht, kur duhet të ndahen këto lloje të seancave, lindin probleme të reja.
Imazhi Docker në sandbox
Për të eksperimentuar me nisjen e shell-it, krijova një imazh Docker që mund të përdoret për debugin e nisjes së shell-it në një mjedis të sigurt.
Nisja:
$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bashDockerfile ndodhet .
Për një login të detyrueshëm dhe imitim të shell-it të hyrjes:
$ bash --login Për të kontrolluar grupin e variablave BASH_ENV:
$ env | grep BASH_ENV Për debugin crontab çdo minutë do të ekzekutohet një skript i thjeshtë (në /root/ascript):
$ crontab -l
$ cat /var/log/script.logBurimi: habr.com
