83

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
4

4 に答える 4

110

zshイディオムはwhence-fフラグは関数定義を出力します。

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

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

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

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

man zshbuiltinsこのすべてのために。

于 2012-07-13T21:36:36.720 に答える
27

私はいつもこれだけを使ってきましwhichた。

于 2012-07-13T21:38:55.673 に答える
19

tl;dr

declare -f foo  # works in zsh and bash

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

特定の名前に対して存在するすべてのコマンド形式を出力に含めることを気にしない、または好まない場合:ありがとう、Raine Revere

type -af  # zsh only (works differently in bash and ksh)

type -f//この場合whence -fwhichそれらの目的はオペランドを関数として具体的に報告するのではなく、たまたまその名前で定義されている最も優先順位の高いコマンド形式を報告することであるため、最適ではありません。

とは言っても、実際には、これは同じ名前のエイリアスのみが優先されることを意味します (また、技術的にはシェル キーワードでもありますが、シェル キーワードの関数に名前を付けるのはおそらく悪い考えです)。

zshはデフォルトでスクリプト内のエイリアスを展開することに注意してください( は展開しますが、 は展開しませkshbash)。最初にエイリアス展開をオフにしても、 // まだ最初にエイリアスtype -f報告されます。whence -fwhich

ではzsh、この-fオプションは のルックアップにシェル関数のみを含めます。そのため、すべてのコマンド形式を一覧表示するために も使用しzshない限り、指定された名前によるエイリアスが唯一の出力として出力されます。-a

bashおよびではkshtype -f実際にはルックアップから関数を除外します。whenceには存在せず、関数定義bashを出力しません。は組み込みのandではなく、定義により外部ユーティリティはシェル関数を出力できません。kshwhichkshbash

于 2014-11-13T14:49:06.820 に答える