Proč ' t můj ~ / .bash_profile nefunguje?

Používám Linux Mint. Moje přihlašovací prostředí (cat /etc/passwd | grep myUserName) je bash.

Poté, co spustím grafické grafické prostředí a spustím z něj emulátor terminálu, vidím, že .bash_profile není získáván (prostředí vars, které jsou export ed in it are unset). But if I log in from a text console ( ctrl + alt + F1 ) or manually run bash -l z emulátoru terminálu .bash_profile funguje dobře.

Mýlím se, když si myslím, že .bash_profile by měl být získán při spuštění X a všechny export „ed vars by měly být k dispozici v terminálu, běžící z X?

PS Umístit vše do .bashrc a získat to z .bash_profile není dobrý nápad ( https://stackoverflow.com/questions/902946/ ): obsah prostředí by měl být získán pouze jednou.

Odpovědět

Soubor ~/.bash_profile čte bash, pokud se jedná o přihlašovací shell. Toho získáte, když se přihlásíte v textovém režimu.

Když se přihlásíte pod X, spouštěcí skripty provede /bin/sh. V systémech Ubuntu a Mincovna, /bin/sh je dash , ne bash. Dash i bash mají stejné základní funkce, ale dash se drží tyto základní funkce, aby byly rychlé a malé, zatímco bash přidává mnoho funkcí za cenu vyžadování více zdrojů. Běžně se používá dash pro skripty, které nepotřebují další funkce a bash pro interaktivní použití (i když zsh má mnohem hezčí funkce ).

Většina kombinací zobrazení správce (program, do kterého zadáte své uživatelské jméno a heslo) a desktopové prostředí čte ~/.profile z přihlašovacích skriptů v /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsession nebo podle toho, co je použitelné. Definice proměnných prostředí tedy vložte do ~/.profile. Ujistěte se, že používáte pouze syntaxi, kterou podporuje pomlčka.

Takže co byste měli dát kam?

  • Dobrý .bash_profile načte .profile a načte .bashrc, pokud je shell interaktivní.

    . ~/.profile if [[ $- == *i* ]]; then . ~/.bashrc; fi 
  • Do .profile vložte definice proměnných prostředí a další nastavení relace, například ulimit.

  • V .bashrc vložte bash interaktivní nastavení, jako jsou aliasy, funkce, dokončení, vazby kláves (které nejsou .inputrc),…

Viz také Rozdíl mezi přihlašovacím a nepřihlašovacím prostředím? a Alternativa k .bashrc .

Komentáře

  • mnoho věcí naučených jedinou odpovědí: )
  • Ani .profile nefunguje ' v Debianu 10 " Buster ", pouze .bashrc wor ks

Odpověď

.bash_profile je spouštěcí konfigurační skript bash. Neexistuje žádný standardní příkaz X ke zdroji .bash_profile.

Na co myslíte, je spíše .profile. Původně to byl spouštěcí konfigurační soubor bourne shell (sh). Dnes má mnoho distribucí své desktopové prostředí nastaveno na source .profile. Všimněte si, že to také není standard, ale zdá se, že jde o konvenci.

Debian používal ke zdroji .profile při grafickém přihlášení ( wiki stránka od roku 2013 ) nyní nefunguje ( wiki stránka od roku 2016 ).

Archivní zdroje .xprofile při grafickém přihlášení ( wiki stránka od roku 2013 ).

Ubuntu odradil od používání .profile ( wiki stránky od roku 2013 ), už to neodradí ( wiki stránka od roku 2016 ).


Pokud jde o vaši další otázku: Proč můj ~ / .bash_profile nefunguje? To je očekávané chování.

Chování je ve zkratce následující:

  • bash začal jako interaktivní přihlašovací shell: čte ~/.profile
  • bash začal jako interaktivní bez přihlašovací prostředí: čte ~/.bashrc

Další podrobnosti naleznete v mé odpovědi na podobné ar otázka v askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc/132319#132319

Komentáře

  • Některé z nich jsou správné, ale„ vždy číst ~/.bashrc „je špatná rada: byste měli číst pouze .bashrc z interaktivního prostředí .Zde vám ' chyběl hlavní problém, který spočívá v tom, že při přihlašování pod X neexistuje žádná přihlašovací instance bash (ve většině kombinací prostředí správce displeje a plochy, včetně evidentně AntonioK ' s).
  • Děkujeme za zpětnou vazbu. Doufám, že jsem svou odpověď aktualizoval dostatečně dobře, abych vyřešil vaše stížnosti. Pokud jde o moji radu " vždy číst .bashrc ", myslel jsem vždy na interaktivní shell . Tuto část jsem objasnil. Doufám, že to již nebude zavádějící.
  • " Ubuntu konkrétně odrazuje od používání .profile ( odkaz ) " Wiki to jednou (absurdně) odradilo; že ' s byly opraveny. (Poznámka /etc/profile se nedoporučuje pro celosystémová přiřazení, raději přidávání skriptů k /etc/profile.d.) jsou nyní prezentovány jako jeden z doporučených způsobů nastavení proměnných prostředí pro uživatele: " Vhodné soubory pro nastavení proměnných prostředí, které by měly ovlivnit pouze konkrétního uživatele ( spíše než systém jako celek) jsou ~ / .pam_environment a ~ / .profile . "
  • Odkazovaná stránka o Debianu určuje, že Debian ne nečte ~/.profile pro grafické přihlášení a ~/.xsessionrc by měl být místo toho použito.
  • děkuji za pozornost. wiki stránka byla aktualizována. Připojil jsem se k verzím, jaké byly v době odpovědi.

Odpovědět

Nastane několik problémů, když pokouší se znovu načíst / source ~ / .profile soubor. [Týká se to Ubuntu linuxu – v některých případech se podrobnosti příkazů budou lišit]

  1. Spouštíte to přímo v terminálu nebo ve skriptu?
  2. Jak spustíte to ve skriptu?

Ad. 1)

Spuštění přímo v terminálu znamená, že nebude vytvořen žádný subshell. Můžete tedy použít buď dva příkazy:

source ~/.bash_profile 

nebo

. ~/.bash_profile 

V obou případech tím se prostředí aktualizuje o obsah souboru .profile.

Reklama 2) Jakýkoli bash skript můžete spustit voláním

sh myscript.sh 

nebo

. myscript.sh 

V prvním případě se vytvoří subshell, který nebude mít vliv na proměnné prostředí váš systém a budou viditelné pouze pro proces subshell. Po dokončení příkazu subshell nebude použit žádný z exportů atd. TOTO JE SPOLEČNÁ CHYBA A ZPŮSOBÍ SPOUSTU VÝVOJCŮ ZTRÁTU SPOUSTU ČASU.

Aby změny provedené ve vašem skriptu mohly mít účinek na v globálním prostředí musí být skript spuštěn pomocí příkazu

.myscript.sh 

.

Abyste se ujistili, že skript není spuštěn v subshel můžete použít tuto funkci. (Příklad je opět pro prostředí 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 } 

Doufám, že to odstraní některá běžná nedorozumění! : D Hodně štěstí!

Odpověď

Ve své otázce odkazujete na https://stackoverflow.com/questions/902946/ doporučující nepřijímat, když přijatá odpověď předepíše

  • Vložit mé nastavení PATH do souboru .profile (protože někdy používám jiné skořápky)
  • Vložit mé Bash aliasy a funkce do mého. soubor bashrc
  • Pak použijte tento [EDITOVÁNO: snip code-comments]:

    .bash_profile:

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

Uvedení všeho do .profile nefunguje pro mě na Linux Mint. Použití .bashrc fungovalo dobře.

Odpověď

Jednoduchým řešením je vytvořit terminál přihlašovací terminál. U terminálu Gnome pod položkou „Dlaždice a příkazy“ výchozího profilu můžete zaškrtnout políčko „Spustit příkaz jako přihlašovací shell“. Tento článek vysvětluje rozdíl mezi přihlašovacím shellem a jiným, který ním není.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *