Onlangs heb ik gemerkt dat we 3 opties hebben om omgevingsvariabelen in te stellen:
-
export envVar1=1
-
setenv envVar2=2
-
env envVAr3=3
Als er andere manieren zijn, informeer ons dan alstublieft.
Wanneer zou ik de ene boven de andere prefereren? Geef alstublieft richtlijnen.
Wat betreft shell-compatibiliteit, welke is de meest uitgebreide (omvat meer shell-dialecten)?
Ik heb dit al opgemerkt antwoord maar ik wil de vraag uitbreiden met env
en richtlijnen voor gebruiksvoorkeuren.
Antwoord
export VARIABLE_NAME="some value"
is de manier om een omgevingsvariabele in te stellen in elke POSIX-compatibele shell (sh
, dash
, bash
, ksh
, enz .; ook zsh). Als de variabele al een waarde heeft, kunt u export VARIABLE_NAME
gebruiken om er een omgevingsvariabele van te maken zonder de waarde ervan te wijzigen.
Pre-POSIX Bourne-shells ondersteunden dit niet, daarom” zie je scripts die export VARIABLE_NAME="some value"
vermijden en VARIABLE_NAME="some value"; export VARIABLE_NAME
setenv VARIABLE_NAME="some value"
is de csh-syntaxis om een omgevingsvariabele in te stellen. setenv
bestaat niet in sh, en csh wordt uiterst zelden gebruikt in scripts en is de afgelopen 20 jaar (en zsh nog langer) overtroffen door bash voor interactief gebruik, dus je kunt het vergeten, tenzij je komt het tegen.
Het env
commando is zeer zelden nuttig behalve in shebang-regels . Als het zonder argumenten wordt aangeroepen, wordt de omgeving weergegeven, maar export
doet het beter (gesorteerd en vaak geciteerd als disambigua te nieuwe regels in waarden van nieuwe regels die waarden scheiden). Wanneer het met argumenten wordt aangeroepen, voert het een commando uit met extra omgevingsvariabelen, maar hetzelfde commando zonder env
werkt ook (VAR=value mycommand
voert mycommand
met VAR
ingesteld op value
, net als env VAR=value mycommand
). De reden dat env
handig is in de shebang-regel, is dat het PATH
opzoekt, en het gebeurt niets anders wanneer het wordt aangeroepen met een commando naam. Het env
commando kan handig zijn om een commando uit te voeren met slechts een paar omgevingsvariabelen met -i
, of zonder parameters om de omgeving inclusief variabelen weer te geven met ongeldige namen die de shell niet “niet importeert.
Antwoord
Een variabele instellen zoals VAR="asdf"
laat de omgeving ongewijzigd, wat betekent dat de programmas die u in dezelfde sessie start niets weten over VAR
en er geen toegang toe hebben. U wilt dit gedrag bij het schrijven van shell-scripts .
export
, aan de andere kant, is een bash ingebouwd die de omgeving wijzigt, waardoor de geëxporteerde variabele zichtbaar wordt voor onderliggende processen die in de huidige sessie worden voortgebracht. kan hetzelfde bereiken door VAR="asdf" %program_name%
uit te voeren.
env
is geen ingebouwd, maar een programma op zichzelf. het oppervlak werkt het precies zoals wanneer je VAR="asdf" %program_name%
, maar op het lagere niveau wordt het iets gecompliceerder. Eerst wordt de env
gestart. Het wijzigt de omgeving en voert vervolgens het commando uit met de opgegeven argumenten. Hetzelfde gedrag dat u kunt bereiken in uw eigen code door exec (3) systeemaanroep te gebruiken.
setenv
is gewoon export
in csh-family shells, zoals vermeld in je antwoord.
Reacties
Antwoord
Er zijn verschillende vragen met antwoorden die hierop antwoorden:
-
Verschil tussen shell-variabelen die worden geëxporteerd en degene die niet in bash zijn
-
Wat is het verschil in gebruik tussen shell-variabelen en omgevingsvariabelen?
(enz.)
VAR=asdf
de omgeving bij alsVAR
zich al in de omgeving bevond. (Dit was niet ' t waar in de originele Bourne-shell.)