Hay una manera de ver un golpe de la definición de la función en bash?

Por ejemplo, digamos que define la función foobar

function foobar {
    echo "I'm foobar"
}

Hay alguna forma para luego obtener el código que foobar se ejecuta?

$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"
InformationsquelleAutor k107 | 2011-08-02

4 Comentarios

  1. 314

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

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

    Este no se entera de lo que foobar era, y si era definida como una función llama a declare -f como explica pmohandras.

    Para imprimir sólo el cuerpo de la función (es decir, el código) uso sed:

    type foobar | sed '1,3d;$d'
    • Esto no funciona en zsh. declarar -f func funciona en casi todas partes
    • La pregunta pide una fiesta solución.
    • En zsh, sólo tiene que utilizar la que
  2. 177

    Puede mostrar la definición de una función en bash el uso de declarar. Por ejemplo:

    declare -f foobar
    • Grandes, hasta el punto, funciona incluso cuando las funciones definidas en otros cargan archivos de secuencia de comandos. Funciona también en zsh.
    • Trabaja en zsh. Respuesta seleccionada no funciona para mí.
    • Funciona con conchas viejas en sistemas no-linux si utiliza typeset -f
    • google trends: bash, zsh
    • bueno y que sólo demuestra la function definición, así que usted no tiene que analizar si eso es lo que quieres.
  3. 6
    set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

    con foobar ser el nombre de la función.

    • problema: sólo se mostrará hasta el primer «}», que no es todo lo que siempre que la definición contiene las nidadas de » { … }», que de hecho Bash permite.
    • También puede fallar si la función contiene un aquí-doc/aquí-cadena que contiene las llaves patrón
  4. 4
    set | sed -n '/^foobar ()/,/^}/p'

    Básicamente, esto imprime las líneas de tu conjunto de comandos de inicio con el nombre de la función foobar () y terminando con }

Dejar respuesta

Please enter your comment!
Please enter your name here