foo
スクリプトで関数を定義したいです。源泉)、しかし、その名前のいくつかの実行可能ファイル、シェル組み込み、関数、またはエイリアスがまだ「存在しない」場合にのみ適用されます。
この場合、「存在」の定義はあまり些細ではありません(したがって、恐ろしい引用が出ました)。
最初の近似で、私の操作的定義は return 以外のものが存在すればfoo
存在するということです。これは私が興味のあるほとんどの場合に機能します。which foo
foo 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
巡回)を実装します。