Nyligen märkte jag att vi har tre alternativ för att ställa in miljövariabler:
-
export envVar1=1
-
setenv envVar2=2
-
env envVAr3=3
Om det finns andra sätt, vänligen informera oss.
När ska jag föredra det ena över det andra? Vänligen föreslå riktlinjer.
När det gäller skalkompatibilitet, vilken är den mest expansiva (täcker fler skaldialekter)?
Jag har redan märkt det här svara men jag vill utöka frågan med env
och riktlinjer för användningsinställningar.
Svara
export VARIABLE_NAME="some value"
är sättet att ställa in en miljövariabel i alla POSIX-kompatibla skal (sh
, dash
, bash
, ksh
, etc.; även zsh). Om variabeln redan har ett värde kan du använda export VARIABLE_NAME
för att göra den till en miljövariabel utan att ändra dess värde.
Pre-POSIX Bourne-skal stödde inte detta, varför du ser skript som undviker export VARIABLE_NAME="some value"
och använder VARIABLE_NAME="some value"; export VARIABLE_NAME
istället. Men pre-POSIX Bourne-skal är extremt sällsynta nuförtiden.
setenv VARIABLE_NAME="some value"
är csh-syntaksen för att ställa in en miljövariabel. setenv
finns inte i sh, och csh används extremt sällan i skript och har överträffats av bash för interaktiv användning under de senaste 20 åren (och zsh ännu längre), så du kan glömma bort det om inte du stöter på det.
Kommandot env
är mycket sällan användbart utom i shebang-rader . När den anropas utan argument visar den miljön, men export
gör det bättre (sorterat och ofta citerat till disambigua te nya rader i värden från nya rader som skiljer värden). När det anropas med argument körs ett kommando med extra miljövariabler, men samma kommando utan env
fungerar också (VAR=value mycommand
kör mycommand
med VAR
inställt på value
, precis som env VAR=value mycommand
). Anledningen till att env
är användbart i shebang-linjen är att den utför PATH
-sökning, och det råkar inte göra något annat när det anropas med ett kommando namn. Kommandot env
kan vara användbart för att köra ett kommando med endast ett fåtal miljövariabler med -i
, eller utan parametrar för att visa miljön inklusive variabler med ogiltiga namn som skalet inte importerar.
Svar
Ställa in en variabel som VAR="asdf"
lämnar miljön omodifierad, vilket innebär att programmen du startar under samma session inte vet något om VAR
och kommer inte att kunna komma åt den. Du vill ha detta beteende när du skriver skalskript .
export
, å andra sidan, är en inbyggd bash som modifierar miljön, vilket gör den exporterade variabeln synlig för barnprocesser som skapats under den aktuella sessionen. kan uppnå detsamma genom att köra VAR="asdf" %program_name%
.
env
är inte ett inbyggt utan ett program i sig. ytan fungerar den precis som när du VAR="asdf" %program_name%
, men på lägre nivå blir saker och ting lite mer komplicerade. Först lanseras env
. Det ändrar miljö och kör sedan kommandot med givna argument. Samma beteende kan du uppnå i din egen kod genom att använda exec (3) systemanrop.
setenv
är bara export
i csh-familjen skal, som anges i ditt svar.
Kommentarer
Svar
Det finns flera frågor med svar som svarar på detta:
-
Skillnad mellan skalvariabler som exporteras och de som inte är bash
-
Vad är skillnaden i användning mellan skalvariabler och miljövariabler?
(etc.)
VAR=asdf
miljön omVAR
redan fanns i miljön. (Detta var inte ' t sant i det ursprungliga Bourne-skalet.)