effacer toutes les variables sans fermer le terminal

10

Je veux savoir comment effacer toutes les variables que j'ai définies dans l'invite de commande sans fermer le terminal?

par exemple, si je définis une variable dans l'invite de commande comme:

$ a=1

maintenant je veux supprimer la variable $a(et de nombreuses autres variables définies de manière similaire) sans fermer le terminal. Je pourrais l'utiliser unsetmais ce sera mouvementé s'il n'y en a pas grand. de variables

Edward Torvalds
la source
2
exec "$0"peut-être - mais il est difficile de dire ce que vous entendez par global .
mikeserv
3
Pourquoi est ce que tu veux faire ça?
Hauke ​​Laging
1
@HaukeLaging Je travaille avec des tableaux en utilisant un script. J'y ajoute parfois un élément. à cause de cela, je ne peux pas exécuter le script avec les anciennes valeurs (puisque le tableau est modifié). je dois fermer le terminal et recommencer une nouvelle session. J'espère avoir précisé. sinon, faites le moi savoir :)
Edward Torvalds
1
@muru - il obtient une liste enregistrée dans un $varavec var=$(declare -p +F);puis le transmet comme argument à une fonction qui le fait. echo "${2%%=*}".Cette réponse a quelques problèmes avec la taille - mais cela devrait fonctionner si votre environnement n'est pas énorme.
mikeserv
3
Je n'ai aucune idée de ce que tu essaies de faire. Parlez-vous d'un shell interactif ou d'un script? Les variables définies dans un script exécuté à partir d'un shell interactif n'affectent pas le shell parent. Dites-nous ce que vous voulez réaliser, et non l'impasse que vous recherchez .
Gilles 'SO- arrête d'être méchant'

Réponses:

9

Si vous le faites (GNU coreutils)

exec env --ignore-environment /bin/bash

vous utiliserez un nouvel environnement

Gilles Quenot
la source
qu'en est-il exec "$0"?
Edward Torvalds
@edwardtorvalds $0est l'argument zéro pour un shell exécuté. Donc, si vous exécutez bash $0est bash (probablement - cela pourrait être -bashdans un -lcas de shell ogin selon la version) . Si vous exécutez un script avec une #!/bin/bashbangline, $0c'est le chemin d'accès au script. exec "$0"est probablement plus flexible, mais exec bashest plus explicite. Si vous entrez cette commande sur un terminal, vous devez bashreconnaître qu'elle se trouve dans un environnement interactif et faire l'équivalent de bash -i- qui permettra également d' ~/.bashrcexécuter votre fichier.
mikeserv
Cela n'aide pas export a=123, cette variable est héritée ...
stimur
1

Vous pouvez utiliser env, qui est fourni par GNU coreutils (généralement préinstallé sur les systèmes GNU / Linux):

exec env --ignore-environment /bin/bash

L'appel système exec est fait pour que votre processus actuel soit remplacé sur place par la nouvelle version sans environnement de votre shell.

Cela a l'avantage de supprimer également toutes les variables d'environnement exportées .

user30747
la source
Mais cela effacerait ma variable PATH modifiée, par exemple export PATH=$PATH:~/foo, non?
Edward Torvalds
Tu as raison. J'ai modifié ma réponse pour que le chemin absolu du shell soit utilisé au lieu de $ 0.
user30747
Merci à user30747, a volé votre réponse pour corriger la mienne. Impossible de supprimer la réponse acceptée
Gilles Quenot