Wat is het verschil tussen env, setenv, export en wanneer te gebruiken?

Onlangs heb ik gemerkt dat we 3 opties hebben om omgevingsvariabelen in te stellen:

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

  • In moderne shells werkt VAR=asdf de omgeving bij als VAR zich al in de omgeving bevond. (Dit was niet ' t waar in de originele Bourne-shell.)

Antwoord

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *