Localisation de la source d'une fonction dans zsh

J'ai ce problème ennuyant dans mon shell zsh où une fonction est déclarée quelque part et que cette fonction s'appelle "cp", de sorte qu'il remplace le comportement cp normal. J'essaie de localiser la déclaration de fonction mais je ne peux pas. J'ai déjà regardé dans les endroits normaux de .zshrc et les diverses autres sources qui sont incluses dans .zshrc mais jusqu'à présent rien.

D'autres choses que j'ai essayé:

  • grep -r 'function cp' . (De ~)
  • whence -f cp (donne la définition de la fonction mais pas d'où elle est déclarée)

Des idées?

Tout d'abord, une fonction peut être définie sans le mot-clé de la function donc une meilleure recherche serait

 grep 'cp()' .* 

Cela recherchera des fichiers tels que .zshrc et .zshrc et autres. Si cela ne trouve rien, vous pouvez également voir les différents fichiers chargés par zsh . Ceux-ci sont répertoriés à la fin de l' man zsh :

 FILES $ZDOTDIR/.zshenv $ZDOTDIR/.zprofile $ZDOTDIR/.zshrc $ZDOTDIR/.zlogin $ZDOTDIR/.zlogout ${TMPPREFIX}* (default is /tmp/zsh*) /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin /etc/zsh/zlogout (installation-specific - /etc is the default) 

Par défaut $ZDOTDIR devrait être votre $HOME . Donc, cette commande devrait trouver votre fichier offensant:

 grep 'cp()\|cp ()' ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin /etc/zsh/zshenv \ /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin 

J'ai ajouté le \| Puisque vous pouvez également avoir des espaces entre le nom de la fonction et la fonction elle-même. Enfin, @Dennis souligne que les parenthèses peuvent également être omises si vous utilisez le mot-clé de function . Donc, pour être encore plus sûr, faites ceci:

 grep -E 'function cp|cp *\(\)' ~/.zshenv ~/.zprofile ~/.zshrc ~/.zlogin \ /etc/zsh/zshenv /etc/zsh/zprofile /etc/zsh/zshrc /etc/zsh/zlogin 

J'avais besoin de le faire aujourd'hui et j'ai trouvé que d' whence -v sort le fichier contenant la définition de la fonction.

 $ whence -v function_name function_name is a shell function from /path/to/file 

La réponse de Terdon vous a déjà donné la commande grep appropriée pour attraper toutes les variantes possibles d'une définition de fonction.

Je veux ajouter deux points supplémentaires.

  1. Pour obtenir une liste de fichiers qui sont réellement lus (par exemple, un fichier non standard peut être fourni par un autre fichier!), Vous pouvez appeler zsh avec l'option SOURCE_TRACE activée:

     $ zsh -o sourcetrace +/etc/zshenv:1> <sourcetrace> +/home/user/.zshrc:1> <sourcetrace> +/home/user/.zcompdump:1> <sourcetrace> +/home/user/.zshrc-last:1> <sourcetrace> 
  2. Avec cette "approche grep", vous n'attirez pas les fonctions qui sont autochargées par l'intermédiaire du autoload automatique. Alors, faites un contrôle de votre fpath aussi:

     $ for i ($fpath) { ls -l "$i"/cp }