Trabajo en un entorno que tiene mucha magia de script de shell heredado. Una cosa que se usa mucho desde la línea de comandos son las funciones bash que se obtienen de algún archivo incluido de algún archivo incluido de algún archivo ... incluido en mi .bash_profile. ¿Hay alguna manera de obtener la definición o incluso mejor la ubicación de la definición de estas funciones sin rastrearlas a través de 5 niveles de incluye?
41
whence -f function_name
enzsh
Suponiendo que tiene una función llamada foo, los comandos a continuación obtendrán la ubicación de la definición de la función, es decir, obtendrá el nombre del archivo en el que se define la función, así como el número de línea en la que se define la función dentro de ese archivo .
En mi caso, la salida de estos comandos es:
fuente
whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
shopt
sin cambiar el estado actual del shell:whichfunc () ( shopt -s extdebug; declare -F "$1"; )
(tenga en cuenta el uso de en(...)
lugar de{...}
).Para ver la definición de la función (en lugar de su origen), use:
fuente
type -a
porque no imprime la primera línea dependiente de la ubicación molesta ~~bash -x
volcará lo que bash se está ejecutando cuando se inicia, lo que debería permitirle rastrearlo más fácilmente. No olvides salir del shell recién abierto.fuente
script out.txt bash -x
(nuevamente, no se olvide deexit
).Otra forma, que me parece aún más simple últimamente:
(esto también mostrará si es un alias o un script, pero no rastreará la fuente de un alias)
fuente
which
brinde información sobre alias en BSD o mac. Además, esta pregunta trata sobre funciones ywhich
no proporciona información sobre funciones.