Comment exporter des variables définies en une fois?

39

setLa commande affiche toutes les variables locales comme ci-dessous. Comment exporter ces variables en une fois?

>set
a=123
b="asd asd"
c="hello world"
Neerav
la source
que voulez-vous dire exporter en une fois? vous pouvez utiliser des points-virgules pour définir en une seule ligne ... comme a = 123; b = "asd asd"; c = "hello world"
Raza
Très similaire à unix.stackexchange.com/q/79064/4667
glenn jackman le
2
setaffiche également des fonctions et des variables système telles que BASH_VERSION
glenn jackman
Votre question n'est pas claire. Est-ce un extrait de la setsortie que vous montrez? Si c'est le cas, alors ce n'est pas bashle cas. Voulez-vous exporter toutes les variables actuellement définies, y compris les variables spéciales du shell? Ou seulement ces 3 variables comme dans export a b c?
Stéphane Chazelas
export ${!T*}exporterait tout paramètre défini dont le nom commence par T. Malheureusement, il ne semble pas y avoir de moyen de générer facilement une liste de tous les paramètres définis.
Chepner

Réponses:

72

Exécutez la commande suivante avant de définir les variables:

set -a 

page de manuel:

-a
Lorsque cette option est activée, l'attribut export doit être défini pour chaque variable à laquelle une affectation est effectuée.

Pour désactiver cette option, exécutez set +aensuite.

Exemple:

set -a
. ./environment
set +a

environmentcontient:

FOO=BAR
BAS='quote when using spaces'
nitine
la source
13
Cela doit être activé avant d'affecter des variables, cependant. Cela ne fait rien aux variables précédemment assignées.
Chepner
1
@ chepner, merci j'ai oublié de mentionner ça !!
nitin
Cela exporte aussi automatiquement les fonctions de la même manière quefunction example(){ echo good; }; export -f example
Oliver I
5
`echo "export" $((set -o posix ; set)|awk -F "=" 'BEGIN{ORS=" "}1 $1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $1}')`
  1. Tout d’abord, obtenez toutes les variables d’environnement définies: (set -o posix ; set) Référence: https://superuser.com/questions/420295/how-do-i-see-a-list-of-all-currently-defined-environment-variables-in-a- linux-ba

  2. Obtenez tous les noms de variable d'environnement, séparés par un espace: awk -F "=" 'BEGIN{ORS=" "}1 $1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $1}' Référence: awk-Printing valeur de colonne sans nouvelle ligne et en ajoutant une virgule et https://stackoverflow.com/questions/14212993/regular-expression-to-match-a-pattern-inside- awk-command

  3. Nous devons maintenant exporter ces variables, mais xargs ne peut pas le faire car il crée un processus enfant. L'exportation doit être exécutée avec le processus en cours. echo "export" ...construire une commande que nous voulons, puis utilisez `` pour l'exécuter. C'est tout: p.

Bear Huang
la source
Bienvenue à U & L SE. Peut-être que vous pouvez éditer votre message et donner quelques explications.
Archemar
1
Il n'est pas correct de supposer que les noms de variable d'environnement seront uniquement constitués de az et de AZ. Ils incluent généralement des traits de soulignement et des chiffres, ce qui est le cas [a-zA-Z_][a-zA-Z0-9_]*. Il y a quelques variations à cela en fonction du shell que vous utilisez, mais c'est l'approche sécurisée / portable.
Chris Johnson
Bon point @ChrisJohnson - mis à jour!
Wil Moore III
3

Vous pouvez ajouter exportle nom de la variable via awket evalla sortie résultante:

eval $(printenv | awk -F= '{ print "export " $1 }')
Wil Moore III
la source
2
printenvimprime les variables déjà exportées. Cela ne fonctionnera pas non plus correctement s'il existe des variables contenant des caractères de nouvelle ligne.
Stéphane Chazelas
2

Cela fonctionne si votre shell est bash (éventuellement d'autres shells)

export > /my/env/var/file

votre nouveau fichier contiendra un dump de toutes les variables actuellement définies ... avec des entrées comme

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"

puis de soulever shell actuel avec toutes ces questions env vars

source  /my/env/var/file
Scott Stensland
la source