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=VALUE
kde VAR se skládá z písmen, číslic a podtržítek. Alternativní tvarVAR DEFAULT=value
umožň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.