Czy bash może pokazać definicję funkcji?

262

Czy istnieje sposób na wyświetlenie definicji funkcji bash w bash?

Powiedzmy na przykład, że zdefiniowałem funkcję foobar

function foobar {
    echo "I'm foobar"
}

Czy jest jakiś sposób, aby później uzyskać działający kod foobar?

$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"
k107
źródło

Odpowiedzi:

357

Zastosowanie type. Jeśli foobarjest np. Zdefiniowany w twoim ~/.profile:

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

To dowiaduje się, co foobarbyło, a jeśli zostało zdefiniowane jako funkcja, wywołuje declare -fjak wyjaśniono w pmohandras.

Aby wydrukować tylko treść funkcji (tj. Kod), użyj sed:

type foobar | sed '1,3d;$d'
Benjamin Bannier
źródło
2
@sjsupersumit Pytanie wyraźnie dotyczy rozwiązania Bash.
bfontaine
210

Możesz wyświetlić definicję funkcji w bash za pomocą deklaracji. Na przykład:

declare -f foobar
pmohandas
źródło
1
Świetnie, do rzeczy, działa nawet wtedy, gdy funkcje zdefiniowane w innych załadowanych plikach skryptów. Działa również w Zsh.
Diego Nemo
2
Działa ze starymi powłokami w systemach innych niż Linux, jeśli go używasztypeset -f
Emmanuel
Dobrze, że pokazuje tylko functiondefinicję, więc nie musisz analizować, jeśli tego chcesz.
ribamar
5
set | sed -n '/^foobar ()/,/^}/p'

To w zasadzie wypisuje linie z polecenia set zaczynając od nazwy funkcji foobar () i kończąc na}

Jurgen van der Mark
źródło
4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

gdzie foobar jest nazwą funkcji.

piroskop
źródło
4
problem: wyświetli się tylko do pierwszego „}”, co nie jest wszystkim, ilekroć definicja zawiera zagnieżdżenie „{...}”, na co rzeczywiście pozwala Bash.
Destiny Architect
1
Może również zawieść, jeśli funkcja zawiera ciąg tutaj-doc / tutaj zawierający wzór nawiasów klamrowych
Cheetah