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=asdfaktualizuje prostředí, pokudVARv prostředí již byl. (V původním prostředí Bourne to ' neplatilo.)