GNU/Linux >> Znalost Linux >  >> Linux

Jaký je nejlepší způsob nastavení proměnných prostředí podle distro/shell agnostického prostředí?

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í tvar VAR 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

Související:Jak nastavit kombinaci kláves pro celý systém pro přepínání konkrétního nastavení předvoleb systému (“Klepnutím klepnutím”)?

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.


Linux
  1. Jaký je nejlepší způsob, jak vyjmout segment z textového souboru?

  2. Jaký je nejlepší způsob, jak spočítat počet souborů v adresáři?

  3. Způsob, jak získat název desktopového prostředí?

  1. Nejlepší způsob, jak zrušit všechny úlohy Slurm z výstupu příkazů Shell?

  2. Jaký je nejlepší způsob, jak vypálit video soubor na DVD?

  3. Existuje způsob, jak změnit proměnné prostředí jiného procesu v Unixu?

  1. Jaký je nejlepší způsob distribuce binární aplikace pro Linux?

  2. Nastavit dočasné prostředí ($PATH)

  3. Jaký je nejlepší způsob, jak nastavit proměnnou prostředí v .bashrc?