Hvorfor fungerer ikke ' ~ / .bash_profile?

Jeg bruker Linux Mint. Min påloggingsskall (cat /etc/passwd | grep myUserName) er bash.

Etter at jeg har startet det grafiske skrivebordsmiljøet mitt og kjørt en terminalemulator fra det, kan jeg se at .bash_profile ikke er hentet (miljøvar som er export ed i den er ikke satt). Men hvis jeg logger på fra en tekstkonsoll ( ctrl + alt + F1 ) eller kjører manuelt bash -l fra terminalemulatoren, .bash_profile fungerer fint.

Tar jeg feil når jeg tenker at .bash_profile bør hentes når X starter, og alle export «ed vars bør være tilgjengelig i terminalen, kjører fra X?

PS Å plassere alt i .bashrc og hente det fra .bash_profile er ikke god idé ( https://stackoverflow.com/questions/902946/ ): miljø ting bør bare hentes en gang.

Svar

Filen ~/.bash_profile leses av bash når det er et påloggingsskall. Det er hva du får når du logger på i tekstmodus.

Når du logger på under X, blir oppstartsskriptene utført av /bin/sh. På Ubuntu og Mynte, /bin/sh er dash , ikke bash. Dash og bash har begge de samme kjernefunksjonene, men dash holder seg til disse kjernefunksjonene for å være raske og små, mens bash legger til mange funksjoner på bekostning av å kreve flere ressurser. Det er vanlig å bruke bindestrek for skript som ikke trenger ekstra funksjoner og bash for interaktiv bruk (skjønt zsh har mange finere funksjoner ).

De fleste kombinasjoner av skjerm manager (programmet der du skriver inn brukernavn og passord) og skrivebordsmiljø, les ~/.profile fra påloggingsskriptene i /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsession eller det som er aktuelt. Så legg definisjonene for miljøvariabler i ~/.profile. Sørg for å bare bruke syntaksen som dash støtter.

Så hva skal du plassere hvor?

  • En god .bash_profile laster .profile, og laster .bashrc hvis skallet er interaktivt.

    . ~/.profile if [[ $- == *i* ]]; then . ~/.bashrc; fi 
  • I .profile, legg definisjoner for miljøvariabler og andre sesjonsinnstillinger som ulimit.

  • I .bashrc, legg bash interaktive innstillinger som aliaser, funksjoner, fullføring, tastebindinger (som ikke er t i .inputrc),…

Se også Forskjellen mellom påloggingsskall og ikke-påloggingsskall? og Alternativ til .bashrc .

Kommentarer

  • mange ting læres av ett enkelt svar: )
  • selv .profil fungerer ikke ' t i Debian 10 " Buster ", bare .bashrc wor ks

Svar

.bash_profile er oppstartskonfigurasjonsskriptet til bash. Det eksisterer ingen standard som krever X til kilden .bash_profile.

Det du tenker på er heller .profile. Opprinnelig var det oppstartskonfigurasjonsfilen til bourne shell (sh). I dag har mange distribusjoner sitt skrivebordsmiljø satt opp til kilde .profile. Merk at dette heller ikke er en standard, men det ser ut til å være en konvensjon.

Debian pleide å kilde .profile ved grafisk pålogging ( wiki-side fra og med 2013 ) nå gjør den ikke t ( wiki-side per 2016 ).

Buekilder .xprofile ved grafisk pålogging ( wiki-side fra og med 2013 ).

Ubuntu pleide å motvirke ved å bruke .profile ( wiki-siden fra og med 2013 ), motvirker den ikke lenger ( wiki-side fra og med 2016 ).


Når det gjelder det andre spørsmålet ditt: Hvorfor fungerer ikke ~ / .bash_profile? Det er forventet oppførsel.

Oppførselen er kort sagt som følger:

  • bash startet som et interaktivt påloggingsskall: leser ~/.profile
  • bash startet som et interaktivt ikke-påloggingsskall: les ~/.bashrc

For mer informasjon, se svaret mitt på simil ar spørsmål i askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc/132319#132319

Kommentarer

  • Noe av dette er riktig, men“ les alltid ~/.bashrc ”er dårlig råd: du bør bare lese .bashrc fra et interaktivt skall .Du ' har savnet kjerneproblemet her, det er at når du logger på under X, er det ingen påloggingsforekomst av bash (under de fleste kombinasjoner av skjermadministrator / skrivebordsmiljø, inkludert tydeligvis AntonioK ' s).
  • Takk for tilbakemeldingen. Jeg håper jeg har oppdatert svaret mitt godt nok til å løse klagene dine. Når det gjelder mitt råd til " les alltid .bashrc ", mente jeg alltid for et interaktivt skall . Jeg har avklart den delen. Jeg håper det ikke er villedende lenger.
  • " Ubuntu fraråder spesifikt å bruke .profile ( lenke ) " Wiki frarådet en gang (absurd) det; at ' er løst. (Merk /etc/profile forblir motløs for systemdekkende oppgaver, og foretrekker å legge til skript til /etc/profile.d.) Per bruker .profile filer presenteres nå som en av de anbefalte måtene å angi miljøvariabler per bruker: " Egnede filer for miljøvariabelinnstillinger som bare skal påvirke en bestemt bruker ( i stedet for systemet som helhet) er ~ / .pam_environment og ~ / .profile . "
  • Den lenkede siden om Debian spesifiserer at Debian ikke leser ~/.profile for grafisk pålogging og ~/.xsessionrc brukt i stedet.
  • takk for at du la merke til det. wiki-siden ble oppdatert. Jeg koblet til versjonene slik de var på svarstidspunktet.

Svar

Det oppstår et par problemer når prøver å laste inn / kilde ~ / .profile-filen. [Dette refererer til Ubuntu Linux – i noen tilfeller vil detaljene i kommandoene være forskjellige]

  1. Kjører du dette direkte i terminalen eller i et skript?
  2. Hvordan gjør kjører du dette i et skript?

Annonse. 1)

Å kjøre dette direkte i terminalen betyr at det ikke blir opprettet noen subshell. Så du kan bruke enten to kommandoer:

source ~/.bash_profile 

eller

. ~/.bash_profile 

I begge tilfeller dette vil oppdatere miljøet med innholdet i .profile-filen.

Annonse 2) Du kan starte et hvilket som helst bash-skript enten ved å ringe

sh myscript.sh 

eller

. myscript.sh 

I det første tilfellet vil dette skape et subshell som ikke vil påvirke miljøvariablene til systemet ditt, og de vil bare være synlige for subshell-prosessen. Etter at subshell-kommandoen er fullført, blir ingen av eksportene etc. brukt. Dette er et vanlig feil og forårsaker mange utviklere for å miste mye tid.

For at endringene dine som brukes i skriptet ditt skal virke det globale miljøet må skriptet kjøres med

.myscript.sh 

kommando.

For å sikre at skriptet ikke kjøres inn en subshel kan du bruke denne funksjonen. (Igjen er eksemplet for Ubuntu-skallet)

#/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åper dette fjerner noen av de vanlige misforståelsene! : D Lykke til!

Svar

I spørsmålet ditt henviser du til https://stackoverflow.com/questions/902946/ som anbefaling om ikke å kilde, når det aksepterte svaret foreskriver til

  • Sett PATH-oppsettet mitt i en .profilfil (fordi jeg noen ganger bruker andre skall)
  • Sett Bash-aliasene og funksjonene mine inn i mine. bashrc-fil
  • Bruk så denne [EDITED: snip code-comments]:

    .bash_profile:

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

Å legge alt i .profile gjorde fungerer ikke for meg på Linux Mint. Å bruke .bashrc fungerte bra.

Svar

Den enkle løsningen er å lage terminal en påloggingsterminal. For Gnome-terminal under «Tile and Command» i standardprofilen kan du merke av i boksen «Kjør kommando som et påloggingsskall». Denne artikkelen forklarer forskjellen mellom et påloggingsskall og et som ikke er det.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *