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 somulimit
. - 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]
- Kjører du dette direkte i terminalen eller i et skript?
- 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.