Je peux exécuter ENV_VAR=value command
pour exécuter command
avec une valeur spécifique pour ENV_VAR
. Quel est l'équivalent de désinitialiser ENV_VAR
pour command
?
shell
environment-variables
Alexey Romanov
la source
la source
command
est un choix malheureux d'espaces réservés, car il existe en fait une commande intégrée de ce nom.mycommand
ousomecommand
ou tel pourrait être une meilleure habitude pour entrer.cmd
pour ça.Réponses:
À part l'
-i
option, qui efface tout l'environnement, POSIXenv
ne fournit aucun moyen de supprimer une variable.Cependant, avec quelques
env
implémentations (y compris GNU,busybox
'et FreeBSD au moins), vous pouvez faire:Ce qui fonctionnerait pour supprimer chaque instance d'une
ENV_VAR
variable de l'environnement (notez cependant que cela ne fonctionne pas pour la variable d'environnement avec un nom vide (env -u ''
soit donne une erreur ou est inefficace selon l'implémentation même si tous acceptentenv '=value'
, probablement une limitation) encourus par launsetenv()
fonction C dont POSIX a besoin pour retourner une erreur pour la chaîne vide, alors qu'il n'y a pas de limitation pourputenv()
)).Portablement (dans les shells POSIX), vous pouvez faire:
(notez qu'avec certains shells, l'utilisation
exec
peut changer ce quicommand
est exécuté: exécute celle du système de fichiers au lieu d'une fonction ou d'une fonction intégrée par exemple (et contourneraitalias
évidemment l'expansion), commeenv
ci-dessus. Vous voudriez l'omettre dans ces cas) .Mais cela ne fonctionnera pas pour les variables d'environnement qui ont un nom qui n'est pas mappable à une variable de shell (notez que certains shells comme supprimeraient
mksh
ces variables de l'environnement au démarrage de toute façon), ou les variables qui ont été marquées en lecture seule.-v
est pour le shell Bourne etbash
dont leunset
sans-v
pourrait annuler uneENV_VAR
fonction s'il n'y avait pas de variable de ce nom. La plupart des autres shells ne désactive pas les fonctions sauf si vous passez l'-f
option. (peu susceptible de faire une différence dans la pratique).(Méfiez-vous également du bogue / anomalie de
bash
/mksh
/yash
dontunset
, dans certaines circonstances, ne peut pas désactiver la variable, mais révéler la variable dans une portée externe )Si
perl
est disponible, vous pouvez faire:Ce qui fonctionnera même pour la variable d'environnement avec un nom vide.
Maintenant, tout cela ne fonctionnera pas si vous voulez changer une variable d'environnement pour une fonction intégrée ou une fonction et que vous ne voulez pas qu'elles s'exécutent dans un sous-shell, comme dans
bash
:(Ici, la définition de LANG comme une approche erronée pour s'assurer
.
est utilisée et comprise comme le séparateur décimal. Il serait préférable d'utiliserLC_ALL=C printf...
pour cela)Avec certains shells, vous pouvez à la place créer une portée locale pour la variable à l'aide d'une fonction:
Avec
zsh
, vous pouvez également utiliser une fonction anonyme:Cette approche ne fonctionnera pas dans certains shells (comme ceux basés sur le shell Almquist), dont
local
ne déclarent pas la variable comme initialement non définie (mais héritent de la valeur et des attributs). Dans ceux-ci, vous pouvez le fairelocal ENV_VAR; unset ENV_VAR
, mais ne le faites pas dansmksh
ouyash
(typeset
au lieu delocal
pour celui-ci) car cela ne fonctionnerait pas, leunset
ne ferait qu'annuler lelocal
.¹ Gardez également à l'esprit qu'en
bash
local, le localENV_VAR
(même s'il n'est pas défini) conserverait l' attribut d' exportation . Donc, sicommand
était une fonction qui affecte une valeur àENV_VAR
, la variable serait disponible dans l'environnement des commandes appelées par la suite.unset ENV_VAR
effacerait cet attribut. Ou vous pouvez utiliserlocal +x ENV_VAR
ce qui garantirait également une table rase (sauf si cette variable a été déclarée en lecture seule, mais il n'y a rien que vous puissiez faire à ce sujetbash
).la source
env '=foo' python -c 'import os; print os.environ[""]'
. Je ne pense pas que beaucoup de gens voudraient définir une variable comme ça.Il n'y a pas d'équivalent direct pour autant que je sache; vous pouvez utiliser un sous-shell:
la source
(unset ENV_VAR; exec somecommand)
si vous voulez être équivalent à l'original en efficacité (en consommant le sous-shell). En l'état, cela ajoute une fourchette supplémentaire.command
c'est la dernière commande de l'invocation du sous-shell.env -u
.Vous pouvez utiliser
ENV_VAR= command
Cela ne désactive pas réellement la variable, mais cela peut être utile dans de nombreux cas (les scripts shell utilisent généralement juste
test -n
pour vérifier si une variable est définie):la source