Individuazione dell'origine di una function in zsh

Ho questo problema fastidioso nel mio shell di zsh where una function viene dichiarata da qualche parte e quella function viene chiamata "cp", quindi è superata il comportmento normale di cp. Sto cercando di individuare la dichiarazione di function ma non posso. Ho già guardato nei luoghi normali di .zshrc e le varie altre fonti che sono state incluse in .zshrc ma finora nulla.

Altre cose che ho provato:

  • grep -r 'function cp' . (da ~)
  • whence -f cp (fornisce la definizione delle funzioni, ma non where viene dichiarata da)

Qualche idea?

Prima di tutto, una function può essere definita senza la parola chiave function modo da una ricerca migliore sarebbe

 grep 'cp()' .* 

Che cercherà attraverso file come .zshrc e .profile e whatnot. Se ciò non trova niente, puoi anche vedere i vari file caricati da zsh . Questi sono elencati alla fine 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) 

Per impostazione predefinita $ZDOTDIR dovrebbe essere il tuo $HOME . Quindi, questo command dovrebbe trovare il tuo file offensivo:

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

Ho aggiunto il \| poiché è ansible anche avere spazi tra il nome della function e la function stessa. Infine, @Dennis rileva che le parentesi possono essere omesse se si utilizza la parola chiave function . Quindi, per essere ancora più sicuro, fai questo:

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

Ho dovuto farlo oggi e ho scoperto che whence -v esegue il file che contiene la definizione delle funzioni.

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

La risposta di Terdon ti ha già dato il command grep appropriato per catturare tutte le possibili varianti di una definizione delle funzioni.

Voglio aggiungere altri due punti.

  1. Per get un elenco di file che sono effettivamente letti (ad esempio un file non standard può essere proveniente da un altro file!), È ansible ricall zsh con l'opzione SOURCE_TRACE abilitata:

     $ zsh -o sourcetrace +/etc/zshenv:1> <sourcetrace> +/home/user/.zshrc:1> <sourcetrace> +/home/user/.zcompdump:1> <sourcetrace> +/home/user/.zshrc-last:1> <sourcetrace> 
  2. Con questo "approccio grep" non potrai catturare funzioni che vengono caricate automaticamente tramite il built-in autoload . Quindi, fare un controllo del tuo fpath :

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