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?
41
whence -f function_name
inzsh
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 .
In meinem Fall ist die Ausgabe dieser Befehle:
quelle
whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
shopt
ohne den aktuellen Shell-Status zu ändern:whichfunc () ( shopt -s extdebug; declare -F "$1"; )
(Beachten Sie die Verwendung von(...)
anstelle von{...}
).Verwenden Sie zum Anzeigen der Definition der Funktion (im Gegensatz zu ihrer Herkunft) Folgendes:
quelle
type -a
weil es diebash -x
Gibt 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.quelle
script out.txt bash -x
(erneut, vergessen Sie nichtexit
).Ein anderer Weg, den ich in letzter Zeit noch einfacher finde:
(Dies zeigt auch an, ob es sich um einen Alias oder ein Skript handelt, sucht jedoch nicht nach der Quelle eines Alias.)
quelle
which
es Informationen über Aliase auf BSD oder Mac gibt. Diese Fragewhich
bezieht sich auch auf Funktionen und gibt keine Informationen über Funktionen.