Encontrar la definición de una función bash

41

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?

metáfora pitónica
fuente

Respuestas:

39

Para obtener la definición de la función:

type -a function_name
Pausado hasta nuevo aviso.
fuente
@iconoclasta: sí.
Pausado hasta nuevo aviso.
Si alguna vez en Grand Rapids Te compraré uno en persona ... de lo contrario podemos encontrar alguna otra manera ...
iconoclasta
whence -f function_nameenzsh
dezza
66

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 .

# Turn on extended shell debugging
shopt -s extdebug

# Dump the function's name, line number and fully qualified source file  
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

En mi caso, la salida de estos comandos es:

foo 32 /source/private/main/developer/cue.pub.sh
Pelo del perro
fuente
3
Perfecto. Acabo de convertir esto en una función bash en mi archivo bashrc. whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
Neil
55
@Neil: Eso es útil, gracias: permítame sugerirle que use un subshell para localizar el efecto shoptsin cambiar el estado actual del shell: whichfunc () ( shopt -s extdebug; declare -F "$1"; )(tenga en cuenta el uso de en (...)lugar de {...}).
mklement0
¿Por qué esos comandos no funcionan desde un script? la función funciona correctamente
albfan
1
Esta debería ser la respuesta aceptada.
disuelto el
11

Para ver la definición de la función (en lugar de su origen), use:

declare -f <functionname>
Joshua Goldberg
fuente
Creo que este es mejor que type -aporque no imprime la primera línea dependiente de la ubicación molesta ~~
yuyichao
1
pero dado que no hay una ubicación dada, esta es una respuesta a una pregunta no formulada, al menos no formulada aquí
iconoclasta el
6

bash -xvolcará 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.

Ignacio Vazquez-Abrams
fuente
Cosas prácticas; para capturar la traza en un archivo, use script out.txt bash -x(nuevamente, no se olvide de exit).
mklement0
-2

Otra forma, que me parece aún más simple últimamente:

  which <functionname>

(esto también mostrará si es un alias o un script, pero no rastreará la fuente de un alias)

Joshua Goldberg
fuente
2
No creo que whichbrinde información sobre alias en BSD o mac. Además, esta pregunta trata sobre funciones y whichno proporciona información sobre funciones.
dbn
Gracias por esa nota Ahora veo que "which" solo resuelve funciones en zsh, no bash.
Joshua Goldberg
2
Creo que es probable que esta respuesta invite a votos negativos ... no parece abordar la pregunta en absoluto, ya que no hay información sobre la ubicación.
iconoclasta
Lo he encontrado útil con el propósito de rastrear la declaración para usar esto y averiguar si es un alias o una función, y para saber la sintaxis con la que se declaró. Sin embargo, es cierto que solo la respuesta de @ HairOfTheDog proporciona el archivo directamente.
Joshua Goldberg