Comment désactiver ou supprimer une fonction bash?

33

Si vous définissez ou exportez une variable d'environnement dans bash, vous pouvez la désactiver . Si vous définissez un alias dans bash, vous pouvez le dé-alias . Mais il ne semble pas y avoir de dysfonctionnement .

Considérez cette fonction bash (triviale), par exemple, définie dans un fichier .bash_aliases et lue à l'initialisation du shell.

function foo () { echo "bar" ; }

Comment puis-je effacer cette définition de fonction de mon shell actuel?
(La modification des fichiers d'initialisation ou le redémarrage du shell ne compte pas.)

Quack Quichotte
la source
Tout cela étant dit, ce unfunctionserait un joli nom pour une commande :-)
Joey
@Johannes Rössel: zsh l' a.
Chris Johnsen
Hm, en effet. Pourtant, je trouve la façon de PowerShell de gérer tout cela un peu plus intuitif et cohérent :-)
Joey

Réponses:

50

La commande intégrée unset prend une option -f,, pour supprimer des fonctions:

unset -f foo

Formez l' entrée non définie dans la page de manuel bash :

Si -f est spécifié, chaque nom fait référence à une fonction shell et la définition de la fonction est supprimée.

Remarque: -fn'est vraiment nécessaire que si une variable du même nom existe. Si vous ne disposez pas également d'une variable nommée foo, unset foola fonction sera supprimée.

Chris Johnsen
la source
c'est ce qui me manquait. j'avais trouvé le -fparamètre dans l' exportation mais je ne l' avais pas trouvé dans unset . Merci.
Quack Quichote
2
@XavierStuvw: unsetn'est pas une commande externe, elle fait partie du shell ( bash dans ce cas); essayez de man bashtrouver l'entrée pour unset(la gestion est assez grande, se unsettrouve sous la Shell Builtin Commandssection).
Chris Johnsen
4

Voir help unset:

unset: unset [-f] [-v] [-n] [name ...]

Unset values and attributes of shell variables and functions.

For each NAME, remove the corresponding variable or function.

Options:
  -f    treat each NAME as a shell function
  -v    treat each NAME as a shell variable
  -n    treat each NAME as a name reference and unset the variable itself
    rather than the variable it references

Without options, unset first tries to unset a variable, and if that fails,
tries to unset a function.

Some variables cannot be unset; also see `readonly'.

Exit Status:
Returns success unless an invalid option is given or a NAME is read-only.

Il n'y a ni unset --helpni man unsetmalheureusement.

XavierStuvw
la source
4
Il n'y a pas man unsetparce qu'il est un construit en commande et pour le haut- commandes il y a la place help. Pour certaines commandes intégrées, il existe également un exécutable externe. En cas de doute, essayez par exemple type mycommnad. Par exemple type unsetet il vous répondra unset is a shell builtin. Si vous voulez savoir s'il existe, l'exécutable aussi essayez which echo(un autre buikt-in) et il dira où il se trouve. Le --option_longest typique de la commande exécutable. Essayez echo --helpet /bin/echo --help. :-).
Hastur
@Hastur N'hésitez pas à ajouter votre commentaire à la réponse en modifiant sa queue. Si les examinateurs l'approuvent, vous recevrez 2 points.
XavierStuvw
1
... merci pour la pensée Xavier: c'était plus pour toi que pour compléter la réponse; Je suppose que vous avez manqué que c'était une commande intégrée et pour eux, vous devez utiliser à la helpplace de man. (Pas vraiment vrai car vous les trouvez man bashdans le chapitre COMMANDES DE SHELL BUILTIN ou directement avec man BASH-BUILTINS...). Il est confortable que sous un shell bash, vous pouvez simplement demander helpet vous recevrez la liste des commandes intégrées:-) . (Essayez help helpet man manaussi).
Hastur
1
@Hastur Vous pouvez très bien compléter la réponse au profit de tous les lecteurs. Ensuite, nous pouvons supprimer les commentaires pour éliminer le fouillis des petits caractères.
XavierStuvw
0

J'ai récemment voulu le désinstaller nvmet le réinstaller complètement , et me débarrasser de n'importe lequel de ses environnements. Il s'avère que s'en débarrasser ne semble pas, car une grande partie nvmest en partie implémentée comme une cargaison de fonctions de shell qui proviennent de votre shell via .bash_profileou .bashrc, ou partout où vous avez ajouté les commandes de sourcing auxquelles il vous a dit lors de la première installation.

Déconcerté au début en which nvmne renvoyant rien encore clairement la nvmcommande et d'autres étaient toujours en cours de recherche, j'ai finalement découvert via declare -Fque c'était un tas de fonctions shell. Je ne voulais pas simplement tuer le shell et en commencer un nouveau (pour des raisons non pertinentes ici), j'ai donc effacé les nvmfonctions de ce shell avec ceci:

for F in `declare -F | grep -e nvm | cut -f 3 -d\ `; do unset -f $F; done

Certaines variations à ce sujet pourraient être utiles à quelqu'un qui, pour une raison quelconque, veut faire quelque chose de similaire et ne peut pas redémarrer un nouveau shell ou ne veut pas.

slowkoni
la source