De ce nu ' funcționează în ~ / .bash_profile?

Eu „folosesc Linux Mint. shell-ul meu de conectare (cat /etc/passwd | grep myUserName) este bash.

După ce îmi pornesc mediul de lucru grafic și rulez un emulator de terminal de pe acesta, pot vedea că .bash_profile nu provine (variate de mediu care sunt export ed în el sunt nesetate). Dar dacă mă conectez de pe o consolă de text ( ctrl + alt + F1 ) sau rulez manual bash -l de la emulatorul terminalului, .bash_profile funcționează bine.

Mă înșel când cred că .bash_profile ar trebui să fie obținut atunci când X începe și toate export „ar trebui să fie disponibile în terminal, care rulează de la X?

PS Nu este o idee bună să plasați totul în .bashrc și să-l obțineți din .bash_profile ( https://stackoverflow.com/questions/902946/ ): lucrurile de mediu ar trebui să fie obținute doar o singură dată.

Răspuns

Fișierul ~/.bash_profile este citit de bash când este un shell de conectare. Asta veți obține când vă conectați în modul text.

Când vă conectați sub X, scripturile de pornire sunt executate de /bin/sh. Pe Ubuntu și Mint, /bin/sh este liniuță , nu bash. Linia și bash au ambele aceleași caracteristici de bază, dar linia se lipeste de aceste caracteristici de bază pentru a fi rapide și mici, în timp ce bash adaugă o mulțime de caracteristici la prețul necesitării mai multor resurse. Este obișnuit să folosiți liniuță pentru scripturi care nu au nevoie de caracteristici suplimentare și bash pentru utilizare interactivă (deși zsh are o mulțime de caracteristici mai frumoase ).

Majoritatea combinațiilor de afișare manager (programul în care tastați numele de utilizator și parola) și mediul desktop citiți ~/.profile din scripturile de conectare din /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsession sau oricare dintre acestea este aplicabil. Deci, puneți definițiile variabilelor de mediu în ~/.profile. Asigurați-vă că utilizați numai sintaxa acceptată de liniuță.

Deci, ce ar trebui să puneți unde?

  • Un bun .bash_profile încarcă .profile și încarcă .bashrc dacă shell-ul este interactiv.

    . ~/.profile if [[ $- == *i* ]]; then . ~/.bashrc; fi 
  • În .profile, puneți definiții ale variabilelor de mediu și alte setări ale sesiunii, cum ar fi ulimit.

  • În .bashrc, puneți setări interactive bash, cum ar fi pseudonimele, funcțiile, finalizarea, legarea tastelor (care nu sunt „t în .inputrc),…

Vezi și Diferența dintre Shell-ul de conectare și Shell-ul non-conectat? și Alternativă la .bashrc .

Comentarii

  • multe lucruri învățate dintr-un singur răspuns: )
  • chiar .profile nu ‘ nu funcționează în Debian 10 ” Buster „, numai .bashrc wor ks

Răspuns

.bash_profile este scriptul de configurare de pornire al bash. Nu există un standard care să oblige X la sursă .bash_profile.

La ceea ce vă gândiți este mai degrabă .profile. Inițial era fișierul de configurare de pornire al bourne shell (sh). Astăzi, multe distribuții au mediul desktop configurat la sursă .profile. Rețineți că acest lucru nu este, de asemenea, un standard, dar pare a fi o convenție.

Debian a folosit sursa .profile la autentificare grafică ( pagina wiki începând cu 2013 ) acum nu” t ( pagina wiki începând din 2016 ).

Arhivează surse .xprofile la autentificare grafică ( pagina wiki începând cu 2013 ).

Ubuntu obișnuia să descurajeze utilizarea .profile ( pagina wiki începând cu 2013 ) acum nu mai descurajează ( pagina wiki începând din 2016 ).


În ceea ce privește cealaltă întrebare: De ce nu funcționează profilul meu ~ / .bash_? Acesta este comportament așteptat.

Comportamentul, pe scurt, este după cum urmează:

  • bash a început ca un shell de conectare interactiv: citește ~/.profile
  • bash a început ca un shell interactiv non-login: citește ~/.bashrc

Pentru mai multe detalii consultați răspunsul meu la un simil o întrebare în askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc/132319#132319

Comentarii

  • Unele dintre acestea sunt corecte, dar„ citiți întotdeauna ~/.bashrc ”este un sfat rău: ar trebui să să citiți numai .bashrc dintr-un shell interactiv .’ ați ratat problema principală aici, care este că, atunci când vă conectați sub X, nu există nicio instanță de conectare a bash (în majoritatea combinațiilor de mediu de afișare / desktop, inclusiv evident AntonioK ‘ s).
  • Vă mulțumim pentru feedback. Sper că mi-am actualizat răspunsul suficient de bine pentru a rezolva reclamațiile dvs. În ceea ce privește sfaturile mele pentru ” citiți întotdeauna .bashrc „, am vrut să spun întotdeauna pentru un shell interactiv . Am clarificat acea parte. Sper să nu mai inducă în eroare.
  • Ubuntu descurajează în mod specific utilizarea .profile ( link ) ” Wiki a descurajat odată (absurd) acest lucru; că ‘ a fost remediat. (Notă /etc/profile rămâne descurajată pentru atribuțiile la nivel de sistem, de preferință pentru adăugarea de scripturi la /etc/profile.d.) Per-utilizator sunt prezentate acum ca una dintre modalitățile recomandate de a seta variabilele de mediu per utilizator: ” Fișierele adecvate pentru setările variabilelor de mediu care ar trebui să afecteze doar un anumit utilizator ( mai degrabă decât sistemul în ansamblu) sunt ~ / .pam_environment și ~ / .profile . ”
  • Pagina legată despre Debian specifică faptul că Debian nu citește ~/.profile pentru autentificare grafică și ~/.xsessionrc ar trebui să fie folosit în schimb.
  • Vă mulțumim că ați observat. pagina wiki a fost actualizată. Am legat versiunile așa cum erau la momentul răspunsului.

Răspuns

Câteva probleme apar atunci când încercând să reîncărcați / sursa ~ / .profile fișier. [Aceasta se referă la Ubuntu Linux – în unele cazuri detaliile comenzilor vor fi diferite]

  1. Rulați acest lucru direct în terminal sau într-un script?
  2. Cum se face rulați acest lucru într-un script?

Anunț. 1)

Rularea direct în terminal înseamnă că nu va fi creat subshell. Deci, puteți utiliza fie două comenzi:

source ~/.bash_profile 

sau

. ~/.bash_profile 

În ambele cazuri aceasta va actualiza mediul cu conținutul fișierului .profile.

Anunț 2) Puteți porni orice script bash fie apelând

sh myscript.sh 

sau

. myscript.sh 

În primul caz, se va crea un sub-shell care nu va afecta variabilele de mediu ale sistemul dvs. și vor fi vizibile numai pentru procesul de subshell. După finalizarea comenzii subshell, niciunul dintre exporturi etc. nu va fi aplicat. Aceasta este o greșeală comună și determină o mulțime de dezvoltatori să piardă mult timp.

Pentru ca modificările dvs. aplicate în script să aibă efect pentru mediul global, scriptul trebuie executat cu comanda

.myscript.sh 

.

Pentru a vă asigura că scriptul dvs. nu este rulat în un subshel puteți utiliza această funcție. (Din nou, exemplul este pentru shell-ul Ubuntu)

#/bin/bash preventSubshell(){ if [[ $_ != $0 ]] then echo "Script is being sourced" else echo "Script is a subshell - please run the script by invoking . script.sh command"; exit 1; fi } 

Sper că acest lucru va șterge unele dintre neînțelegerile comune! : D Noroc!

Răspuns

În întrebarea dvs., vă referiți la https://stackoverflow.com/questions/902946/ ca recomandare de a nu sursa, atunci când răspunsul acceptat prescrie către

  • Puneți setarea PATH într-un fișier .profile (deoarece uneori folosesc alte shell-uri)
  • Puneți aliasurile și funcțiile mele Bash în. fișier bashrc
  • Apoi utilizați acest [EDITAT: snip code-comments]:

    .bash_profile:

    #!/bin/bash # echo "Loading ${HOME}/.bash_profile" source ~/.profile # Get the paths source ~/.bashrc # get aliases 

Punând totul în .profile nu funcționează pentru mine pe Linux Mint. Utilizarea .bashrc a funcționat bine.

Răspuns

Soluția simplă este de a face terminal un terminal de conectare. Pentru terminalul Gnome aflat sub „Țiglă și comandă” din profilul implicit, puteți bifa caseta „Rulați comanda ca un shell de conectare”. Acest articol explică diferența dintre un shell de autentificare și unul care nu este.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *