Vraag Waarom ~ / .bash_profile niet wordt gevonden bij het openen van een terminal?


Probleem

Ik heb een Ubuntu 11.04 Virtual Machine en ik wilde mijn Java-ontwikkelomgeving opzetten. Ik deed het als volgt

  1. sudo apt-get install openjdk-6-jdk
  2. De volgende items zijn toegevoegd aan ~ / .bash_profile

    export JAVA_HOME=/usr/lib/jvm/java-6-openjdk
    
    export PATH=$PATH:$JAVA_HOME/bin
    
  3. Sla de wijzigingen op en sluit af

  4. Open opnieuw een terminal en typ het volgende

    echo $JAVA_HOME   (blank)
    echo $PATH        (displayed, but not the JAVA_HOME value)
    
  5. Er gebeurde niets, alsof de export van JAVA_HOME en de toevoeging aan het PATH nooit was voltooid.

Oplossing

Ik moest gaan ~ / .bashrc en voeg de volgende vermelding toe aan het einde van het bestand

#Source bash_profile to set JAVA_HOME and add it to the PATH because for some reason is not being picked up
. ~/.bash_profile

vragen

  1. Waarom moest ik dat doen? Ik dacht dat bash_profile, bash_login of profiel in afwezigheid van die twee als eerste voor bashrc worden uitgevoerd.
  2. Was in dit geval mijn terminal a non-login shell?
  3. Zo ja, waarom deed ik bij het doen van su na de terminal en het plaatsen van het wachtwoord geen profiel waarbij ik ook de hierboven genoemde export had ingesteld?

138
2018-04-11 16:27


oorsprong


Leuke oplossing. Ik heb net mijn probleem opgelost! - Atlas7


antwoorden:


~/.bash_profile wordt alleen door bash ingekocht bij het opstarten in de interactieve aanmeldingsmodus. Dat is meestal alleen als u inlogt op de console (Ctrl+alt+F1..F6), of verbinden via ssh.

Wanneer u zich grafisch aanmeldt, ~/.profile zal specifiek afkomstig zijn van het script dat de gnome-sessie start (of welke desktopomgeving je ook gebruikt). Zo ~/.bash_profile wordt helemaal niet gebruikt als u zich grafisch aanmeldt.

Wanneer u een terminal opent, start de terminal met bash in (niet-login) interactieve modus, wat betekent dat deze bron zal zijn ~/.bashrc.

De juiste plaats voor jou om deze omgevingsvariabelen in te zetten is binnen ~/.profile, en het effect zou de volgende keer dat je inlogt duidelijk moeten zijn.

Sourcing ~/.bash_profile van ~/.bashrc is de verkeerde oplossing. Het hoort andersom te zijn; ~/.bash_profile moet bron ~/.bashrc.

Zien dotfiles voor een meer grondige uitleg, inclusief een geschiedenis van waarom het is zoals het is.

(Even terzijde, bij het installeren van openjdk via apt moeten door het pakket symlinks worden ingesteld, zodat u niet echt hoeft in te stellen JAVA_HOME of veranderen PATH)


183
2018-04-11 16:41



Ik heb gemerkt dat bij het openen van een Terminal vanuit de zijbalk in Ubuntu 12 het bestand ~ / .profile niet is geladen. - jcollum
@jcollum Dat is goed. .profile mag alleen worden aangekocht als je inlogt. - geirha
oh, het openen van een terminal is niet hetzelfde als inloggen ... Ik zat te denken om in te loggen naar de terminal. - jcollum
Ik weet het, daarom heb ik mijn aanvullende code daar toegevoegd. Wat ik wilde doen was om opties voor de terminal te configureren (bijvoorbeeld de prompt), maar deze werden niet geladen als ik ze instelde .profile, zelfs na een volledige herstart. - Juan A. Navarro
@terdon, ja, maar bash is niet betrokken bij het grafisch inloggen, dus het gaat rechtdoor .profile. - geirha


U kunt controleren of uw Bash-shell is gestart als login-shell door het uitvoeren van:

shopt login_shell

Als het antwoord is off je hebt geen login-shell.

Lees de Bash-handleiding aanroeping sectie over hoe Bash verschillende configuratiebestanden leest (of niet leest).

Fragment uit man bash:

Wanneer bash wordt aangeroepen als een interactieve login-shell, of als een   niet-interactieve shell met de --login  optie, leest het eerst   en voert opdrachten uit het bestand uit /etc/profile, als dat bestand   bestaat. Na het lezen van dat bestand, zoekt het ernaar ~/.bash_profile,    ~/.bash_login, en ~/.profile, in die volgorde, en leest en   voert opdrachten uit vanaf de eerste die bestaat en leesbaar is.

su aan de andere kant start ook niet standaard een inlogshell, je moet dit aangeven door het te gebruiken --login keuze.


40
2018-04-11 16:59



Heel erg bedankt voor de shotp login_shell opdracht. Geweldig!! - Viriato
Graag gedaan! Btw. in ruil daarvoor heb ik veel geleerd van skimming door de Bash man-pagina terwijl je op zoek bent naar je antwoord. :) - lgarzo


Ik denk dat het de moeite van het vermelden waard is dat je de standaard van gnome-terminal kunt wijzigen om een ​​inlogshell te gebruiken (bijv. Bash -l) door de profielvoorkeuren te bewerken.

ga naar Bewerken -> Profielvoorkeuren -> tabblad Titel en opdracht vink de opdracht "Uitvoeren als inlogschaal" aan


22
2018-06-22 00:23



Eenvoudige suggestie om het probleem op te lossen. Precies wat ik zocht, bedankt. - Jose Torres
Wat zijn de nadelen aan het inschakelen van deze instelling? - chrish
@chris je laadt code gewoon een beetje meer code in dan noodzakelijk bij veel gelegenheden. Het maakt waarschijnlijk niet uit of jouw ~/.bash_profile evalueert heel snel, wat waarschijnlijk het geval is. Een goed ding om te controleren is om oproepen uit te voeren naar andere processen die meestal behoorlijk duur zijn. - vaab


Als u een terminal opent of uitvoert su de shell wordt niet uitgevoerd als inlogshell maar als een normale interactieve shell. Dus het leest ~/.bashrc maar niet ~/.bash_profile. Je kan lopen su met de -l optie om ervoor te zorgen dat uw shell als inlogshell wordt uitgevoerd.

Als je met een grafische gebruikersinterface werkt, wordt de shell meestal nooit als login-shell uitgevoerd, dus het is meestal goed om alle dingen in de shell te plaatsen. ~/.bashrc.


13
2018-04-11 16:43



Dat is wat ik had gedaan en het werkte, maar kijk wat de man in de bodem zegt, hij suggereert dat het een slecht idee is om het in bashrc te plaatsen en in plaats daarvan op het profiel te zetten. ... Heej beide manieren werken, heel erg bedankt. - Viriato


TL; DR

In de klassieke aanbevolen ubuntu-setup, ~/.bash_profile wordt alleen bij specifieke gelegenheden geëvalueerd. En het is logisch.

Doe je spullen erin ~/.bashrc, het wordt elke keer geëvalueerd.

Ok, ik wil begrijpen, waarom is dit logisch?

Keypoints om te begrijpen wat er aan de hand is:

  • alle processen op linux hebben en maakt gebruik van de omgeving variabelen
  • omgevingsvariabelen zijn geërfd
  • dus ze instellen eenmaal op de vader van al uw proces is genoeg (vooral als het enige rekentijd vereist.)
  • de vader van al uw processen wordt meestal na u gelanceerd Log in op uw apparaat (geef uw inloggegevens op).
  • er zijn dingen die je misschien maar één keer wilt doen als je inlogt uw computer (controleer bijvoorbeeld op nieuwe e-mail ...).

De tijd voor aanmelden is dus meestal:

  • In consolemodus, wanneer u inlogt (met Ctrl-Alt F1) of via ssh, omdat de schaal de vader van alle processen zal zijn, zal hij je laden ~/.bash_profile.
  • In de grafische modus, wanneer u uw sessie opent, het eerste proces (gnome-session voor klassieke ubuntu) zal de leiding hebben om te lezen
    .profile.

Oké, waar zet ik mijn spullen in?

Het is nogal ingewikkeld, de het volledige verhaal is hier. Maar hier is een run down dat is vrij gebruikelijk voor ubuntu-gebruikers. Dus gezien het feit dat:

  • je gebruikt bash shell,
  • je hebt een ~/.bash_profile en volg de aanbeveling toevoegen het laden van ~/.bashrc in uw ~/.bash_profile om zo te krijgen minstens één bestand dat wordt geëvalueerd, ongeacht de aanroeping mecanism.

Dit is een snelle suggestie van waar dingen te plaatsen.

  • ~ / .bashrc  (Gets geëvalueerd in alle gelegenheden, op voorwaarde dat u de aanbeveling opvolgt)

    Voor fast-evaluatie omgevingsvariabele en code voor uw user-only en bash-only gebruik van de commandoregel (aliassen voor aanleg). bashism zijn welkom.

    Het wordt geladen op zichzelf op:

    • maak een nieuw shell-venster / -ruit in grafische sessies.
    • roeping bash
    • screen nieuw paneel of tabblad. (niet tmux !)
    • elke bash-instantie in een grafische consoleclient (terminator/gnome-terminal...) als jij niet aanvinken  optie "voer opdracht in als login shell".

    En het zal bij alle andere gelegenheden worden geladen dankzij de voorafgaande aanbeveling.

  • ~ / .bash_profile  (Gets geëvalueerd alleen bij specifieke gelegenheid)

    Voor slow-evaluatie omgevingsvariabele en code voor uw user-only en console-sessie processen. bashism zijn welkom. Het wordt geladen op:

    • console login (Ctrl-Alt F1),
    • ssh logins naar deze machine,
    • tmux nieuw venster of vensters (standaardinstellingen), (niet screen !)
    • expliciete oproepen van bash -l,
    • elke bash-instantie in een grafische consoleclient (terminator/gnome-terminal...) alleen als jij tikt optie "voer opdracht in als login shell".
  • ~ / .profile  (Krijg alleen geëvalueerd in grafische sessie)

    Voor slow-evaluatie omgevingsvariabelen en met no-bashism Voor jouw user-only en alles grafische-sessie processen. Het krijgt geladen bij inloggen in uw grafische gebruikersinterface.


1
2018-03-08 03:58



Als bash een profielbestand laadt, wordt het geladen .profile als .bash_profile bestaat niet. - muru