¿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"
k107
fuente

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'
Benjamin Bannier
fuente
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
pmohandas
fuente
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}

Jurgen van der Mark
fuente
4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

con foobar siendo el nombre de la función.

piroscopio
fuente
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