¿Puede bash mostrar la definición de una función?


262

¿Hay alguna manera de ver la definición de una función bash en bash?

Por ejemplo, digamos que definí la función foobar

function foobar {
    echo "I'm foobar"
}

¿Hay alguna manera de obtener más tarde el código que se foobarejecuta?

$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"

Respuestas:


357

Uso type. Si, foobarpor ejemplo, está definido en su ~/.profile:

$ type foobar
foobar is a function
foobar {
    echo "I'm foobar"
}

Esto descubre lo que foobarera, y si se definió como una función, se llama declare -fsegún lo explicado por los almohades.

Para imprimir solo el cuerpo de la función (es decir, el código) use sed:

type foobar | sed '1,3d;$d'

2
@sjsupersumit La pregunta pide explícitamente una solución Bash.
bfontaine

210

Puede mostrar la definición de una función en bash usando declare. Por ejemplo:

declare -f foobar

1
Genial, hasta el punto, funciona incluso cuando las funciones se definen en otros archivos de script cargados. Funciona también en zsh.
Diego Nemo

2
Funciona con shells antiguos en sistemas que no sean Linux si lo usatypeset -f
Emmanuel

bueno también que solo muestra la functiondefinición, por lo que no tiene que analizar si eso es lo que quiere.
ribamar

5
set | sed -n '/^foobar ()/,/^}/p'

Básicamente, esto imprime las líneas de su comando set comenzando con el nombre de la función foobar () y terminando con}


4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

con foobar siendo el nombre de la función.


44
problema: solo se mostrará hasta el primer "}", que no es todo siempre que la definición contenga anidaciones de "{...}" que, de hecho, Bash sí permite.
Destiny Architect

1
También puede fallar si la función contiene un here-doc / here-string que contiene el patrón de llaves
Cheetah
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.