Ja, ja esat šo lapu atradis meklēšanā, jūs, visticamāk, mēģināt atrisināt kādu problēmu saistībā ar bash palaišanu.
Iespējams, jūsu bash vidē netiek iestatīta vide, un jūs nesaprotat, kāpēc. Varbūt esat ielikuši kaut ko dažādos bash palaišanas failos vai profilos, vai arī visos failos uz dullo, līdz tas nostrādāja.
Jebkurā gadījumā šīs piezīmes mērķis ir pēc iespējas vienkāršāk izklāstīt bash palaišanas procedūru, lai jūs varētu tikt galā ar problēmām.
Diagramma
Šī blokshēma apkopo visus procesus, kas saistīti ar bash palaišanu.

Tagad sīkāk aplūkosim katru daļu.
Ielogošanās shell?
Vispirms jums jāpārbauda, vai atrodaties ieejas komandrindā (login shell) vai nē.
Ielogošanās shell ir pirmais shell, kurā nonākat, ieejot sistēmā interaktīvā sesijā. Ielogošanās shell neprasa lietotāja vārda un paroles ievadi. Jūs varat piespiest ieejas shell palaišanu, pievienojot flagu --login aicinājuma laikā, tādēļ visi bash, piemēram:
bash --login
Ielogošanās shell iestata pamata vidi, kad bash shell tiek palaists pirmo reizi.
Interaktīvs?
Pēc tam jūs nosakāt, vai shell ir interaktīvs vai nē.
To var pārbaudīt, nosakot, vai mainīgais PS1 (tas nosaka komandu ievades funkciju):
if [ "${PS1-}" ]; then
echo interaktīvs
else
echo neinteraktīvs
fi Vai arī pārbaudīt, vai ir iestatīts parametrs -i, izmantojot īpašu defisa mainīgo - bash, piemēram:
$ echo $-
Ja rezultātā ir simbols i, tad shell ir interaktīvs.
Ielogošanās shell?
Ja atrodaties ieejas shell, bash meklē failu /etc/profile un palaiž to, ja tas pastāv.
Tad tas meklē kādu no šiem trim failiem šādā secībā:
~/.bash_profile ~/.bash_login ~/.profile
Kad tas atrod vienu, tas to palaiž un izlaiž pārējos.
Interaktīvā shell?
Ja jūs atrodaties interaktīvā shell bez ieejas (non-login shell), tiek pieņemts, ka jūs jau esat bijuši ieejas shell, vide ir iestatīta un tiks mantota.
Šajā gadījumā pēc kārtas tiek izpildīti šie divi faili, ja tie pastāv:
/etc/bash.bashrc ~/.bashrc
Nekādas variants?
Ja jūs neatrodaties ne ieejas shell, ne interaktīvajā shell, tad jūsu vide patiešām būs tukša. Tas rada lielas neskaidrības (skat. zemāk par cron uzdevumiem).
Šajā gadījumā bash skatās uz mainīgo BASH_ENV jūsu vidē un izveido attiecīgo failu, kas tur norādīts.
Tipiskas grūtības un empīriskie noteikumi
Cron uzdevumi
Man bieži sastopos ar situāciju, kad bash palaišana ir saistīta ar to, ka cron uzdevums darbojas ne tā, kā gaidīts.
Šis nolādētais uzdevums strādā normāli, kad es to palaidu komandrindā, bet neizdodas crontab palaišanā..
Šeit Divi iemesli:
- Cron uzdevumi nav interaktīvi.
- Atšķirībā no skriptiem komandrindā, cron uzdevumi neiegūst shell vidi.
Parasti tu nepamana vai neinteresējas par to, ka shell skripts nav interaktīvs, jo vide tiek mantojusi no interaktīvā shell. Tas nozīmē, ka viss PATH un alias tiek iestatīts tā, kā gaidīts.
Tāpēc bieži ir jāpievieno konkrēts PATH cron uzdevumam, kā šeit:
* * * * * PATH=${PATH}:\/path\/to\/my\/program\/folder myprogramSkripti, kas izsauc viens otru
Vēl viena izplatīta problēma ir tāda, kad skripti kļūdaini tiek konfigurēti, lai izsauktu viens otru. Piemēram, /etc/profile piekļūst \~/.bashrc.
Parasti tas notiek, kad kāds centās koriģēt kādu kļūdu, un šķiet, ka viss strādā. Diemžēl, kad ir jānodala šie dažādās sesijas veidi, rodas jaunas problēmas.
Docker attēls smilšu kastē
Lai eksperimentētu ar shell palaišanu, es izveidoju Docker attēlu, ko var izmantot, lai bogotu shell palaišanu drošā vidē.
Palaišana:
$ docker run -n bs -d imiell\/bash_startup
$ docker exec -ti bs bashDockerfile atrodas .
Lai piespiestu pieteikšanos un imitētu pieteikšanās shell:
$ bash --login Lai pārbaudītu mainīgo kopu BASH_ENV:
$ env | grep BASH_ENV Lai debugētu crontab katru minūti darbosies vienkāršs skripts ( /root/ascript):
$ crontab -l
$ cat \/var\/log\/script.logAvots: habr.com
