$ FPATHを介してアクセスできる関数があるかどうかを確認する組み込み(または少なくとも単純な)方法はありますか?

$ FPATHを介してアクセスできる関数があるかどうかを確認する組み込み(または少なくとも単純な)方法はありますか?

fooスクリプトで関数を定義したいです。源泉)、しかし、その名前のいくつかの実行可能ファイル、シェル組み込み、関数、またはエイリアスがまだ「存在しない」場合にのみ適用されます。

この場合、「存在」の定義はあまり些細ではありません(したがって、恐ろしい引用が出ました)。

最初の近似で、私の操作的定義は return 以外のものが存在すればfoo存在するということです。これは私が興味のあるほとんどの場合に機能します。which foofoo not found

% which cat
/bin/cat
% which cd
cd: shell built-in command
% which zargs
zargs () {
    # undefined
    builtin autoload -XU
}
% which grep
grep: aliased to grep --color=always

...しかし、以下を介してアクセスできるファイルに定義されている関数はキャプチャしません$FPATH

% which zargs
zargs not found

もちろん、私自身のラッパーを振って下のwhich関数を調べることもできますが、$FPATH(明示的に繰り返すなどの方法で)シェルプログラミングに関しては、見えるものは何もないことを学びました(または過度に学んだかもしれません)。同様に簡単です... したがって、1)利用可能な機能のプレゼンステストを実行する組み込みの方法がある場合、または少なくとも2)そうする確立された習慣がある場合は、そのパスを優先します。

答え1

アクセス可能な関数はfpath呼び出すことができるため、「存在」しません。最初に自動ロードする必要があり、その後which(関数が存在するかどうかをテストする他の方法と一緒に)、実際の定義のスタブ定義が自動的にロードされることが報告されます。

% zargs
zsh: command not found: zargs
% autoload zargs
% which zargs
zargs () {
        # undefined
        builtin autoload -X
}

which foo実行できるfoo操作に加えて、コマンド名として使用できるかどうかを正確にテストします。任意のコードを含めることができるため、どのようなcommand_not_found_handlerタスクcommand_not_found_handlerを実行するかを予測する方法はなく、そのコードが見つかったら代替コマンドを実行するため、何もしなくても実行するタスクを確認する方法はありません。

コードがzsh関連の場合は、whence代わりに使用できますwhich(またはwhence -wよりきれいな出力のために自動的に作成するオプションはありません)whence。 、type代わりに使用してくださいwhich

function exists {
  whence -w $1 >/dev/null
}

「存在」定義に自動ロードできますが、まだロードされていない関数が含まれている場合は、自動ロードできますが、まだロードされていない関数を検出するコード(明示的な$fpath巡回)を実装します。

関連情報