Quelle est la différence entre env, setenv, export et quand lutiliser?

Récemment, jai remarqué que nous avions 3 options pour définir les variables denvironnement:

  1. export envVar1=1
  2. setenv envVar2=2
  3. 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

  • Dans les shells modernes, VAR=asdf met à jour lenvironnement si VAR était déjà dans lenvironnement. (Ce nétait pas ' t vrai dans le shell Bourne dorigine.)

Réponse

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *