Récemment, jai remarqué que nous avions 3 options pour définir les variables denvironnement:
-
export envVar1=1
-
setenv envVar2=2
-
env envVAr3=3
Sil y a dautres moyens, veuillez nous éclairer.
Quand devrais-je préférer lun à lautre? Veuillez suggérer des directives.
Quant à la compatibilité du shell, quelle est la plus étendue (couvre plus de dialectes shell)?
Jai déjà remarqué ceci réponse mais je souhaite développer la question avec env
et les règles de préférence dutilisation.
Réponse
export VARIABLE_NAME="some value"
est le moyen de définir une variable denvironnement dans nimporte quel shell compatible POSIX (sh
, dash
, bash
, ksh
, etc.; également zsh). Si la variable a déjà une valeur, vous pouvez utiliser export VARIABLE_NAME
pour en faire une variable denvironnement sans changer sa valeur.
Pré-POSIX Bourne shells ne le supportait pas, cest pourquoi vous » verrez des scripts qui évitent export VARIABLE_NAME="some value"
et utilisent VARIABLE_NAME="some value"; export VARIABLE_NAME
à la place. Mais les shells Bourne pré-POSIX sont extrêmement rares de nos jours.
setenv VARIABLE_NAME="some value"
est la syntaxe csh pour définir une variable denvironnement. setenv
nexiste 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 pour encore plus longtemps), donc vous pouvez loublier à moins vous le rencontrez.
La commande env
est très rarement utile sauf dans les lignes shebang . Lorsquil est invoqué sans argument, il affiche lenvironnement, mais export
le fait mieux (trié et souvent cité pour lever lambiguïa les nouvelles lignes dans les valeurs des nouvelles lignes qui séparent les valeurs). Lorsquil est invoqué avec des arguments, il exécute une commande avec des variables denvironnement 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 quil effectue une recherche PATH
, et quil ne fait rien dautre lorsquil est appelé avec une commande Nom. La commande env
peut être utile pour exécuter une commande avec seulement quelques variables denvironnement avec -i
, ou sans paramètres pour afficher lenvironnement y compris les variables avec des noms non valides que le shell nimporte pas.
Réponse
Définition dune variable comme VAR="asdf"
laisse lenvironnement inchangé, ce qui signifie que les programmes que vous lancez dans la même session ne sauront rien de VAR
et ne pourront pas y accéder. Vous voulez ce comportement lors de lécriture de scripts shell .
export
, dautre part, est un bash intégré qui modifie lenvironnement rendant ainsi la variable exportée visible pour les processus enfants générés dans la session en cours. Vous peut réaliser la même chose en exécutant VAR="asdf" %program_name%
.
env
nest pas un programme intégré, mais un programme en lui-même. la surface il fonctionne exactement comme lorsque vous VAR="asdf" %program_name%
, mais au niveau inférieur, les choses se compliquent un peu. Tout dabord, le env
est lancé. Il modifie lenvironnement, puis exécute la commande avec des arguments donnés. Le même comportement que vous pouvez obtenir dans votre propre code en utilisant lappel système exec (3) .
setenv
est juste export
dans les shells de la famille csh, comme indiqué dans votre réponse.
Commentaires
Réponse
Il y a plusieurs questions avec des réponses qui répondent à ceci:
-
Différence entre les variables shell qui sont exportées et celles qui ne sont pas dans bash
-
Quelle est la différence dutilisation entre les variables shell et les variables denvironnement?
-
Quest-ce que ' est la différence entre " export " et " setenv "?
(etc.)
VAR=asdf
met à jour lenvironnement siVAR
était déjà dans lenvironnement. (Ce nétait pas ' t vrai dans le shell Bourne dorigine.)