Récemment, j'ai remarqué que nous avons 3 options pour définir les variables d'environnement:
export envVar1=1
setenv envVar2=2
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.
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.
Il y a plusieurs questions avec des réponses qui répondent à ceci:
Différence entre les variables Shell exportées et celles qui ne sont pas en bash
Quelle est la différence d'utilisation entre les variables Shell et les variables d'environnement?
(etc.)