Care este diferența dintre .bashrc și .profile pe Linux?

Publicat: 2022-09-29
Laptop Linux afișează un prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Conectarea la o mașină Linux care rulează Bash face ca anumite fișiere să fie citite. Acestea vă configurează mediul shell. Dar ce fișiere sunt citite și când pot fi confuze. Iată ce se întâmplă cu adevărat.

Diferite tipuri de Shell

Mediul pe care îl obțineți când lansați un shell este definit de setările păstrate în fișierele de configurare sau de profil . Acestea dețin informații care stabilesc lucruri precum culorile textului, promptul de comandă, aliasurile și calea căutată pentru fișierele executabile atunci când introduceți numele unui program.

Există un număr de fișiere diferite, în diferite locații din sistemul de fișiere, unde sunt stocate aceste setări. Dar înainte de a începe să vedem ce fișiere sunt citite atunci când lansați un shell, trebuie să fim clari cu privire la tipul de shell pe care îl utilizați.

Ce se întâmplă exact când porniți computerul?
LEGATE Ce se întâmplă exact când porniți computerul?

Un shell de autentificare este un shell la care vă conectați. Când porniți computerul și vă conectați, sub mediul desktop grafic există un shell de conectare. Dacă vă conectați la un alt computer printr-o conexiune SSH, vă veți conecta și la un shell de conectare.

Tipul de shell pe care îl obțineți când deschideți o fereastră de terminal este un shell non-login. Nu trebuie să vă autentificați pentru a lansa un shell atunci când sunteți deja autentificat. Shell-urile de autentificare și non-login sunt shell-uri interactive. Le folosești tastând instrucțiuni, apăsând tasta „Enter” și citind răspunsurile de pe ecran.

Există, de asemenea, shell-uri non-interactive. Acestea sunt tipurile de shell care se lansează atunci când se execută un script. Scriptul este lansat într-un nou shell. Shebang #!/bin/bash din partea de sus a scriptului dictează ce shell trebuie utilizat.

 #!/bin/bash

echo -e „Bună, lume!\n”

Acest script va fi rulat într-un shell Bash neinteractiv. Rețineți că, deși shell-ul nu este interactiv, scriptul în sine poate fi. Acest script se imprimă în fereastra terminalului și ar putea la fel de ușor să accepte intrarea utilizatorului.

LEGATE: 9 exemple de script Bash pentru a începe pe Linux

Shell-uri non-interactive

Shell-urile non-interactive nu citesc niciun fișier de profil atunci când se lansează. Ei moștenesc variabile de mediu, dar nu vor ști nimic despre aliasuri, de exemplu, dacă sunt definite pe linia de comandă sau într-un fișier de configurare.

Puteți testa dacă un shell este interactiv sau nu, uitându-vă la opțiunile care i-au fost transmise ca parametri de linie de comandă. Dacă există un „i” în opțiuni, shell-ul este interactiv. Parametrul special Bash $- conține parametrii liniei de comandă pentru shell-ul curent.

 [[ $- == *i* ]] && echo 'Interactiv' || ecou „Non-interactiv” 

Test Bash pentru a identifica sesiunile shell interactive și non-interactive

Să creăm un alias numit xc care va însemna „pisica”. De asemenea, vom verifica dacă avem o $PATH setată.

 alias xc=cat
 echo $PATH 

Setarea unui alias și ecou valoarea lui $PATH

Vom încerca să le accesăm pe ambele din interiorul acestui mic script. Copiați acest script într-un editor și salvați-l ca „int.sh”.

 #!/bin/bash

xc ~/text.dat
echo "Variable=$PATH"

Va trebui să folosim chmod pentru a face scriptul executabil.

 chmod +x int.sh 

Folosind chmod pentru a face un script executabil

Să rulăm scriptul nostru:

 ./int.sh 

Rularea unui script care nu poate accesa un alias, dar poate accesa variabilele de mediu moștenite

În shell-ul său non-interactiv, scriptul nostru nu poate folosi aliasul, dar poate folosi variabila de mediu. Shell-urile interactive sunt mai interesante în utilizarea fișierelor de profil și de configurare.

LEGATE: Cum să setați variabilele de mediu în Bash pe Linux

Shell-uri de conectare interactive

Există două tipuri de shell-uri de conectare interactive. Unul este shell-ul care vă permite să vă conectați la computer. Pe desktop-uri, acesta este de obicei shell-ul care stă la baza mediului desktop. Indiferent dacă utilizați un mediu desktop cu ferestre sau cu tiling, ceva trebuie să vă autentifice cu sistemul Linux și să vă permită să vă conectați.

Pe serverele fără un mediu desktop instalat, vă conectați direct într-un shell interactiv. Puteți face același lucru pe un computer desktop dacă renunțați la mediul desktop și accesați un terminal. Pe GNOME puteți face acest lucru cu combinația de taste Ctrl+Alt+F3. Pentru a reveni la sesiunea GNOME, apăsați combinația de taste Ctrl+Alt+F2. Shell-ul la care vă conectați printr-un SSH este și un shell de conectare.

Fișierele de profil și de configurare care sunt apelate pot fi setate folosind variabile de mediu, astfel încât acestea pot varia de la distribuție la distribuție. În plus, nu toate fișierele sunt folosite de fiecare distribuție. Într-o instalare Bash generică, shell-urile de conectare interactive citesc fișierul „/etc/profile”. Acesta deține opțiunile de configurare a shell-ului la nivelul întregului sistem. Dacă există, acest fișier citește și fișiere precum „/etc/bash.bashrc” și „/usr/share/bash-completion/bash_completion”.

Bash caută apoi un fișier „~/.bash_profile”. Dacă nu există, Bash caută un fișier „~/.bash_login”. Dacă acel fișier nu există, Bash încearcă să găsească un fișier „.profile”. Odată ce unul dintre aceste fișiere este găsit și citit, Bash oprește căutarea. Deci, în majoritatea cazurilor, „~/.profile” este puțin probabil să fie citit.

Adesea, veți găsi așa ceva în „~/.bash_profile” sau, ca un fel de protecție, în fișierul „~/.profile”:

 # dacă rulează bash
dacă [ -n „$BASH_VERSION” ]; apoi
  # includeți .bashrc dacă există
  if [ -f "$HOME/.bashrc" ]; apoi
    . „$HOME/.bashrc”
  fi
fi

Aceasta verifică dacă shell-ul activ este Bash. Dacă este, caută un fișier „~/.bashrc” și îl citește dacă este găsit.

Shell interactive non-login

Un shell interactiv Bash non-login citește „/etc/bash.bashrc” și apoi citește fișierul „~/.bashrc”. Acest lucru permite lui Bash să aibă setări la nivel de sistem și specifice utilizatorului.

Acest comportament poate fi schimbat cu steaguri de compilare atunci când Bash este compilat, dar ar fi o circumstanță rară și particulară să întâlniți o versiune de Bash care nu generează și nu citește fișierul „/etc/bash.bashrc”.

De fiecare dată când deschideți o fereastră de terminal pe desktop, aceste două fișiere sunt folosite pentru a configura mediul acelui shell interactiv, non-login. Același lucru se întâmplă și pentru shell-urile lansate de aplicații, cum ar fi fereastra terminalului din Geany IDE.

Unde ar trebui să puneți codul de configurare?

Cel mai bun loc pentru a pune codul personal de personalizare este în fișierul „~/.bashrc”. Aliasurile și funcțiile shell-ului dvs. pot fi definite în „~/.bashrc”, iar acestea vor fi citite și disponibile pentru dvs. în toate shell-urile interactive.

Dacă distribuția dvs. nu vă citește „~/.bashrc” în shell-urile de conectare și doriți, adăugați acest cod în fișierul „~/.bash_profile”.

 # dacă rulează bash
dacă [ -n „$BASH_VERSION” ]; apoi
  # includeți .bashrc dacă există
  if [ -f "$HOME/.bashrc" ]; apoi
    . „$HOME/.bashrc”
  fi
fi

Modularitatea este cea mai bună

Dacă aveți o mulțime de aliasuri sau doriți să utilizați aceleași aliasuri pe mai multe mașini, cel mai bine este să le stocați în propriul fișier și la fel și cu funcțiile shell. Puteți apela acele fișiere din fișierul dvs. „~/.bashrc”.

Pe computerul nostru de testare, aliasurile sunt stocate într-un fișier numit „.bash_aliases” și un fișier numit „.bash_functions” deține funcțiile shell.

Le puteți citi din fișierul „~/.bashrc” astfel:

 # citește în pseudonimele mele
if [ -f ~/.bash_aliases ]; apoi
  . ~/.bash_aliases
fi

# citește în funcțiile mele shell
if [ -f ~/.bash_functions ]; apoi
  . ~/.bash_functions
fi 
Cum se creează aliasuri și funcții Shell pe Linux
LEGATE Cum se creează aliasuri și funcții Shell pe Linux

Acest lucru vă permite să mutați cu ușurință aliasurile și funcțiile între computere. Trebuie doar să adăugați liniile de mai sus în fișierul „~/.bashrc” de pe fiecare computer și să copiați fișierele care conțin aliasurile și funcțiile shell în directorul dvs. de acasă de pe fiecare computer.

Înseamnă că nu trebuie să copiați toate definițiile din „~/.bashrc” de pe un computer în fișierele „~/.bashrc” de pe fiecare dintre celelalte computere. De asemenea, este mai bine decât copierea întregului fișier „~/.bashrc” între computere, mai ales dacă rulează Bash pe diferite distribuții.

În concluzie

Fișierele despre care trebuie să știți sunt:

  • /etc/profile : setări de configurare la nivel de sistem. Folosit de shell-urile de conectare.
  • ~/.bash_profile : Folosit pentru a păstra setările pentru utilizatori individuali. Folosit de shell-urile de conectare.
  • ~/.bashrc : Folosit pentru a păstra setările pentru utilizatori individuali. Folosit de shell-uri interactive non-login. Poate fi apelat și din fișierul „~/.bash_profile” sau „~/.profile” pentru shell-urile de conectare.

O metodă convenabilă este să vă puneți setările personale în „~/.bashrc” și să vă asigurați că fișierul „~./bash_profile” vă numește fișierul „~/.bashrc”. Asta înseamnă că setările tale personale sunt păstrate într-un singur fișier. Veți obține un mediu shell coerent între shell-uri de conectare și non-login. Combinarea acestui lucru cu stocarea aliasurilor și a funcțiilor shell în fișiere non-sistem este o soluție îngrijită și robustă.