Localizar la fuente de una función en zsh

Localizar la fuente de una función en zsh

Tengo este problema molesto en mi shell zsh donde se declara una función en algún lugar y esa función se llama "cp", por lo que anula el comportamiento normal de cp. Estoy intentando localizar la declaración de la función pero no puedo. Ya busqué en los lugares normales de .zshrc y en las otras fuentes que se incluyen en .zshrc, pero hasta ahora nada.

Otras cosas que he probado:

  • grep -r 'function cp' .(de ~)
  • whence -f cp(da la definición de la función pero no desde dónde se declara)

¿Algunas ideas?

Respuesta1

En primer lugar, se puede definir una función sin la functionpalabra clave, por lo que sería mejor realizar una búsqueda.

grep 'cp()' .*

Eso buscará en archivos como .zshrcy .profiley otras cosas. Si no encuentra nada, es posible que también desee ver los distintos archivos cargados por zsh. Estos se enumeran al final de 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)

Por defecto $ZDOTDIRdebería ser tu $HOME. Entonces, este comando debería encontrar su archivo ofensivo:

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

Agregué el \|ya que también puedes tener espacios entre el nombre de la función y la función misma. Finalmente,@Dennis señalaque los paréntesis también se pueden omitir si utiliza la functionpalabra clave. Entonces, para estar aún más seguro, haz esto:

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

Respuesta2

Necesitaba hacer esto hoy y descubrí que whence -vgenera el archivo que contiene la definición de la función.

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

Respuesta3

Versiones más nuevas de zsh (desde 5.4, agregadas en la confirmación34f70c5) admite la $functions_sourcematriz como parte del zsh/parametermódulo (documentación: man zshmodules):

functions_source

Esta matriz asociativa de solo lectura asigna nombres de funciones habilitadas al nombre del archivo que contiene la fuente de la función.

Para una función cargada automáticamente que ya se ha cargado, o marcado para carga automática con una ruta absoluta, o cuya ruta se resolvió con " functions -r", este es el archivo encontrado para carga automática, resuelto en una ruta absoluta.

Para una función definida dentro del cuerpo de un script o archivo fuente, este es el nombre de ese archivo. En este caso, esta es la ruta exacta utilizada originalmente para ese archivo, que puede ser una ruta relativa.

Para cualquier otra función, incluida cualquiera definida en un mensaje interactivo o una función de carga automática cuya ruta aún no se haya resuelto, esta es la cadena vacía. Sin embargo, el elemento hash se informa como definido siempre que la función esté presente: las claves de este hash son las mismas que las de $functions.

Entonces, puedes hacer

echo $functions_source[cp]

Respuesta4

La respuesta de Terdon.Ya le di el grepcomando apropiado para capturar todas las variantes posibles de una definición de función.

Quiero agregar dos puntos más.

  1. Para obtener una lista de archivos, que sonde hecholeído (por ejemplo, un archivo no estándar puede tener como origen otro archivo), puede invocarlo zshcon la SOURCE_TRACEopción habilitada:

    $ 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 este "enfoque grep" no detectará funciones que esténcargado automáticamentea través del autoloadincorporado. Entonces, revisa tu fpathtambién:

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

información relacionada