Ich kann nicht herausfinden, wie ich die Datei finde, in der eine Bash-Funktion definiert ist ( __git_ps1
in meinem Fall).
Ich experimentierte mit declare
, type
, which
, aber nichts sagt mir , die Quelldatei. Ich habe irgendwo gelesen, dass declare
man den Dateinamen und die Zeilennummer ausdrucken kann, aber es wurde nicht erklärt wie. Die help
Seite für declare
sagt es auch nicht.
Wie kann ich diese Informationen erhalten?
$PATH
, funktioniert diestype
nicht. Vielleicht möchten Sie es einfach mitfind
oder versuchenlocate
.locate
wird viel schneller sein, da es eine bereits vorhandene Datenbank verwendet, aber es wird nicht funktionieren, wenn der Befehl erst kürzlich installiert wurde.Antworten:
Wenn Sie bereit sind, die Funktion auszuführen, können Sie die Informationen abrufen, indem Sie
set -x
die Ausführung verfolgen und diePS4
Variable festlegen.Starten Sie bash mit
--debugger
oder verwenden Sie esshopt -s extdebug
, um zusätzliche Debugging-Informationen aufzuzeichnen.Legen Sie fest
PS4
, dass die Eingabeaufforderung beim Verfolgen gedruckt wird, um die Quellzeile anzuzeigen.Aktivieren Sie die Ablaufverfolgung.
Sie können dann Ihre Funktion ausführen und erhalten für jede Zeile den Dateinamen der Funktion.
Verwenden Sie
set +x
, um die Ablaufverfolgung zu deaktivieren.Also für diesen Fall würden Sie laufen
quelle
Wenn Sie nicht bereit sind, die Funktion auszuführen, können Sie dennoch das Debuggen einrichten und die Informationen abrufen. Die Schritte sind
bash --debugger
odershopt -s extdebug
bevor die Funktion definiert ist.declare -F __git_ps1
und es wird berichtet, wo die Funktion definiert ist.
Die Vorteile dieser Methode im Vergleich zum Anzeigen der kommentierten Ausführungsablaufverfolgung mit PS4 sind
Die Vorteile des Execution Trace sind
Ich empfehle nachdrücklich ,
shopt -s extdebug
am Anfang von beiden zu stehen~/.bashrc
und~/.bash_profile
die verschiedenen Dateien zu behandeln, die in verschiedenen Invocation- Fällen verwendet werden.quelle
shopt -s extdebug
aufgerufen wird. Achten Sie darauf, dass die Zeilennummern möglicherweise deaktiviert sind (ein aktueller Fehler), wenn die Funktion durch deklariert ist .eval
bash --debugger
ich die Fertigstellung tatsächlich auslösen musste, um die Fertigstellungsfunktion zu definieren und von zu meldendeclare -F _vpnc
.Die großartige Lösung von @ icarus funktioniert für Funktionen, sofern sie wörtlich definiert sind und nicht das Ergebnis eines
eval
Inhalts einer anderen Datei (in der die Datei mit demeval
als Quelle angezeigt wird). Es wird nicht die Quelldatei von Aliasen, Shell-Built-Ins (wieecho
) und ausführbaren Dateien (binär oder nicht) gedruckt , und ich glaube, diese Informationen sind im Allgemeinen nicht verfügbar. Einige Befehle drucken möglicherweise ihre Quelldateien (und sind möglicherweise sogar wahrheitsgemäß), entweder während der normalen Ausführung oder als Antwort auf ein Signal.__git_ps1
ist in/usr/share/git/git-prompt.sh
und/usr/share/git/completion/git-prompt.sh
auf meinem System Arch Linux definiert, daher kann es für Sie dasselbe sein.Werfen Sie einen Blick auf den Abschnitt Aufruf von,
man bash
wenn Sie nach Befehlen suchen möchten, die speziell am Anfang der Shell erstellt wurden. Diese können andere Dateien enthalten, die wiederum andere Dateien enthalten.quelle
bash
?$HOME/.bashrc
und in$HOME/.profile
. Siehe: linuxfromscratch.org/blfs/view/svn/postlfs/profile.html. Hier erfahren Sie , wann und wie die einzelnen Dateien bezogen werden./etc/profile
,$HOME/.bash_profile
,$HOME/.bash_login
, Und der Inhalt$ENV
und$BASH_ENV
Notwendigkeit zu Ihrer Liste hinzugefügt werden.Es scheint nicht möglich zu sein
bash
, aber es ist inzsh
:quelle
find
/locate
/grep
.~/.whatever
standardmäßig die gleichen Dateien wie bash und gibt nur nützliche Antworten für Funktionen, die an gemeinsam genutzten Speicherorten wie in diesem Fall definiert sind und in~/.bashrc
oder was auch immer nicht neu definiert wurden .Deklarieren Sie eine Funktion mit demselben Namen und setzen Sie sie so früh wie möglich auf readonly, und aktivieren Sie dann den xtrace-Modus.
Wenn Sie sich danach anmelden, werden Trace-Informationen angezeigt, die die Beschaffung von Dateien umfassen. In dem Moment, in dem versucht wird, die vorhandene schreibgeschützte Funktion zu deklarieren, wird eine Fehlermeldung angezeigt. Die zuletzt bezogene Datei sollte die gesuchte Deklaration enthalten.
Möglicherweise müssen Sie dies in das System-Bash-Profil einfügen. Denken Sie auch daran, die Änderungen rückgängig zu machen, nachdem Sie den Täter gefunden haben.
quelle
Hast du das probiert?
oder einen der anderen Befehle, die hier zu finden sind:
Wie finde ich alle Dateien, die bestimmten Text enthalten, unter Linux? | Paketüberfluss
Es scheint, dass ich Ihnen mehr Erklärungen geben muss. Ihre Frage lautet "" Wenn Sie also den folgenden Befehl ausführen, sollte er alle Dateien zurückgeben, in denen eine Bash - Funktion definiert ist.
BASH-Programmierung - Funktionen | Linux-Dokumentationsprojekt
quelle