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"

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'

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

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}


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

wobei foobar der Funktionsname ist.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.