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"

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'

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

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}


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

gdzie foobar jest nazwą funkcji.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.