Jaký je rozdíl mezi env, setenv, export a kdy použít?

Nedávno jsem si všiml, že máme 3 možnosti nastavení proměnných prostředí:

  1. export envVar1=1
  2. setenv envVar2=2
  3. 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

  • V moderních shellech VAR=asdf aktualizuje prostředí, pokud VAR v prostředí již byl. (V původním prostředí Bourne to ' neplatilo.)

Odpověď

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *