Vad är skillnaden mellan env, setenv, export och när ska man använda?

Nyligen märkte jag att vi har tre alternativ för att ställa in miljövariabler:

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

  • I moderna skal uppdaterar VAR=asdf miljön om VAR redan fanns i miljön. (Detta var inte ' t sant i det ursprungliga Bourne-skalet.)

Svar

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *