Hvorfor fungerer ' ikke min ~ / .bash_profile?

Jeg bruger Linux Mint. Min login shell (cat /etc/passwd | grep myUserName) er bash.

Efter at jeg har startet mit grafiske skrivebordsmiljø og kørt en terminalemulator fra det, kan jeg se, at .bash_profile ikke kommer fra (miljøvar, der er export ed i det er ikke indstillet). Men hvis jeg logger ind fra en tekstkonsol ( ctrl + alt + F1 ) eller kører manuelt bash -l fra terminalemulatoren, .bash_profile fungerer fint.

Har jeg forkert, når jeg tror, at .bash_profile skal hentes, når X starter, og alle export “ed vars skal være tilgængelige i terminalen og køre fra X?

PS At placere alt i .bashrc og hente det fra .bash_profile er ikke en god idé ( https://stackoverflow.com/questions/902946/ ): Miljømaterialer skal kun hentes en gang.

Svar

Filen ~/.bash_profile læses af bash, når det er en login-shell. Det er hvad du får, når du logger ind i teksttilstand.

Når du logger ind under X, udføres opstartsskripterne af /bin/sh. På Ubuntu og Mint, /bin/sh er dash , ikke bash. Dash og bash har begge de samme kerneegenskaber, men dash holder sig til disse kerneegenskaber for at være hurtige og små, mens bash tilføjer mange funktioner på bekostning af at kræve flere ressourcer. Det er almindeligt at bruge bindestreg til scripts, der ikke har brug for ekstra funktioner og bash til interaktiv brug (dog zsh har mange pænere funktioner ).

De fleste kombinationer af display manager (programmet hvor du skriver dit brugernavn og adgangskode) og skrivebordsmiljø læser ~/.profile fra login-scripts i /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsession eller hvad der er relevant. Så sæt dine miljøvariabeldefinitioner i ~/.profile. Sørg for kun at bruge syntaks, som dash understøtter.

Så hvad skal du placere hvor?

  • En god .bash_profile indlæser .profile, og indlæser .bashrc hvis skallen er interaktiv.

    . ~/.profile if [[ $- == *i* ]]; then . ~/.bashrc; fi 
  • I .profile skal du sætte definitioner på miljøvariabler og andre sessionindstillinger såsom ulimit.

  • I .bashrc skal du sætte bash interaktive indstillinger som aliaser, funktioner, færdiggørelse, tastebindinger (der ikke er t i .inputrc),…

Se også Forskel mellem login shell og ikke-login shell? og Alternativ til .bashrc .

Kommentarer

  • mange ting læres af et enkelt svar: )
  • endda .profile fungerer ikke ' t i Debian 10 " Buster ", kun .bashrc wor ks

Svar

.bash_profile er startkonfigurationsscriptet til bash. Der findes ingen standard, der pålægger X at kilde .bash_profile.

Det du tænker på er snarere .profile. Oprindeligt var det startkonfigurationsfilen til bourne shell (sh). I dag har mange distributioner deres desktop-miljø indstillet til kilde .profile. Bemærk, at dette heller ikke er en standard, men det ser ud til at være en konvention.

Debian plejede at hente .profile ved grafisk login ( wiki-side pr. 2013 ) nu gør det ikke ( wiki-side pr. 2016 ).

Buekilder .xprofile ved grafisk login ( wiki-side pr. 2013 ).

Ubuntu plejede at modvirke ved hjælp af .profile ( wiki-side pr. 2013 ) nu fraråder det ikke længere ( wiki-side pr. 2016 ).


Med hensyn til dit andet spørgsmål: Hvorfor fungerer ikke mit ~ / .bash_profile? Det er forventet adfærd.

Adfærden er kort sagt som følger:

  • bash startede som en interaktiv login-shell: læser ~/.profile
  • bash startede som en interaktiv ikke-login shell: læser ~/.bashrc

For flere detaljer se mit svar på en simil ar spørgsmål i askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc/132319#132319

Kommentarer

  • Noget af dette er korrekt, men” læs altid ~/.bashrc “er dårligt råd: du bør kun læse .bashrc fra en interaktiv shell .Du ' har savnet kerneproblemet her, det er at når du logger ind under X, er der ingen login-forekomst af bash (under de fleste kombinationer af skærmhåndtering / desktop-miljø, inklusive åbenbart AntonioK ' s).
  • Tak for din feedback. Jeg håber, jeg opdaterede mit svar godt nok til at løse dine klager. Med hensyn til mit råd til " læs altid .bashrc ", mente jeg altid for en interaktiv shell . Jeg har præciseret den del. Jeg håber, det ikke længere er vildledende.
  • " Ubuntu fraråder specifikt at bruge .profile ( link ) " Wiki frarådede det en gang (absurd) det; at ' er rettet. (Bemærk /etc/profile forbliver afskrækket for systemdækkende opgaver, og foretrækker at tilføje scripts til /etc/profile.d.) Per bruger .profile filer præsenteres nu som en af de anbefalede måder til at indstille miljøvariabler pr. bruger: " Egnede filer til miljøvariabelindstillinger, der kun skal påvirke en bestemt bruger ( snarere end systemet som helhed) er ~ / .pam_environment og ~ / .profile . "
  • Den sammenkædede side om Debian specificerer, at Debian ikke læser ~/.profile til grafisk login og ~/.xsessionrc brugt i stedet.
  • tak for din bemærkning. wiki-siden blev opdateret. Jeg linkede til versionerne, som de var på tidspunktet for besvarelsen.

Svar

Et par spørgsmål opstår, når forsøger at genindlæse / kilde ~ / .profilfil. [Dette refererer til Ubuntu linux – i nogle tilfælde vil kommandodetaljerne være forskellige]

  1. Kører du dette direkte i terminalen eller i et script?
  2. Hvordan gør kører du dette i et script?

Annonce. 1)

At køre dette direkte i terminalen betyder, at der ikke oprettes nogen subshell. Så du kan bruge enten to kommandoer:

source ~/.bash_profile 

eller

. ~/.bash_profile 

I begge tilfælde dette opdaterer miljøet med indholdet af .profile-filen.

Annonce 2) Du kan starte ethvert bash-script enten ved at ringe til

sh myscript.sh 

eller

. myscript.sh 

I det første tilfælde skaber dette en subshell, der ikke påvirker miljøvariablerne i dit system, og de vil kun være synlige for subshell-processen. Efter afslutning af subshell-kommandoen anvendes ingen af eksporten osv. DETTE ER ET FÆLLES FEJL OG FORÅRSAGER MYE UDVIKLERE TIL AT MISTE MEGET TID.

For at dine ændringer, der anvendes i dit script, skal have effekt for det globale miljø skal scriptet køres med

.myscript.sh 

kommando.

For at sikre at dit script ikke køres ind en subshel kan du bruge denne funktion. (Igen er eksemplet til Ubuntu-shell)

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

Jeg håber, at dette rydder nogle af de almindelige misforståelser! : D Held og lykke!

Svar

I dit spørgsmål henviser du til https://stackoverflow.com/questions/902946/ som anbefaling til ikke at kilde, når det accepterede svar ordinerer til

  • Sæt min PATH-opsætning i en .profilfil (fordi jeg nogle gange bruger andre skaller)
  • Sæt mine Bash-aliaser og funktioner i mine. bashrc-fil
  • Brug derefter denne [EDITED: snip code-comments]:

    .bash_profile:

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

At lægge det hele i .profile gjorde fungerer ikke for mig på Linux Mint. Brug af .bashrc fungerede fint.

Svar

Den enkle løsning er at lave terminal en login terminal. For Gnome-terminal under “Tile and Command” i standardprofilen kan du markere afkrydsningsfeltet “Run command as a login shell”. Denne artikel forklarer forskellen mellem en login-shell og en, der ikke er.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *