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
?
cmd
pour ça.
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
?
cmd
pour ça.
Réponses:
À part l' -i
option, qui efface tout l'environnement, POSIX env
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:
env -u ENV_VAR command
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 acceptent env '=value'
, probablement une limitation) encourus par la unsetenv()
fonction C dont POSIX a besoin pour retourner une erreur pour la chaîne vide, alors qu'il n'y a pas de limitation pour putenv()
)).
Portablement (dans les shells POSIX), vous pouvez faire:
(unset -v ENV_VAR; exec command)
(notez qu'avec certains shells, l'utilisation exec
peut changer ce qui command
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 contournerait alias
évidemment l'expansion), comme env
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 et bash
dont le unset
sans -v
pourrait annuler une ENV_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
dont unset
, 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:
perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command
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
:
env -u LANG printf -v var %.3f 1.2 # would run /usr/bin/printf instead
(unset -v LANG; printf -v var %.3f 1.2) # changes to $var lost afterwards
(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'utiliser LC_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:
without() {
local "$1" # $1 variable declared as initially unset in bash¹
shift
"$@"
}
without LANG printf -v var %.3f 1.2
Avec zsh
, vous pouvez également utiliser une fonction anonyme:
(){local ENV_VAR; command}
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 faire local ENV_VAR; unset ENV_VAR
, mais ne le faites pas dans mksh
ou yash
( typeset
au lieu de local
pour celui-ci) car cela ne fonctionnerait pas, le unset
ne ferait qu'annuler le local
.
¹ Gardez également à l'esprit qu'en bash
local, le local ENV_VAR
(même s'il n'est pas défini) conserverait l' attribut d' exportation . Donc, si command
é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 utiliser local +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 sujet bash
).
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:
(unset ENV_VAR; exec command)
(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):
$ export ENV_VAR=foo
$ mycommand
ENV_VAR: foo
$ ENV_VAR=bar mycommand
ENV_VAR: bar
$ ENV_VAR= mycommand
ENV_VAR:
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.