Kann bash die Definition einer Funktion anzeigen?

262

Gibt es eine Möglichkeit, die Definition einer Bash-Funktion in Bash anzuzeigen?

Angenommen, ich habe die Funktion definiert foobar

function foobar {
    echo "I'm foobar"
}

Gibt es eine Möglichkeit, den ausgeführten Code später abzurufen foobar?

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

Antworten:

357

Verwenden Sie type. Wenn foobarzB in Ihrem definiert ist ~/.profile:

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

Dies findet heraus, was foobarwar, und wenn es als eine Funktion definiert wurde, ruft es auf, declare -fwie von pmohandras erklärt.

Um nur den Hauptteil der Funktion (dh den Code) auszudrucken, verwenden Sie sed:

type foobar | sed '1,3d;$d'
Benjamin Bannier
quelle
2
@sjsupersumit Die Frage fragt explizit nach einer Bash-Lösung.
Bfontaine
210

Sie können die Definition einer Funktion in bash mit declare anzeigen. Beispielsweise:

declare -f foobar
pmohandas
quelle
1
Auf den Punkt gebracht funktioniert es auch dann, wenn Funktionen in anderen geladenen Skriptdateien definiert sind. Funktioniert auch in zsh.
Diego Nemo
2
Funktioniert mit alten Shells auf Nicht-Linux-Systemen, wenn Sietypeset -f
Emmanuel
Gut auch, dass es nur die functionDefinition zeigt , so dass Sie nicht analysieren müssen, wenn Sie das wollen.
Ribamar
5
set | sed -n '/^foobar ()/,/^}/p'

Dies druckt im Grunde die Zeilen aus Ihrem Befehl set, beginnend mit dem Funktionsnamen foobar () und endend mit}

Jürgen van der Mark
quelle
4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

wobei foobar der Funktionsname ist.

Pyroskop
quelle
4
Problem: Wird nur bis zum ersten "}" angezeigt, was nicht alles ist, wenn die Definition Verschachtelungen von "{...}" enthält, die Bash tatsächlich zulässt.
Destiny Architect
1
Kann auch fehlschlagen, wenn die Funktion einen Here-Doc / Here-String enthält, der das geschweifte
Cheetah