Suchen Sie den Speicherort einer Aliasdefinition - zsh, alias

ich kann Finden Sie den Ort einer Funktionsdefinition, aber das funktioniert nicht fĂĽr Aliase:

$ type -a subl

subl is an alias for /Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl
subl is /Users/brandon/bin/subl

Ich möchte gerne wissen wo dieser Alias ​​definiert istnicht Was es ist definiert wie, oder wo es zeigt. Mit anderen Worten: Wenn ich es ändern möchte, welche Datei und Zeilennummer muss ich aufrufen? Ich habe meine gesucht .zshrc und die Verzeichnisse, in denen ich die Dateien aufbewahre, die es beschafft, und die ich finde nichts1. Wie kann ich es finden, ohne manuell suchen zu müssen?


1. Ich habe es schließlich durch Laufen gefunden zsh -v und suchen nach sublund dann nach oben lesen, bis ich eine Zeile gefunden habe, die mit begann source. Dennoch würde ich mir eine nicht manuelle Möglichkeit wünschen, dies in Zukunft zu tun.

Antworten:

7 fĂĽr Antwort â„– 1

Lösung

Dies sollte den Trick machen:

PS4="+%x:%I>" zsh -i -x -c "" |& grep subl

Dies sollte etwa so aussehen

+/Users/brandon/.zshrc.d/aliases.zsh:32>alias "subl=/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"

Das heißt, dass in der Datei /Users/brandon/.zshrc.d/aliases.zsh (nur zum Beispiel) in Zeile 32 den Befehl alias "subl=/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" wurde ausgeführt. Beachten Sie, dass die angezeigte Befehlszeile das Ergebnis des Parsens des in die Datei geschriebenen Befehls ist, da diese möglicherweise nicht identisch sind.


Erläuterung

Die Konfiguration von zsh ist im Wesentlichen eine Liste von Shell-Befehlen. Die Informationen, von wo aus ein Befehl ausgeführt wurde, sind normalerweise nur zum Zeitpunkt der Ausführung des Befehls verfügbar. Nach Abschluss des Befehls bleiben möglicherweise Änderungen in der Umgebung oder in den Shell-Einstellungen erhalten, die Informationen darüber, wie diese Änderungen vorgenommen wurden, sind jedoch nicht mehr verfügbar. Die einzigen Optionen sind daher das Durchsuchen der Konfigurationsdateien oder das Nachverfolgen der Informationen zur Laufzeit.

Das Durchsuchen der Konfigurationsdateien ist - wie Sie bemerkt haben - fehleranfällig, da einige Konfigurationsdateien leicht übersehen werden können. zsh Lädt direkt bis zu acht verschiedene Konfigurationsdateien, wenn eine interaktive Shell gestartet wird, und es können beliebig viele zusätzliche Dateien von dort bezogen werden.

Das ist wo zsh "s XTRACE (-x) kommt ins Spiel. Ähnlich zu VERBOSE (-v) XTRACE druckt die ausgeführten Kommandozeilen aus, aber es wird auch jede Zeile mit dem vorangestellt PS4 Prompt. PS4 kann so konfiguriert werden, dass die aktuell ausgeführte Datei und Zeilennummer angezeigt werden. (Standardmäßig PS4 Zeigt den Namen der Funktion oder der Skriptdatei und die Nummer der aktuell ausgeführten Zeile an. Sollte sich eine Codezeile in einer Funktion befinden, würde dies nicht sofort anzeigen, wo sie definiert ist.

Im Einzelnen bewirkt der obige Befehl Folgendes:

  • Legen Sie die Umgebungsvariable fest PS4 zu +%x:%I> (nur fĂĽr diesen Befehl). %x wird durch den Namen der Datei ersetzt, die den aktuell ausgefĂĽhrten Quellcode enthält. %I ist die Zeilennummer dieses Codes in der Datei. + und > sind Dekoration zur Unterscheidung XTRACE Ausgabe von jeder Ausgabe, die das Skript generiert.

    Hinweis: Dies funktioniert möglicherweise nicht richtig, wenn PS4 wird irgendwo in der Konfiguration auf einen anderen Wert gesetzt. Sollte die Ausgabe nicht das gewünschte Format haben, kann es notwendig sein, zuerst das zu entfernen / auskommentieren PS4 oder PROMPT4 die Einstellungen.

  • zsh beginnt zsh

    • mit aktiviertem interaktivem Modus (-i)
    • mit XTRACE aktiviert (-x)
    • und fĂĽhrt nur eine leere Befehlszeile aus (-c ""), unmittelbar danach verlassen.

    Das bedeutet, dass nur die Initialisierungsdateien fĂĽr den interaktiven Modus ausgefĂĽhrt werden und keine Unordnung durch die Generierung von Eingabeaufforderungen oder Hook-Befehlen entsteht.

  • |& ist eine AbkĂĽrzung fĂĽr 2>&1 |, der das verbindet Standardausgabe und der Standart Fehler von einem Befehl an die Standardeingabe des nächsten.
  • grep subl sucht nach "subl". Ich schlage vor, nur nach dem Namen des Alias ​​zu suchen, da dies möglicherweise nicht in der genauen Befehlszeile der Fall ist alias subl="..." aufgrund von Parsing. (Im zsh Sie können sogar einen Alias ​​definieren, ohne das zu verwenden alias Befehl durch Zuweisen von SchlĂĽssel-Wert-Paaren im assoziativen Array aliases: aliases[subl]="...")