Hoe exporteer ik variabelen die zijn ingesteld, allemaal tegelijk?

set commando toont alle lokale variabelen zoals hieronder. Hoe exporteer ik deze variabelen allemaal tegelijk?

>set a=123 b="asd asd" c="hello world" 

Reacties

  • wat bedoel je met exporteren alles in een keer? u kunt puntkommas gebruiken om op één regel te definiëren … zoals a = 123; b = " asd asd "; c = " hallo wereld "
  • Zeer vergelijkbaar met unix.stackexchange .com / q / 79064/4667
  • set geeft ook functies en systeemvariabelen weer zoals BASH_VERSION
  • Uw vraag is onduidelijk . Is dat een fragment van de set -uitvoer die u ' laat zien? Zo ja, dan is het ' niet bash ' s. Wilt u alle momenteel ingestelde variabelen exporteren, inclusief de speciale shell-variabelen? Of zouden alleen die 3 variabelen zoals in export a b c?
  • export ${!T*} elke gedefinieerde parameter exporteren waarvan de naam begint met T. Helaas lijkt ' geen manier te zijn om eenvoudig een lijst met alle gedefinieerde parameters te genereren.

Answer

Voer het volgende commando uit voordat je de variabelen instelt:

set -a 

man pagina:

-a
Als deze optie is ingeschakeld, zal het exportattribuut voor elke variabele waaraan een toewijzing wordt uitgevoerd;

Om deze optie uit te schakelen, voert u set +a daarna uit.

Voorbeeld:

set -a . ./environment set +a 

Waar environment bevat:

FOO=BAR BAS="quote when using spaces" 

Opmerkingen

  • Dit moet echter zijn ingeschakeld voordat u variabelen kunt toewijzen. Het doet ' niets aan eerder toegewezen variabelen.
  • @chepner, bedankt, ik ben vergeten dat te vermelden !!
  • Dit ook automatisch exporteert functies op dezelfde manier als function example(){ echo good; }; export -f example

Answer

Dit werkt als je shell bash is (mogelijk ook andere shells)

export > /my/env/var/file 

je nieuwe bestand bevat een dump van alle momenteel gedefinieerde variabelen … met ingangen zoals

declare -x PORT="9000" declare -x PORT_ADMIN="3001" declare -x PORT_DOCKER_REGISTRY="5000" declare -x PORT_ENDUSER="3000" declare -x PRE_BUILD_DIR="/cryptdata6/var/log/tmp/khufu01/loud_deploy/curr/loud-build/hygge" declare -x PROJECT_ID="hygge" declare -x PROJECT_ID_BUSHIDO="bushido" 

en vervolgens de huidige shell opkrikken met al die env-vars-problemen

source /my/env/var/file 

Answer

`echo "export" $((set -o posix ; set)|awk -F "=" "BEGIN{ORS=" "}1 $1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $1}")` 
  1. Haal eerst alle ingestelde omgevingsvariabelen op: (set -o posix ; set) Referentie: https://superuser.com/questions/420295/how-do-i-see-a-list-of-all-currently-defined-environment-variables-in-a-linux-ba

  2. Haal alle namen van omgevingsvariabelen op, gescheiden door een spatie: awk -F "=" "BEGIN{ORS=" "}1 $1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $1}" Referentie: awk-Printing column valu e zonder nieuwe regel en toevoeging van komma en https://stackoverflow.com/questions/14212993/regular-expression-to-match-a-pattern-inside-awk-command

  3. Nu moeten we deze variabelen exporteren, maar xargs kan dit niet doen omdat het het onderliggende proces splitst, export moet worden uitgevoerd onder het huidige proces. echo "export" ... bouw een commando dat we willen, en gebruik vervolgens om het uit te voeren. Dat is alles: p.

Reacties

  • Welkom bij U & L SE. Misschien kun je je bericht bewerken en wat uitleg geven.
  • Het ' is niet correct om aan te nemen dat de namen van omgevingsvariabelen uitsluitend uit az zullen bestaan en AZ. Ze bevatten gewoonlijk ook onderstrepingstekens en cijfers, dus het patroon zou [a-zA-Z_][a-zA-Z0-9_]* zijn. Er zijn enkele variaties hierop gebaseerd op de shell die u ' hergebruikt, maar dit is de veilige / draagbare benadering.
  • Goed punt @ChrisJohnson – bijgewerkt!

Antwoord

U kunt export toevoegen aan de variabelenaam via awk en eval de resulterende uitvoer:

eval $(printenv | awk -F= "{ print "export " $1 }") 

Reacties

  • printenv drukt de variabelen af die al zijn geëxporteerd. Dat heeft ook ' geen werk nodig Ten eerste als er variabelen zijn die tekens voor een nieuwe regel bevatten.

Geef een reactie

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