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 function
palabra clave, por lo que sería mejor realizar una búsqueda.
grep 'cp()' .*
Eso buscará en archivos como .zshrc
y .profile
y 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 $ZDOTDIR
deberí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 function
palabra 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 -v
genera 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_source
matriz como parte del zsh/parameter
mó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 grep
comando apropiado para capturar todas las variantes posibles de una definición de función.
Quiero agregar dos puntos más.
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
zsh
con laSOURCE_TRACE
opció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>
Con este "enfoque grep" no detectará funciones que esténcargado automáticamentea través del
autoload
incorporado. Entonces, revisa tufpath
también:$ for i ($fpath) { ls -l "$i"/cp }