it-swarm.dev

Proč ~ / .bash_profile není zdrojem při otevření terminálu?

Problém

Mám virtuální stroj Ubuntu 11.04 a chtěl jsem nastavit své vývojové prostředí Java).

  1. Sudo apt-get install openjdk-6-jdk
  2. Následující položky byly přidány do ~/.bash_profile

    export Java_HOME=/usr/lib/jvm/Java-6-openjdk
    
    export PATH=$PATH:$Java_HOME/bin
    
  3. Uložte změny a ukončete

  4. Otevřete terminál znovu a zadejte následující

    echo $Java_HOME   (blank)
    echo $PATH        (displayed, but not the Java_HOME value)
    
  5. Nic se nestalo, jako by export Java_HOME a jeho přidání do PATH nebyl nikdy proveden.

Řešení

Musel jsem jít do ~/.bashrc a přidat následující položku na konec souboru

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

Otázky

  1. Proč jsem to musel udělat? Myslel jsem, že bash_profile, bash_login nebo profil, pokud nejsou tito dva popraveni první před bashrc.
  2. Byl v tomto případě můj terminál non-login shell?
  3. Pokud ano, proč při provádění su za terminál a zadávání hesla nevykonával profil, kde jsem také nastavil výše uvedené exporty?
186
Viriato

~/.bash_profile je získáváno pouze bashem, když je spuštěno v režimu interaktivního přihlášení. To je obvykle pouze při přihlášení na konzoli (Ctrl+Alt+F1..F6) nebo připojení pomocí ssh.

Když se přihlásíte graficky, ~/.profile bude konkrétně získán skriptem, který spouští relaci gnome (nebo kterékoli desktopové prostředí, které používáte). Tak ~/.bash_profile není získán vůbec, když se přihlásíte graficky.

Když otevřete terminál, terminál spustí bash v interaktivním režimu (bez přihlášení), což znamená, že bude zdrojem ~/.bashrc.

Správné místo pro vložení těchto proměnných prostředí je v ~/.profile a účinek by se měl projevit při příštím přihlášení.

Získávání ~/.bash_profile z ~/.bashrc je špatné řešení. Měl by to být naopak; ~/.bash_profile by měl zdroj ~/.bashrc.

Podrobnější vysvětlení najdete v části DotFiles , včetně některé historie toho, jak to je.

(Na druhou stranu, když instalujete openjdk přes apt, symlinks by měl být nastaven balíčkem, takže opravdu nemusíte nastavovat Java_HOME nebo změňte PATH)

236
geirha

Můžete zkontrolovat, zda je váš Bash Shell spuštěn jako přihlašovací shell spuštěním:

shopt login_Shell

Pokud je odpověď off, nespouštíte přihlašovací prostředí.

Přečtěte si sekci vyvolání manuálu Bash o tom, jak Bash čte (nebo nečte) různé konfigurační soubory.

Výpis z man bash:

Když je bash vyvolán jako interaktivní přihlašovací prostředí, nebo jako neinteraktivní prostředí s --login možnost, nejprve přečte a provede příkazy ze souboru /etc/profile, pokud tento soubor existuje. Po přečtení tohoto souboru hledá ~/.bash_profile, ~/.bash_login, a ~/.profile v tomto pořadí a čte a provádí příkazy z prvního, který existuje a je čitelný.

su na druhé straně také nespustí přihlašovací prostředí Shell ve výchozím nastavení, musíte mu to sdělit pomocí --login možnost.

48
lgarzo

Myslím, že stojí za zmínku, že můžete změnit výchozí nastavení terminálu gnome tak, aby používal přihlašovací prostředí (tj. Bash -l) úpravou předvoleb profilu.

přejděte na Upravit -> Předvolby profilu -> karta Název a příkaz zaškrtněte možnost „Spustit příkaz jako přihlašovací prostředí“

30
kisoku

Pokud otevřete terminál nebo spustíte su, prostředí Shell nebude provedeno jako přihlašovací prostředí, ale jako normální interaktivní prostředí. Takže to čte ~/.bashrc ale ne ~/.bash_profile. Můžete spustit su s -l možnost, aby spustil Shell jako přihlašovací prostředí.

Když pracujete s grafickým uživatelským rozhraním, prostředí Shell se obvykle nikdy nespouští jako přihlašovací prostředí, takže je obvykle v pořádku dát všechny položky do ~/.bashrc.

16
Florian Diesch

TL; DR

V klasickém doporučeném nastavení Ubuntu ~/.bash_profile dostane hodnocení pouze ve zvláštních případech. A dává to smysl.

Vložte své věci do ~/.bashrc, bude to vyhodnoceno pokaždé.

Dobře, chci pochopit, proč to dává smysl?

Keypoints k pochopení toho, co se děje:

  • všechny procesy v Linuxu mají a používají proměnné prostředí
  • proměnné prostředí jsou zděděné
  • stačí je tedy nastavit jednou na otce celého vašeho procesu (zejména pokud to vyžaduje určitou dobu výpočtu).
  • otec celého vašeho procesu se obvykle spustí poté, co se do zařízení přihlásíte (uveďte přihlašovací údaje).
  • existují věci, které byste mohli chtít udělat jen jednou, když se přihlásíte do svého počítače (zkontrolujte například novou poštu ...).

Čas přihlášení je obvykle:

  • V konzolovém režimu, když se přihlásíte (s Ctrl-Alt F1) nebo přes ssh, protože Shell bude otcem všech procesů, načte vaše ~/.bash_profile.
  • V grafickém režimu, když otevřete relaci, první proces (gnome-session pro klasické ubuntu) bude odpovědný za čtení
    .profile.

Dobře, kam tedy mám dát své věci?

Je to docela složité, celý příběh je zde . Ale tady je běh, který je docela běžný pro uživatele Ubuntu. S ohledem na to:

  • používáte bash Shell,
  • máte ~/.bash_profile a podle doporučení přidejte zatížení ~/.bashrc ve vašem ~/.bash_profile tak, abychom získali alespoň jeden soubor, který bude vyhodnocen bez ohledu na to, jaký je vyvolávací mecanismus .

Toto je rychlý návrh, kam dát věci.

  • ~/.bashrc (dostane vyhodnoceno při všech příležitostech , pokud budete postupovat podle doporučení)

    Pro rychlé vyhodnocení proměnné prostředí a kód pro pouze pro uživatele a bash-only použití příkazového řádku (například aliasy). bashismus je vítán.

    Naloží se na sebe:

    • vytvořit nové okno/podokno Shell v grafických relacích.
    • volání bash
    • screen nový panel nebo karta. (ne tmux!)
    • libovolná bash instance v klientovi grafické konzole (terminator/gnome-terminal...) pokud nezaškrtnete možnost "spustit příkaz jako přihlašovací prostředí".

    A to se načte při všech ostatních příležitostech díky předchozímu doporučení.

  • ~/.bash_profile (Získává vyhodnoceno pouze v určité příležitosti )

    Pro pomalé vyhodnocení prostředí proměnné a kód pro pouze pro uživatele a procesy konzolové relace . bashismus je vítán. Načte se:

    • přihlášení konzoly (Ctrl-Alt F1),
    • ssh přihlášení k tomuto počítači,
    • tmux nový panel nebo okna (výchozí nastavení), (nikoli screen!)
    • explicitní volání bash -l,
    • libovolná bash instance v klientovi grafické konzole (terminator/gnome-terminal...) pouze pokud zaškrtnete volbu "spustit příkaz jako přihlašovací prostředí".
  • ~/.profile (Získává se pouze v grafické relaci)

    Pro pomalé vyhodnocování proměnné prostředí as no-bashism pro vaše pouze pro uživatele a všechny procesy grafické grafické relace. Načte se při přihlášení do grafického uživatelského rozhraní.

4
vaab

Když uděláte Sudo su Shell není proveden, místo toho zkuste s Sudo su - toto načte ~/.bash_profile ve výchozím nastavení jako zdroj.

0
Ilaiyaa...