web-dev-qa-db-fra.com

Comment afficher la définition de la fonction zsh (comme bash "type myfunc")?

Comment afficher la définition d'une fonction en zsh? type foo ne donne pas la définition.

En bash:

bash$ function foo() { echo hello; }

bash$ foo
hello

bash$ type foo
foo is a function
foo () 
{ 
    echo hello
}

En zsh:

zsh$ function foo() { echo hello; }

zsh$ foo
hello

zsh$ type foo
foo is a Shell function
61
Rob Bednark

L'idiome zsh est whence, le -f le drapeau imprime les définitions des fonctions:

zsh$ whence -f foo
foo () {
    echo hello
}
zsh$

Dans zsh, type est défini comme équivalent à whence -v, vous pouvez donc continuer à utiliser type, mais vous devrez utiliser le -f argument:

zsh$ type -f foo
foo () {
    echo hello
}
zsh$

Et, enfin, dans zsh which est défini comme équivalent à whence -c - affiche les résultats au format semblable à csh, donc which foo donnera les mêmes résultats.

man zshbuiltins pour tout cela.

69
pb2q

J'ai toujours utilisé which pour cela.

17
Thor

tl; dr

declare -f foo  # works in zsh and bash

typeset -f foo  # works in zsh, bash, and ksh

type -f/whence -f/which sont sous-optimales dans ce cas, car leur but est de signaler le formulaire de commande avec la priorité la plus élevée qui se trouve être défini par ce name (sauf si vous spécifiez également -a, auquel cas tous les formulaires de commande sont signalés) - par opposition à un rapport spécifique sur l'opérande en tant que fonction .

L'option -f Ne change pas cela - elle inclut uniquement les fonctions Shell dans la recherche.

Les alias et les mots clés Shell ont une priorité plus élevée que les fonctions Shell, donc, dans le cas présent, si un alias foo était également défini, type -f foo Indiquerait la définition de l'alias .

Notez que zsh développe les alias dans les scripts par défaut (tout comme ksh, mais pas bash), et même si vous désactivez d'abord l'expansion d'alias, type -f/whence -f/which toujours signalent d'abord les alias.

9
mklement0

Si vous n'êtes pas sûr de ce que vous recherchez, vous pouvez taper

functions

et il vous montrera toutes les fonctions définies.

Notez qu'il y en a parfois BEAUCOUP, donc vous voudrez peut-être diriger vers un programme de pagination:

functions | less

pour annuler la définition d'une fonction, utilisez

unfunction functionname
6
Dan Pritts