Hvad er forskellen mellem env, setenv, eksport og hvornår de skal bruges?

For nylig bemærkede jeg, at vi har 3 muligheder for at indstille miljøvariabler:

  1. export envVar1=1
  2. setenv envVar2=2
  3. env envVAr3=3

Hvis der er andre måder, bedes du oplyse os.

Hvornår skal jeg foretrække den ene frem for den anden? Foreslå retningslinjer.

Hvad angår shell-kompatibilitet, som er den mest ekspansive (dækker flere shell-dialekter)?

Jeg har allerede bemærket dette svar , men jeg vil udvide spørgsmålet med env og retningslinjer for brugsindstillinger.

Svar

export VARIABLE_NAME="some value" er måden at indstille en miljøvariabel i enhver POSIX-kompatibel shell (sh, dash, bash, ksh osv .; også zsh). Hvis variablen allerede har en værdi, kan du bruge export VARIABLE_NAME til at gøre den til en miljøvariabel uden at ændre dens værdi.

Pre-POSIX Bourne-skaller understøttede ikke dette, hvorfor du” ser scripts, der undgår export VARIABLE_NAME="some value" og bruger VARIABLE_NAME="some value"; export VARIABLE_NAME i stedet. Men pre-POSIX Bourne-skaller er ekstremt sjældne i dag.

setenv VARIABLE_NAME="some value" er csh-syntaksen for at indstille en miljøvariabel. setenv findes ikke i sh, og csh bruges ekstremt sjældent i scripts og er blevet overgået af bash til interaktiv brug i de sidste 20 år (og zsh i endnu længere tid), så du kan glemme det, medmindre du støder på det.

Kommandoen env er meget sjældent nyttig, undtagen i shebang-linjer . Når det påberåbes uden argumenter, viser det miljøet, men export gør det bedre (sorteret og ofte citeret til disambigua te nye linjer i værdier fra nye linjer, der adskiller værdier). Når den påberåbes med argumenter, kører den en kommando med ekstra miljøvariabler, men den samme kommando uden env fungerer også (VAR=value mycommand kører mycommand med VAR indstillet til value, ligesom env VAR=value mycommand). Årsagen til, at env er nyttig i shebang-linjen, er, at den udfører PATH opslag, og det sker, at man ikke gør noget andet, når man påberåbes med en kommando navn. env kommandoen kan være nyttigt at køre en kommando med kun få miljøvariabler med -i eller uden parametre til at vise miljøet inklusive variabler med ugyldige navne, som skallen ikke importerer.

Svar

Indstilling af en variabel som VAR="asdf" efterlader miljøet uændret, hvilket betyder at de programmer, du starter i den samme session, ikke ved noget om VAR og ikke har adgang til det. Du vil have denne adfærd, når du skriver shell-scripts .

export er derimod en indbygget bash, der ændrer miljøet, hvilket gør den eksporterede variabel synlig for underordnede processer, der er skabt i den aktuelle session. kan opnå det samme ved at køre VAR="asdf" %program_name%.

env er ikke et indbygget, men et program i sig selv. overfladen fungerer det nøjagtigt som når du VAR="asdf" %program_name%, men på lavere niveau bliver tingene lidt mere komplicerede. Først lanceres env. Det ændrer miljø og udfører derefter kommandoen med givne argumenter. Den samme adfærd kan du opnå i din egen kode ved hjælp af exec (3) systemopkald.

setenv er bare export i csh-familie-skaller, som det fremgår af dit svar.

Kommentarer

  • I moderne skaller opdaterer VAR=asdf miljøet, hvis VAR allerede var i miljøet. (Dette var ikke ' t sandt i den oprindelige Bourne-skal.)

Svar

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *