2011-08-02 9 views
181

¿Hay alguna forma de ver la definición de una función bash en bash?¿Puede bash mostrar la definición de una función?

Por ejemplo, digamos que define la función foobar

function foobar { 
    echo "I'm foobar" 
} 

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

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

Respuesta

240

Use type. Si foobar es, por ejemplo, define en su ~/.profile:

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

Esto averiguar qué era foobar, y si se define como una función que llama declare -f según ha explicado pmohandras.

+1

Esto no funciona en zsh. declare -f func funciona prácticamente en todas partes – sjsupersumit

127

Puede visualizar la definición de una función en bash utilizando declare. Por ejemplo:

declare -f foobar 
+0

Grandes, hasta el punto, funciona incluso cuando las funciones definidas en otros archivos de comandos cargados. Funciona también en zsh. –

+1

Funciona en zsh. La respuesta seleccionada no funciona para mí. – Bijan

+1

Funciona con shells antiguos en sistemas que no son de Linux si usa 'typeset -f' – Emmanuel

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

con foobar como el nombre de la función.

+4

problema: solo se mostrará hasta el primer "}", que no es todo cuando la definición contiene anidamientos de "{...}" que de hecho Bash sí permite. –

+1

También puede fallar si la función contiene un here-doc/here-string que contiene el patrón de llavero – Cheetah

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

Esto básicamente imprime las líneas de su mandato set empezando por el nombre de la función foobar() y terminando con}

Cuestiones relacionadas