Finden der Definition einer Bash-Funktion

41

Ich arbeite in einer Umgebung, in der viel Legacy-Shell-Script-Magie herumliegt. Eine Sache, die in der Befehlszeile häufig verwendet wird, sind Bash-Funktionen, die aus einer Datei stammen, die aus einer Datei stammt, die aus einer Datei stammt, die in meinem .bash_profile enthalten ist. Gibt es eine Möglichkeit, die Definition oder noch besser die Position der Definition dieser Funktionen zu ermitteln, ohne sie durch 5 Ebenen von Includes aufzuspüren?

pythonische Metapher
quelle

Antworten:

39

So rufen Sie die Funktionsdefinition ab:

type -a function_name
Bis auf weiteres angehalten.
quelle
@iconoclast: Ja.
Bis auf weiteres angehalten.
Wenn Sie jemals in Grand Rapids sind, kaufe ich Ihnen persönlich einen ... ansonsten können wir einen anderen Weg finden ...
iconoclast
whence -f function_nameinzsh
dezza
66

Angenommen, Sie haben eine Funktion mit dem Namen foo. Die folgenden Befehle ermitteln den Speicherort der Funktionsdefinition, dh den Namen der Datei, in der die Funktion definiert ist, sowie die Zeilennummer, in der die Funktion in dieser Datei definiert ist .

# Turn on extended shell debugging
shopt -s extdebug

# Dump the function's name, line number and fully qualified source file  
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

In meinem Fall ist die Ausgabe dieser Befehle:

foo 32 /source/private/main/developer/cue.pub.sh
Hundehaare
quelle
3
Perfekt. Ich habe dies gerade zu einer Bash-Funktion in meiner Bash-Datei gemacht. whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
Neil
5
@Neil: Das ist praktisch, danke: Lassen Sie mich vorschlagen, eine Subshell zu verwenden, um den Effekt zu lokalisieren, shoptohne den aktuellen Shell-Status zu ändern: whichfunc () ( shopt -s extdebug; declare -F "$1"; )(Beachten Sie die Verwendung von (...)anstelle von {...}).
mklement0
Warum funktionieren diese Befehle nicht in einem Skript? funktion funktioniert
einwandfrei
1
Dies sollte die akzeptierte Antwort sein.
aufgelöst
11

Verwenden Sie zum Anzeigen der Definition der Funktion (im Gegensatz zu ihrer Herkunft) Folgendes:

declare -f <functionname>
Joshua Goldberg
quelle
Ich denke, dieses ist besser als, type -aweil es die
ärgerliche
1
aber da kein ort angegeben ist, ist dies eine antwort auf eine nicht gestellte frage
iconoclast
6

bash -xGibt aus, welche Bash ausgeführt wird, wenn sie gestartet wird, sodass Sie sie leichter nachverfolgen können. Vergessen Sie nicht, die neu geöffnete Shell zu verlassen.

Ignacio Vazquez-Abrams
quelle
Handliches Zeug; Um den Trace in einer Datei zu erfassen, verwenden Sie script out.txt bash -x(erneut, vergessen Sie nicht exit).
mklement0
-2

Ein anderer Weg, den ich in letzter Zeit noch einfacher finde:

  which <functionname>

(Dies zeigt auch an, ob es sich um einen Alias ​​oder ein Skript handelt, sucht jedoch nicht nach der Quelle eines Alias.)

Joshua Goldberg
quelle
2
Ich glaube nicht, dass whiches Informationen über Aliase auf BSD oder Mac gibt. Diese Frage whichbezieht sich auch auf Funktionen und gibt keine Informationen über Funktionen.
dbn
Danke für diesen Hinweis. Ich sehe jetzt, dass "was" nur Funktionen in zsh auflöst, nicht bash.
Joshua Goldberg
2
Ich denke, diese Antwort wird wahrscheinlich Ablehnungen hervorrufen ... sie scheint die Frage überhaupt nicht anzusprechen, da es keine Informationen vor Ort gibt.
Iconoclast
Ich habe es für nützlich befunden, die Deklaration aufzuspüren, um herauszufinden, ob es sich um einen Alias ​​oder eine Funktion handelt, und um die Syntax zu kennen, mit der sie deklariert wurde. Es ist jedoch wahr, dass nur die Antwort von @ HairOfTheDog die Datei direkt gibt.
Joshua Goldberg