web-dev-qa-db-fra.com

Quelle est la différence entre env, setenv, export et quand l'utiliser?

Récemment, j'ai remarqué que nous avons 3 options pour définir les variables d'environnement:

  1. export envVar1=1
  2. setenv envVar2=2
  3. env envVAr3=3

S'il existe d'autres moyens, veuillez nous éclairer.

Quand devrais-je préférer l'un à l'autre? Veuillez suggérer des directives.

Quant à la compatibilité avec Shell, laquelle est la plus étendue (couvre plus de dialectes Shell)?

J'ai déjà remarqué cela réponse mais je souhaite développer la question avec env et les directives de préférence d'utilisation.

19
Maroshi

export VARIABLE_NAME='some value' est le moyen de définir une variable d'environnement dans n'importe quel shell compatible POSIX (sh, dash, bash, ksh, etc .; aussi zsh ). Si la variable a déjà une valeur, vous pouvez utiliser export VARIABLE_NAME pour en faire une variable d'environnement sans changer sa valeur.

Pre-POSIX Bourne shells ne supportait pas cela, c'est pourquoi vous verrez des scripts qui évitent export VARIABLE_NAME='some value' et utilise VARIABLE_NAME='some value'; export VARIABLE_NAME au lieu. Mais les coques Bourne pré-POSIX sont extrêmement rares de nos jours.

setenv VARIABLE_NAME='some value' est la syntaxe csh pour définir une variable d'environnement. setenv n'existe pas dans sh, et csh est extrêmement rarement utilisé dans les scripts et a été dépassé par bash pour une utilisation interactive au cours des 20 dernières années (et zsh pendant encore plus longtemps), vous pouvez donc l'oublier à moins que vous le rencontrer.

La commande env est très rarement utile sauf dans lignes Shebang . Lorsqu'il est invoqué sans arguments, il affiche l'environnement, mais export le fait mieux (trié et souvent cité pour lever l'ambiguïté des nouvelles lignes dans les valeurs des nouvelles lignes qui séparent les valeurs). Lorsqu'elle est invoquée avec des arguments, elle exécute une commande avec des variables d'environnement supplémentaires, mais la même commande sans env fonctionne également (VAR=value mycommand exécute mycommand avec VAR défini sur value, tout comme env VAR=value mycommand). La raison pour laquelle env est utile dans la ligne Shebang est qu'elle effectue une recherche PATH et qu'il ne fait rien d'autre lorsqu'elle est invoquée avec un nom de commande. La commande env peut être utile pour exécuter une commande avec seulement quelques variables d'environnement avec -i, ou sans paramètres pour afficher l'environnement, y compris les variables avec des noms non valides que le shell n'importe pas.

Définition d'une variable comme VAR='asdf' laisse l'environnement non modifié, ce qui signifie que les programmes que vous lancez dans la même session ne savent rien de VAR et ne pourront pas y accéder. Vous souhaitez ce comportement lors de l'écriture de scripts Shell.

export, d'un autre côté, est une commande bash qui modifie l'environnement, rendant ainsi la variable exportée visible pour les processus enfants générés dans la session en cours. Vous pouvez obtenir le même résultat en exécutant VAR='asdf' %program_name%.

env n'est pas un programme intégré, mais un programme en lui-même. En surface, cela fonctionne exactement comme lorsque vous VAR='asdf' %program_name%, mais au niveau inférieur, les choses deviennent un peu plus compliquées. Tout d'abord, le env est lancé. Il modifie l'environnement, puis exécute la commande avec les arguments donnés. Le même comportement que vous pouvez obtenir dans votre propre code en utilisant exec (3) appel système.

setenv est juste export dans les shells de la famille csh, comme indiqué dans votre réponse.

3
user230253
2
Kusalananda