For nylig bemærkede jeg, at vi har 3 muligheder for at indstille miljøvariabler:
-
export envVar1=1
-
setenv envVar2=2
-
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
Svar
Der er flere spørgsmål med svar, der svarer på dette:
-
Forskel mellem shell-variabler, der eksporteres, og dem, der ikke er i bash
-
Hvad er forskellen i brug mellem shellvariabler og miljøvariabler?
(osv.)
VAR=asdf
miljøet, hvisVAR
allerede var i miljøet. (Dette var ikke ' t sandt i den oprindelige Bourne-skal.)