Nylig la jeg merke til at vi har 3 muligheter for å sette miljøvariabler:
-
export envVar1=1
-
setenv envVar2=2
-
env envVAr3=3
Hvis det er andre måter, kan du opplyse oss.
Når skal jeg foretrekke hverandre? Vennligst foreslå retningslinjer.
Når det gjelder shell-kompatibilitet, som er den mest ekspansive (dekker flere skalldialekter)?
Jeg har allerede lagt merke til dette svar men jeg ønsker å utvide spørsmålet med env
og retningslinjene for brukspreferanser.
Svar
export VARIABLE_NAME="some value"
er måten å sette en miljøvariabel i et POSIX-kompatibelt skall (sh
, dash
, bash
, ksh
osv .; også zsh). Hvis variabelen allerede har en verdi, kan du bruke export VARIABLE_NAME
for å gjøre den til en miljøvariabel uten å endre verdien.
Pre-POSIX Bourne-skjell støttet ikke dette, og det er grunnen til at du ser skript som unngår export VARIABLE_NAME="some value"
og bruker VARIABLE_NAME="some value"; export VARIABLE_NAME
i stedet. Men pre-POSIX Bourne-skall er ekstremt sjeldne i våre dager.
setenv VARIABLE_NAME="some value"
er csh-syntaksen for å sette en miljøvariabel. setenv
eksisterer ikke i sh, og csh brukes ekstremt sjelden i skript og har blitt overgått av bash for interaktiv bruk de siste 20 årene (og zsh enda lenger), så du kan glemme det med mindre du støter på den.
env
-kommandoen er svært sjelden nyttig, bortsett fra i shebang-linjer . Når den påkalles uten argumenter, viser den miljøet, men export
gjør det bedre (sortert og ofte sitert til disambigua te nye linjer i verdier fra nye linjer som skiller verdier). Når den påkalles med argumenter, kjører den en kommando med ekstra miljøvariabler, men den samme kommandoen uten env
fungerer også (VAR=value mycommand
kjører mycommand
med VAR
satt til value
, akkurat som env VAR=value mycommand
). Årsaken til at env
er nyttig i shebang-linjen, er at den utfører PATH
oppslag, og det skjer å ikke gjøre noe annet når det påkalles med en kommando Navn. env
-kommandoen kan være nyttig å kjøre en kommando med bare noen få miljøvariabler med -i
, eller uten parametere for å vise miljøet inkludert variabler med ugyldige navn som skallet ikke importerer.
Svar
Angi en variabel som VAR="asdf"
etterlater miljøet umodifisert, noe som betyr at programmene du starter i samme økt, ikke vet noe om VAR
og ikke får tilgang til det. Du vil ha denne oppførselen når du skriver skallskript .
export
, derimot, er en bash-innebygd som endrer miljøet, og dermed gjør den eksporterte variabelen synlig for barneprosesser som ble skapt i den nåværende økten. kan oppnå det samme ved å kjøre VAR="asdf" %program_name%
.
env
er ikke et innebygd program, men et program i seg selv. overflaten fungerer den akkurat som når du VAR="asdf" %program_name%
, men på lavere nivå blir ting litt mer kompliserte. Først blir env
lansert. Det endrer miljø, og utfører deretter kommandoen med gitte argumenter. Den samme oppførselen kan du oppnå i din egen kode ved å bruke exec (3) systemanrop.
setenv
er bare export
i csh-familie-skjell, som angitt i svaret ditt.
Kommentarer
Svar
Det er flere spørsmål med svar som svarer på dette:
-
Forskjell mellom skallvariabler som eksporteres og de som ikke er i bash
-
Hva er forskjellen i bruk mellom skallvariabler og miljøvariabler?
(etc.)
VAR=asdf
miljøet hvisVAR
allerede var i miljøet. (Dette var ikke ' t sant i det opprinnelige Bourne-skallet.)