web-dev-qa-db-ja.com

zsh関数定義(bash "type myfunc"など)を表示する方法は?

Zshで関数の定義を表示するにはどうすればよいですか? type fooは定義を与えません。

バッシュで:

bash$ function foo() { echo hello; }

bash$ foo
hello

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

Zshの場合:

zsh$ function foo() { echo hello; }

zsh$ foo
hello

zsh$ type foo
foo is a Shell function
61
Rob Bednark

Zshイディオムはwhenceであり、-fフラグは関数定義を出力します。

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

Zshでは、typewhence -vと同等として定義されているため、引き続きtypeを使用できますが、-f引数を使用する必要があります。

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

そして最後に、zshではwhichwhence -cと同等として定義されます-結果をcsh-like形式で出力するため、which fooでも同じ結果が得られます。

man zshbuiltinsのすべて。

69
pb2q

私はいつもこれにwhichを使用しました。

17
Thor

tl; dr

declare -f foo  # works in zsh and bash

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

type -f/whence -f/whichこの場合は準最適です。これは、その目的は、highestでコマンドフォームを報告することです) precedencethathappens to be defined byby the name(ただし、-a、その場合allコマンド形式が報告されます)-オペランドをとして具体的に報告するのではなく関数

-fオプションはそれを変更しません-それはincludesルックアップのシェル関数のみです。

エイリアスとシェルキーワードはシェル関数よりも優先順位が高いため、当面のケースでは、エイリアスfooも定義されている場合type -f fooalias定義を報告します。

zshはデフォルトでスクリプトのエイリアスを展開します(kshは展開しますが、bashは展開しません)。また、最初にエイリアス展開をオフにした場合でも、type -f/whence -f/whichstill最初にエイリアスを報告します。

9
mklement0

探しているものがよくわからない場合は、

functions

定義されたすべての関数が表示されます。

それらの多くが時々あるので、ページャープログラムにパイプしたいかもしれないことに注意してください:

functions | less

関数を未定義にするには、次を使用します

unfunction functionname
6
Dan Pritts