Varför fungerar inte ' min ~ / .bash_profile?

Jag använder Linux Mint. Mitt inloggningsskal (cat /etc/passwd | grep myUserName) är bash.

Efter att jag startat min grafiska skrivbordsmiljö och kör en terminalemulator från den kan jag se att .bash_profile inte kommer från (miljö vars som export ed i den är avstängd). Men om jag loggar in från en textkonsol ( ctrl + alt + F1 ) eller kör manuellt bash -l från terminalemulatorn, .bash_profile fungerar bra.

Har jag fel när jag tycker att .bash_profile bör hämtas när X startar och alla export ”ed vars bör vara tillgängliga i terminalen, körs från X?

PS Att placera allt i .bashrc och hämta det från .bash_profile är ingen bra idé ( https://stackoverflow.com/questions/902946/ ): miljösaker bör endast hämtas en gång.

Svar

Filen ~/.bash_profile läses av bash när det är ett inloggningsskal. Det är vad du får när du loggar in i textläge.

När du loggar in under X körs startskripten av /bin/sh. På Ubuntu och Mint, /bin/sh är bindestreck , inte bash. Dash och bash har båda samma kärnfunktioner, men dash stickar till dessa kärnfunktioner för att vara snabba och små medan bash lägger till många funktioner till kostnaden för att kräva mer resurser. Det är vanligt att använda bindestreck för skript som inte behöver extra funktioner och bash för interaktiv användning (men zsh har många trevligare funktioner ).

De flesta kombinationer av display manager (programmet där du skriver ditt användarnamn och lösenord) och skrivbordsmiljön läser ~/.profile från inloggningsskript i /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsession eller det som är tillämpligt. Så sätt dina definitioner av miljövariabler i ~/.profile. Se till att endast använda syntax som streck stöder.

Så vad ska du placera var?

  • En bra .bash_profile laddar .profile och laddar .bashrc om skalet är interaktivt.

    . ~/.profile if [[ $- == *i* ]]; then . ~/.bashrc; fi 
  • I .profile anger du definitioner för miljövariabler och andra sessionsinställningar som ulimit.

  • I .bashrc, lägg bash interaktiva inställningar som alias, funktioner, komplettering, tangentbindningar (som inte är t i .inputrc),…

Se även Skillnad mellan inloggningsskal och icke-inloggningsskal? och Alternativ till .bashrc .

Kommentarer

  • många saker lärt sig av ett enda svar: )
  • även .profil fungerar inte ' t i Debian 10 " Buster ", bara .bashrc wor ks

Svar

.bash_profile är startkonfigurationsskriptet för våldsamt slag. Det finns ingen standard som kräver X att källa .bash_profile.

Det du tänker på är snarare .profile. Ursprungligen var det startkonfigurationsfilen för bourne shell (sh). I dag har många distributioner skrivbordsmiljön inställd på källan .profile. Observera att detta inte heller är en standard men det verkar vara en konvention.

Debian brukade källa till .profile vid grafisk inloggning ( wiki-sida från och med 2013 ) nu gör det inte ( wiki-sida från och med 2016 ).

Bågkällor .xprofile vid grafisk inloggning ( wikisida från och med 2013 ).

Ubuntu brukade avskräcka med .profile ( wiki-sida från och med 2013 ) nu avskräcker det inte längre ( wiki-sida från och med 2016 ).


När det gäller din andra fråga: Varför fungerar inte mitt ~ / .bash_profile? Det är förväntat beteende.

Beteendet, kort sagt, är som följer:

  • bash började som ett interaktivt inloggningsskal: läser ~/.profile
  • bash började som ett interaktivt skal utan inloggning: läser ~/.bashrc

För mer information se mitt svar på en simil ar fråga i askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc/132319#132319

Kommentarer

  • En del av detta är korrekt, men” läs alltid ~/.bashrc ”är dåligt råd: du bör bara läsa .bashrc från ett interaktivt skal .Du ' har missat kärnproblemet här, det är att när du loggar in under X finns det ingen inloggningsinstans av bash (under de flesta kombinationer av displayhanterare / skrivbordsmiljöer, inklusive tydligen AntonioK ' s).
  • Tack för din feedback. Jag hoppas att jag uppdaterade mitt svar tillräckligt bra för att lösa dina klagomål. När det gäller mitt råd till " läs alltid .bashrc ", menade jag alltid för ett interaktivt skal . Jag har klargjort den delen. Jag hoppas att det inte är vilseledande längre.
  • " Ubuntu avråder specifikt från .profile ( länk ) " Wiki avskräckt en gång (absurt) det; att ' har fixats. (Obs! /etc/profile förblir avskräckt för systemomfattande tilldelningar, framför att lägga till skript till /etc/profile.d.) Per användare .profile -filer presenteras nu som ett av de rekommenderade sätten att ställa in miljövariabler per användare: " Lämpliga filer för miljövariabelinställningar som bara ska påverka en viss användare ( snarare än systemet som helhet) är ~ / .pam_environment och ~ / .profile . "
  • Den länkade sidan om Debian anger att Debian inte läser ~/.profile för grafisk inloggning och ~/.xsessionrc används istället.
  • tack för att du märkte det. wiki-sidan uppdaterades. Jag länkade till versionerna som de var vid svarstidpunkten.

Svar

Ett par frågor uppstår när försöker ladda om / källa ~ / .profilfil. [Detta hänvisar till Ubuntu Linux – i vissa fall kommer kommandodetaljerna att vara olika]

  1. Kör du detta direkt i terminalen eller i ett skript?
  2. Hur kör du detta i ett skript?

Annons. 1)

Att köra detta direkt i terminalen innebär att det inte skapas något subshell. Så du kan använda antingen två kommandon:

source ~/.bash_profile 

eller

. ~/.bash_profile 

I båda fallen detta kommer att uppdatera miljön med innehållet i .profile-filen.

Annons 2) Du kan starta valfritt bash-skript antingen genom att ringa

sh myscript.sh 

eller

. myscript.sh 

I det första fallet kommer detta att skapa en subshell som inte påverkar miljövariablerna för ditt system och de är bara synliga för subshell-processen. Efter avslutad subshell-kommando kommer ingen av exporten etc. att tillämpas. DETTA ÄR ETT GEMENSAMT FEL OCH ORSAKAR MYCKET UTVECKLARE FÖR ATT TAPA MYCKET TID.

För att dina ändringar som tillämpas i ditt skript ska få effekt den globala miljön måste skriptet köras med

.myscript.sh 

kommando.

För att säkerställa att ditt skript inte körs in en subshel kan du använda den här funktionen. (Återigen är exemplet för Ubuntu-skal)

#/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 } 

Jag hoppas att detta rensar några av de vanliga missförstånden! : D Lycka till!

Svar

I din fråga hänvisar du till https://stackoverflow.com/questions/902946/ som rekommenderar att inte källa, när det accepterade svaret föreskriver till

  • Lägg min PATH-inställning i en .profilfil (för att jag ibland använder andra skal)
  • Lägg mina Bash-alias och funktioner i mina. bashrc-fil
  • Använd sedan den här [EDITED: klippkodkommentarer]:

    .bash_profile:

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

Att lägga allt i .profile gjorde fungerar inte för mig på Linux Mint. Att använda .bashrc fungerade bra.

Svar

Den enkla lösningen är att göra terminal en inloggningsterminal. För Gnome-terminal under ”Tile and Command” i standardprofilen kan du markera rutan ”Kör kommando som inloggningsskal”. Den här artikeln förklarar skillnaden mellan ett inloggningsskal och ett som inte är det.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *