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