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?

Respuestas:



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

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>

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.


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)


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.