Waarom werkt mijn ~ / .bash_profile niet '?

Ik gebruik Linux Mint. Mijn login-shell (cat /etc/passwd | grep myUserName) is bash.

Nadat ik mijn grafische desktopomgeving heb gestart en er een terminalemulator van heb uitgevoerd, kan ik zien dat .bash_profile geen bron is (omgevingsvars die export ed erin zijn niet ingesteld). Maar als ik inlog vanaf een tekstconsole ( ctrl + alt + F1 ) of handmatig start bash -l vanuit de terminalemulator, .bash_profile werkt prima.

Heb ik het mis als ik denk dat .bash_profile zou afkomstig moeten zijn als X start en alle export “ed variabelen zouden beschikbaar moeten zijn in de terminal, draaiend vanaf X?

PS Alles in .bashrc plaatsen en het halen van .bash_profile is geen goed idee ( https://stackoverflow.com/questions/902946/ ): omgevingsmateriaal mag slechts één keer worden gebruikt.

Antwoord

Het bestand ~/.bash_profile wordt gelezen door bash als het een login-shell is. Dat is wat je krijgt als je in de tekstmodus inlogt.

Als je inlogt onder X, worden de opstartscripts uitgevoerd door /bin/sh. Op Ubuntu en Mint, /bin/sh is streepje , niet bash. Dash en bash hebben beide dezelfde kernfuncties, maar het streepje blijft deze kernfuncties om snel en klein te zijn, terwijl bash veel functies toevoegt ten koste van meer bronnen. Het is gebruikelijk om dash te gebruiken voor scripts die de extra functies niet nodig hebben en bash voor interactief gebruik (hoewel zsh heeft veel leukere functies ).

De meeste combinaties van weergave manager (het programma waarin u uw gebruikersnaam en wachtwoord typt) en desktopomgeving lezen ~/.profile van de inlogscripts in /etc/X11/Xsession, /usr/bin/lightdm-session, /etc/gdm/Xsession of wat van toepassing is. Dus plaats de definities van uw omgevingsvariabelen in ~/.profile. Zorg ervoor dat u alleen syntaxis gebruikt die door het streepje wordt ondersteund.

Dus wat moet u waar plaatsen?

  • Een goede .bash_profile laadt .profile, en laadt .bashrc als de shell interactief is.

    . ~/.profile if [[ $- == *i* ]]; then . ~/.bashrc; fi 
  • In .profile, plaats definities van omgevingsvariabelen en andere sessie-instellingen zoals ulimit.

  • In .bashrc zet je bash interactieve instellingen zoals aliassen, functies, voltooiing, sneltoetsen (die niet in .inputrc),…

Zie ook Verschil tussen Login Shell en Non-Login Shell? en Alternatief voor .bashrc .

Reacties

  • veel dingen geleerd van één antwoord: )
  • zelfs .profile werkt niet ‘ t in Debian 10 ” Buster “, alleen .bashrc wor ks

Answer

.bash_profile is het opstartconfiguratiescript van bash. Er bestaat geen standaard mandaat X om .bash_profile te gebruiken.

Waar je aan denkt is eerder .profile. Oorspronkelijk was het het opstartconfiguratiebestand van de bourne shell (sh). Tegenwoordig hebben veel distributies hun desktopomgeving ingesteld op de bron .profile. Merk op dat dit ook geen standaard is, maar het lijkt een afspraak te zijn.

Debian gebruikte de bron .profile bij grafische login ( wikipagina vanaf 2013 ) nu niet” t ( wikipagina vanaf 2016 ).

Arch sources .xprofile bij grafische login ( wikipagina vanaf 2013 ).

Ubuntu ontmoedigde het gebruik van .profile ( wikipagina vanaf 2013 ), nu ontmoedigt het niet meer ( wikipagina vanaf 2016 ).


Met betrekking tot je andere vraag: waarom werkt mijn ~ / .bash_profile niet? Dat is de verwacht gedrag.

Het gedrag, in het kort, is als volgt:

  • bash begon als een interactieve login-shell: leest ~/.profile
  • bash begon als een interactieve niet-inlog-shell: leest ~/.bashrc

Zie voor meer details mijn antwoord op een simil een vraag in askubuntu: https://askubuntu.com/questions/132276/configure-gnome-terminal-to-start-bash-as-a-login-shell-doesnt-read-bashrc/132319#132319

Opmerkingen

  • Een deel hiervan is correct, maar” always read ~/.bashrc “is een slecht advies: je moet alleen lezen .bashrc vanuit een interactieve shell .U ‘ hebt het kernprobleem hier gemist, namelijk dat wanneer u zich aanmeldt onder X, er geen aanmeldingsinstantie van bash is (onder de meeste combinaties van display manager / desktop-omgeving, waaronder klaarblijkelijk AntonioK ‘ s).
  • Bedankt voor je feedback. Ik hoop dat ik mijn antwoord goed genoeg heb bijgewerkt om uw klachten op te lossen. Met betrekking tot mijn advies aan ” lees altijd .bashrc “, ik bedoelde altijd voor een interactieve shell . Ik heb dat deel verduidelijkt. Ik hoop dat het niet meer misleidend is.
  • Ubuntu ontmoedigt specifiek het gebruik van .profile ( link ) ” De wiki heeft dat ooit (absurd) ontmoedigd; dat ‘ s zijn opgelost. (Opmerking /etc/profile blijft ontmoedigd voor systeembrede toewijzingen, in plaats van scripts toe te voegen aan /etc/profile.d.) Per gebruiker .profile bestanden worden nu gepresenteerd als een van de aanbevolen manieren om omgevingsvariabelen per gebruiker in te stellen: ” Geschikte bestanden voor instellingen voor omgevingsvariabelen die alleen een bepaalde gebruiker ( in plaats van het systeem als geheel) zijn ~ / .pam_environment en ~ / .profile . ”
  • De gelinkte pagina over Debian specificeert dat Debian niet ~/.profile leest voor grafische login en ~/.xsessionrc zou moeten zijn in plaats daarvan gebruikt.
  • bedankt voor het opmerken. de wikipagina is bijgewerkt. ik heb naar de versies gelinkt zoals ze waren op het moment van antwoord.

Answer

Er doen zich een aantal problemen voor wanneer proberen om het / source ~ / .profile-bestand opnieuw te laden. [Dit verwijst naar Ubuntu linux – in sommige gevallen zullen de details van de commandos verschillen]

  1. Voert u dit rechtstreeks in een terminal of in een script uit?
  2. Hoe werkt het? voer je dit uit in een script?

Ad. 1)

Als u dit rechtstreeks in de terminal uitvoert, betekent dit dat er geen subshell wordt gemaakt. U kunt dus twee opdrachten gebruiken:

source ~/.bash_profile 

of

. ~/.bash_profile 

In beide gevallen dit zal de omgeving updaten met de inhoud van het .profile-bestand.

Ad 2) Je kunt elk bash-script starten door te bellen naar

sh myscript.sh 

of

. myscript.sh 

In het eerste geval zal dit een subshell creëren die geen invloed heeft op de omgevingsvariabelen van uw systeem en ze zijn alleen zichtbaar voor het subshell-proces. Na het voltooien van het subshell-commando wordt geen van de exports enz. Toegepast. DIT IS EEN VEEL VOORKOMENDE FOUT EN VEROORZAAKT DAT VEEL ONTWIKKELAARS VEEL TIJD VERLIEZEN.

Om ervoor te zorgen dat uw wijzigingen die in uw script zijn toegepast van kracht worden voor de globale omgeving waarin het script moet worden uitgevoerd met

.myscript.sh 

commando.

Om er zeker van te zijn dat je script niet wordt uitgevoerd een subshel kunt u deze functie gebruiken. (Weer een voorbeeld is voor de 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 } 

Ik hoop dat dit enkele van de veelvoorkomende misverstanden oplost! : D Veel succes!

Antwoord

In uw vraag verwijst u naar https://stackoverflow.com/questions/902946/ als een aanbeveling om niet te zoeken, wanneer het geaccepteerde antwoord voorschrijft aan

  • Zet mijn PATH-instellingen in een .profile-bestand (omdat ik soms andere shells gebruik)
  • Zet mijn Bash-aliassen en functies in mijn. bashrc-bestand
  • Gebruik dan dit [EDITED: snip code-comments]:

    .bash_profile:

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

Alles in .profile deed werkt niet voor mij op Linux Mint. Het gebruik van .bashrc werkte prima.

Antwoord

De eenvoudige oplossing is om de terminal een login-terminal. Voor Gnome-terminal onder “Tile and Command” van het standaardprofiel kun je het vakje “Run command as a login shell” aanvinken. Dit artikel legt het verschil uit tussen een login-shell en een die dat niet is.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *