Hva er forskjellen mellom env, setenv, eksport og når du skal bruke?

Nylig la jeg merke til at vi har 3 muligheter for å sette miljøvariabler:

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

  • I moderne skjell oppdaterer VAR=asdf miljøet hvis VAR allerede var i miljøet. (Dette var ikke ' t sant i det opprinnelige Bourne-skallet.)

Svar

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *