Nedávno jsem si všiml, že máme 3 možnosti nastavení proměnných prostředí:
-
export envVar1=1
-
setenv envVar2=2
-
env envVAr3=3
Pokud existují i jiné způsoby, osvětlete nás.
Kdy bych měl dát přednost jednomu před druhým? Navrhněte pokyny.
Pokud jde o kompatibilitu prostředí, která je nejrozsáhlejší (pokrývá více dialektů prostředí)?
Už jsem si toho všiml odpověď , ale chtěl bych otázku rozšířit o env
a pokyny k preferencím použití.
Odpovědět
export VARIABLE_NAME="some value"
je způsob, jak nastavit proměnnou prostředí v jakémkoli prostředí kompatibilním s POSIX (sh
, dash
, bash
, ksh
atd .; také zsh). Pokud proměnná již má hodnotu, můžete ji pomocí export VARIABLE_NAME
vytvořit proměnnou prostředí beze změny její hodnoty.
Pre-POSIX Bourneovy skořápky toto nepodporovaly, a proto uvidíte skripty, které se vyhnou export VARIABLE_NAME="some value"
a použijete VARIABLE_NAME="some value"; export VARIABLE_NAME
. Ale pre-POSIX Bourneovy shelly jsou v dnešní době extrémně vzácné.
setenv VARIABLE_NAME="some value"
je syntaxe csh pro nastavení proměnné prostředí. setenv
v sh neexistuje a csh se ve skriptech používá extrémně zřídka a za posledních 20 let ho překonal bash pro interaktivní použití (a zsh ještě déle), takže na něj můžete zapomenout, pokud setkáte se s ním.
Příkaz env
je velmi zřídka užitečný, kromě šebangových řádků . Při vyvolání bez argumentů zobrazí prostředí, ale export
to udělá lépe (seřazeno a často citováno na disambigua nové řádky v hodnotách od nových řádků, které oddělují hodnoty). Při vyvolání pomocí argumentů spustí příkaz s extra proměnnými prostředí, ale funguje stejný příkaz bez env
(VAR=value mycommand
běží mycommand
s VAR
nastaveným na value
, stejně jako env VAR=value mycommand
). Důvod env
je užitečný v linii shebang je ten, že provádí PATH
vyhledávání a při vyvolání pomocí příkazu nedělá nic jiného název. Příkaz env
může být užitečný pro spuštění příkazu pouze s několika proměnnými prostředí s -i
nebo bez parametrů pro zobrazení prostředí včetně proměnných s neplatnými názvy, které shell neimportuje.
Odpovědět
Nastavení proměnné jako VAR="asdf"
ponechává prostředí nezměněné, což znamená, že programy, které spustíte ve stejné relaci, nebudou o VAR
nic vědět a nebudou k němu mít přístup. Toto chování chcete při psaní skriptů prostředí .
export
je naopak integrovaný bash, který upravuje prostředí, čímž zviditelňuje exportovanou proměnnou pro podřízené procesy, které se objevily v aktuální relaci. toho lze dosáhnout spuštěním VAR="asdf" %program_name%
.
env
není vestavěný program, ale program sám o sobě. povrch funguje přesně tak, jako když VAR="asdf" %program_name%
, ale na nižší úrovni se věci trochu komplikují. Nejprve se spustí env
. Upravuje prostředí a poté provede příkaz s danými argumenty. Stejné chování můžete dosáhnout i ve svém vlastním kódu pomocí systémového volání exec (3) .
setenv
je pouze export
ve skořápkách rodiny csh, jak je uvedeno ve vaší odpovědi.
Komentáře
Odpověď
Existuje několik otázek s odpověďmi, které na to odpovídají:
-
Rozdíl mezi exportovanými proměnnými prostředí a těmi, které nejsou v bash
-
Jaký je rozdíl v použití mezi proměnnými prostředí a proměnnými prostředí?
(atd.)
VAR=asdf
aktualizuje prostředí, pokudVAR
v prostředí již byl. (V původním prostředí Bourne to ' neplatilo.)