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?

Antworten:



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

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>

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.


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.)


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
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.