Otázka mluví za vše. V současné době používám Arch Linux a zsh, ale chtěl bych řešení, které (minimálně) funguje jak na VT, tak v xterms a také (doufejme, pokud možno) bude fungovat i nadále, pokud změním distribuce nebo shelly.
Slyšel jsem divoce nesourodé odpovědi na tuto otázku v dokumentech různých distribucí. Ubuntu říká „použijte .pam_environment“. Myslím, že v Archu to, co doporučují, závisí na vašem shellu. V současné době vše vkládám do .profile a pokud to shell z nějakého důvodu nezískává (např. bash, pokud .bash_profile existuje), přepíšu to ručním získáváním zdrojů. Ale zdá se, že musí existovat lepší způsob.
Přijatá odpověď:
Bohužel neexistuje žádné plně přenosné místo pro nastavení proměnných prostředí. Dva soubory, které jsou nejblíže, jsou ~/.profile , což je tradiční umístění a funguje hned po vybalení v mnoha nastaveních, a ~/.pam_environment , moderní, běžná, ale omezená alternativa.
Co vložit do ~/.pam_environment
Soubor ~/.pam_environment je čten všemi způsoby přihlášení, které používají PAM a které mají tento soubor povolený. To pokrývá většinu současných systémů Linux.
Hlavní výhoda ~/.pam_environment spočívá v tom, že (je-li povoleno) je načteno před spuštěním uživatelského prostředí, takže funguje bez ohledu na typ relace, přihlašovací prostředí a další složitosti. Funguje dokonce i pro neinteraktivní přihlášení, jako je su -c somecommand a ssh somecommand .
Hlavní omezení ~/.pam_environment je, že tam můžete vkládat pouze jednoduchá přiřazení, nikoli složitou syntaxi shellu. Syntaxe tohoto souboru je následující.
- Soubory jsou analyzovány řádek po řádku.
- Každý řádek musí mít tvar
VAR=VALUEkde VAR se skládá z písmen, číslic a podtržítek. Alternativní tvarVAR DEFAULT=valueumožňuje rozšíření proměnných prostředí pomocí${VAR}syntaxe a speciální proměnné@{HOME}a@{SHELL}. #spustí komentář, nemůže se objevit v hodnotě.- Pokud je VALUE obklopena
", pak se VAR nastaví na řetězec mezi uvozovkami. $nebo@vložte doslovný$nebo@a dlouhé řádky lze rozdělit escapováním nového řádku pomocí.- Pokud se vyskytne chyba syntaxe, například žádný
=nebo mezery v uvozovkách, proměnná je odstraněna z prostředí.
Takže na druhou stranu, ~/.pam_environment funguje v široké škále okolností. Na druhou stranu nemůžete použít výstup příkazu (např. test, zda je přítomen adresář nebo program) a některé znaky (#" , nový řádek) je nemožné nebo obtížné zadat hodnotu.
Co vložit do ~/.profile
Tento soubor by měl mít přenosnou (POSIX) syntaxi sh. Používejte pouze rozšíření ksh nebo bash (pole, [[ … ]] , atd.), pokud víte, že váš systém má tyto shelly jako /bin/sh .
Tento soubor mohou číst skripty v automatických aplikacích, takže by neměl volat programy, které produkují jakýkoli výstup, ani volat exec . Pokud to chcete provést při přihlašování v textovém režimu, udělejte to pouze pro interaktivní shelly. Příklad:
case $- in *i*)
# Display a message if I have new mail
if mail -e; then echo 'You have new mail'; fi
# If zsh is available, and this looks like a text-mode login, run zsh
case "`ps $PPID` " in
*" login "*)
if type zsh >/dev/null 2>/dev/null; then exec zsh; fi;;
esac
esac
Toto je příklad použití /bin/sh jako váš přihlašovací shell a přepnutí do vašeho oblíbeného shellu. Podívejte se také, jak mohu použít bash jako svůj přihlašovací shell, když mi systémový administrátor odmítne dovolit jej změnit
Kdy je ~/.profile nečtete na negrafickém přihlášení?
Různé přihlašovací shelly čtou různé soubory.
Pokud je váš přihlašovací shell bash
Bash čte ~/.bash_login nebo ~/.bash_profile pokud existují místo ~/.profile . Bash také nečte ~/.bashrc v přihlašovacím prostředí, i když je interaktivní. Abyste si tyto zvláštnosti už nikdy nemuseli pamatovat, vytvořte si ~/.bash_profile s následujícími dvěma řádky:
. ~/.profile
case $- in *i*) . ~/.bashrc;; esac
Pokud je váš přihlašovací shell zsh
Zsh čte ~/.zprofile a ~/.zlogin , ale ne ~/.profile . Zsh má jinou syntaxi než sh, ale umí číst ~/.profile v režimu emulace sh. Můžete to použít pro svůj ~/.zprofile :
emulate sh -c '. ~/.profile'
Pokud je váš přihlašovací shell nějaký jiný shell
Kromě použití /bin/sh tam toho moc dělat nemůžete jako váš přihlašovací shell a váš oblíbený shell (jako je ryba) pouze jako interaktivní shell. To je to, co dělám se zsh. Viz výše pro příklad vyvolání jiného shellu z ~/.profile .
Vzdálené příkazy
Při vyvolání vzdáleného příkazu bez procházení interaktivním shellem ne všechny shelly čtou spouštěcí soubor.
Ksh čte soubor určený ENV proměnná, pokud se vám ji podaří předat.
Bash čte ~/.bashrc pokud není interaktivní (!) a jeho nadřazený proces se nazývá rshd nebo sshd . Takže můžete spustit svůj ~/.bashrc s
if [[ $- != *i* ]]; then
. ~/.profile
return
fi
Zsh vždy čte ~/.zshenv když to začne. Používejte opatrně, protože to čte každá jednotlivá instance zsh, i když se jedná o podshell, kde jste nastavili jiné proměnné. Pokud je zsh váš přihlašovací shell a chcete jej použít k nastavení proměnných pouze pro vzdálené příkazy, použijte strážce:nastavte nějakou proměnnou v ~/.profile , například MY_ENVIRONMENT_HAS_BEEN_SET=yes a před čtením ~/.profile zkontrolujte tuto ochranu .
if [[ -z $MY_ENVIRONMENT_HAS_BEEN_SET ]]; then emulate sh -c '~/.profile'; fi
Případ grafických přihlášení
Mnoho distribucí, správců zobrazení a desktopových prostředí umožňuje spuštění ~/.profile , buď explicitním získáním ze spouštěcích skriptů, nebo spuštěním přihlašovacího shellu.
Bohužel neexistuje žádná obecná metoda pro zpracování kombinací distro/DM/DE, kde ~/.profile není přečteno.
Pokud používáte tradiční relaci zahájenou ~/.xsession , toto je místo, kde byste měli nastavit proměnné prostředí; udělejte to pomocí zdroje ~/.profile (tj. . ~/.profile ). Všimněte si, že v některých nastaveních budou spouštěcí skripty desktopového prostředí zdrojem ~/.profile znovu.