Que font les ensembles "set" et "export" de bash-builtins?

46

Je suis un peu d'une perte à la fin de setet exportdans Bash (et je pense que probablement d' autres shells).

Je pense que c'est pour définir des variables d'environnement, mais cela peut être fait simplement VARIABLE=VALUE, n'est-ce pas?

De plus, en tapant setet exportà eux seuls, affichent des valeurs différentes.

Alors, quel est leur but?

mydoghasworms
la source
Je commence toujours par le script bash avec les deux suivants. #! / usr / bin / env bash set -euxo pipefail Ce lien explique joliment la même chose. coderwall.com/p/fkfaqq/…
147.3k

Réponses:

50

exportexportations vers les enfants du processus en cours, ils ne sont pas exportés par défaut. Par exemple:

$ foo=bar
$ echo "$foo"
bar
$ bash -c 'echo "$foo"'

$ export foo
$ bash -c 'echo "$foo"'
bar

setd'autre part, définit les attributs du shell, par exemple les paramètres de position.

$ set foo=baz
$ echo "$1"
foo=baz

Notez que ce bazn'est pas affecté à foo, il devient simplement un paramètre de position littéral. Il y a beaucoup d'autres choses à setfaire (principalement des options de shell), voir help set.

Comme pour l'impression, exportappelé sans argument imprime toutes les variables de l'environnement du shell. setimprime également les variables qui ne sont pas exportées. Il peut aussi exporter d’autres objets (même s’il faut noter que ce n’est pas portable), voir help export.

Chris Down
la source
Merci c'est une réponse très utile. Cependant, lorsque je configure http_proxy uniquement avec http_proxy = abc.com , il est visible pour les processus enfants, par exemple, pour exécuter wget sans que je ne l'exporte. Comment se peut-il?
mydoghasworms
2
@mydoghasworms Deux raisons possibles. Un, vous exécutez la commande en tant que foo=bar command. Il s'agit d'une exportation implicite pour une seule commande. La deuxième possibilité est qu'il http_proxyest déjà exporté dans votre environnement avant que vous ne le modifiiez.
Chris Down
Ah oui, tu as raison. Génial, merci!
mydoghasworms
6

Voir help set: set est utilisé pour définir les attributs du shell et les attributs de position.

Les variables non exportées ne sont pas héritées par les processus enfants. exportest utilisé pour marquer une variable à exporter.

choroba
la source