Wie zeige ich die Definition der zsh-Funktion (wie bash "type myfunc")?

74

Wie zeige ich die Definition einer Funktion in zsh? type foogibt die Definition nicht an.

In Bash:

bash$ function foo() { echo hello; }

bash$ foo
hello

bash$ type foo
foo is a function
foo () 
{ 
    echo hello
}

In zsh:

zsh$ function foo() { echo hello; }

zsh$ foo
hello

zsh$ type foo
foo is a shell function
Rob Bednark
quelle
declare -f fooist die bessere Wahl auch in Bash - und es funktioniert auch in zsh; siehe meine Antwort für Hintergrundinformationen.
mklement0

Antworten:

95

Die zsh-Redewendung lautet whence: Das -fFlag druckt Funktionsdefinitionen:

zsh$ whence -f foo
foo () {
    echo hello
}
zsh$

In zsh typewird als äquivalent zu definiert whence -v, sodass Sie weiterhin verwenden können type, aber Sie müssen das folgende -fArgument verwenden:

zsh$ type -f foo
foo () {
    echo hello
}
zsh$

Und schließlich ist in zsh whichdefiniert als äquivalent zu whence -c- Druckergebnisse im csh-ähnlichen Format, sodass which foodieselben Ergebnisse erzielt werden.

man zshbuiltins für all das.

pb2q
quelle
1
"woher" gibt nur den Namen der Funktion zurück. Die Funktionsdefinition wird nicht angezeigt.
Rob Bednark
2
@RobBednark genauer hinschauen: -fwird in der Antwort verwendet, die Funktionsdefinitionen druckt
pb2q
type -f footut dies auch; typeist äquivalent zu whence -v.
Keith Thompson
Ich sehe, "woher -f foo" gibt das Verhalten, das ich suche. Entspricht Thors "which foo".
Rob Bednark
@ pb2q, nette Details für die 3 verschiedenen Möglichkeiten sowie die Referenz. Vielen Dank!
Rob Bednark
22

Ich habe immer nur dafür verwendet which.

Thor
quelle
4
"welches" gibt das Verhalten, das ich suche - danke Thor! (Beachten Sie, dass "which" ein eingebautes zsh ist, während es in bash / usr / bin / which und / usr / bin / aufruft, das sich anders verhält als die eingebaute zsh-Funktion "which")
Rob Bednark
1
Works, aber nur , wenn kein Alias mit dem gleichen Namen zu definieren geschieht, in welchem Fall der berichtet wird ( whichmeldet die höchsten Vorrang Form des Befehls).
mklement0
16

tl; dr

declare -f foo  # works in zsh and bash

typeset -f foo  # works in zsh, bash, and ksh

type -f/ whence -f/which Sind in diesem Fall nicht optimal , weil ihr Zweck die Befehlsform mit dem berichten , ist höchste Priorität , die definiert wird , geschieht mit diesem Namen (es sei denn , Sie auch angeben -a, in welchem Fall alle Befehlsformen gemeldet werden) - als spezifisch gegen Berichterstattung auf dem Operanden als Funktion .

Die -fOption wird das nicht ändern - es ist nur beinhaltet Shell - Funktionen in dem Look - up.

Aliase und Shell - Schlüsselwörter haben höhere Priorität als Shell - Funktionen, so im Fall bei der Hand, wenn ein Alias foowurde auch definiert, type -f foowürden die Bericht Alias - Definition.

Beachten Sie, dass zshAliase in Skripts standardmäßig nicht erweitern (wie auch ksh, aber nicht bash), und selbst wenn Sie Alias Erweiterung zuerst ab drehen, type -f/ whence -f/ which noch Aliase berichtet zuerst.

mklement0
quelle
6

Wenn Sie nicht ganz sicher sind, wonach Sie suchen, können Sie einfach tippen

functions

und es zeigt Ihnen alle definierten Funktionen.

Beachten Sie, dass es manchmal VIELE davon gibt, sodass Sie möglicherweise zu einem Pager-Programm weiterleiten möchten:

functions | less

Verwenden Sie zum Aufheben der Definition einer Funktion

unfunction functionname
Dan Pritts
quelle
1
+1; Beachten Sie, dass functionsdies typeset -f(mit Ausnahme der -MOption) äquivalent ist , sodass Sie sogar den grammatikalisch leicht kontraintuitiven Befehl verwenden können functions foo, um Informationen zu einer bestimmten Funktion abzurufen.
mklement0