Dacă ați găsit această pagină în căutare, probabil încercați să rezolvați o problemă legată de pornirea bash.
Poate că în mediul dumneavoastră, bash nu setează variabila de mediu și nu înțelegeți de ce. Este posibil să fi introdus ceva în diferite fișiere de inițializare bash sau în profile, sau în toate fișierele la întâmplare, până când a funcționat.
În orice caz, scopul acestei note este de a prezenta cât mai simplu procedura de pornire a bash-ului, astfel încât să puteți rezolva problemele.
Diagrama
Această diagramă rezumă toate procesele la pornirea bash-ului.

Acum să examinăm mai în detaliu fiecare parte.
Shell de autentificare?
Mai întâi, trebuie să determinați dacă vă aflați într-o shell de autentificare sau nu.
Shell-ul de autentificare este prima shell în care intrați la autentificarea pentru o sesiune interactivă. Shell-ul de autentificare nu necesită introducerea numelui de utilizator și a parolei. Puteți forța pornirea unei shell de autentificare adăugând flag-ul --login la apelul bash, de exemplu:
bash --login
Shell-ul de autentificare configurează mediul de bază la prima pornire a shell-ului bash.
Interactiv?
Apoi, trebuie să determinați dacă shell-ul este interactiv sau nu.
Acest lucru poate fi verificat prin existența variabilei PS1 (aceasta setează funcția de introducere a comenzilor):
if [ "${PS1-}" ]; then
echo interactiv
else
echo non-interactiv
fi Sau verificați dacă este setat parametrul -i, folosind variabila specială a liniilor - în bash, de exemplu:
$ echo $-
Dacă în rezultat există simbolul i, atunci shell-ul este interactiv.
În shell-ul de autentificare?
Dacă vă aflați într-o shell de autentificare, bash va căuta fișierul /etc/profile și îl va executa, dacă există.
Apoi caută oricare dintre aceste trei fișiere în următoarea ordine:
~/.bash_profile ~/.bash_login ~/.profile
Când găsește unul, îl execută și trece peste celelalte.
În shell-ul interactiv?
Dacă vă aflați într-o shell interactivă fără autentificare (non-login shell), se presupune că ați fost deja într-o shell de autentificare, mediul este configurat și va fi moștenit.
În acest caz, următoarele două fișiere se execută în ordine, dacă există:
/etc/bash.bashrc ~/.bashrc
Nici o opțiune?
Dacă nu vă aflați nici într-o shell de autentificare, nici într-o shell interactivă, atunci mediul dumneavoastră va fi cu adevărat gol. Aceasta provoacă confuzie mare (vedeți mai jos despre sarcinile cron).
În acest caz, bash se uită la variabila BASH_ENV a mediului dumneavoastră și creează fișierul corespunzător specificat acolo.
Dificultăți comune și reguli empirice
Sarcini cron
În 95% din cazuri, depanarea lansării bash este legată de faptul că sarcina cron nu funcționează așa cum era de așteptat.
Această sarcină blestemată funcționează normal atunci când o lansăm din linia de comandă, dar eșuează când este lansată din crontab.
Aici două motive:
- Sarcinile cron nu sunt interactive.
- Spre deosebire de scripturile din linia de comandă, sarcinile cron nu moștenesc mediul shell-ului.
De obicei, nu observați sau nu vă pasă că scriptul shell-ului nu este interactiv, deoarece mediul este moștenit de shell-ul interactiv. Acest lucru înseamnă că toate PATH și alias sunt configurate așa cum vă așteptați.
De aceea, trebuie adesea să stabiliți un anumit PATH pentru sarcina cron, ca aici:
* * * * * PATH=${PATH}:\/path\/to\/my\/program\/folder myprogramScripturi care se apelează reciproc
O altă problemă frecventă este că scripturile sunt configurate greșit să se apeleze unele pe altele. De exemplu, /etc/profile se adresează ~/bashrc.
De obicei, se întâmplă așa când cineva a încercat să repare o eroare și părea că totul a funcționat. Din păcate, când trebuie să separați aceste tipuri diferite de sesiuni, apar probleme noi.
Imaginea Docker în sandbox
Pentru a experimenta cu lansarea shell-ului, am creat o imagine Docker care poate fi utilizată pentru a depana lansarea shell-ului într-un mediu sigur.
Pornire:
$ docker run -n bs -d imiell\/bash_startup
$ docker exec -ti bs bashDockerfile se află .
Pentru a forța autentificarea și a simula un shell de autentificare:
$ bash --login Pentru a verifica setul de variabile BASH_ENV:
$ env | grep BASH_ENV Pentru a depana crontab un script simplu va fi rulat la fiecare minut (în /root/ascript):
$ crontab -l
$ cat \/var\/log\/script.logSursa: habr.com
