関数を含むファイルをまだインポートしていない場合は、関数が利用可能かどうかをテストできますか?
ベストアンサー1
bash
(またはksh
その構文のソースまたはzsh
1)で、次のことができます。
if typeset -f myfunction > /dev/null; then
echo The myfunction function is defined
fi
これはksh(この構文のソース)とzshでも機能します。
では、zsh
次のこともできます。
if (( $+functions[myfunction] )) then
echo The myfunction function is defined
fi
これは、関数名をその定義にマップする特別な連想配列の存在をテストすることですmyfunction
(どちらの方法もまだロードされていない自動ロード可能関数でも機能します)。
別名もある場合、同じ名前の関数を使用するには、別名または少なくとも一部('cmd' args
別名ではないcmd args
)を引用する必要があります。シェル予約語にも同じ内容が適用されますが、bashでは、とにかく予約語と同じ名前の関数を定義することはできません。
@JJaoがコメントで提案したように、type -t
(bashまたは最新バージョンksh93で)コマンドの種類を知らせることもできますmyfunction
。
case $(type -t myfunction) in
(function) echo OK;;
(alias) echo might exist as a function but it is first an alias;;
(*) echo cannot be used as a function;;
esac
1の場合、yash
APIは少し異なりますtypeset -f myfunction
。本物関数を定義しても出力は生成されません。それ以外の場合は返されます。間違ったそしてエラーメッセージを出力します。関数の定義をyashとして印刷する必要がありますtypeset -pf myfunction
(ksh / zsh / bashでも機能しますが、-p
必須ではありません)。だから、あなたはする必要がありますif typeset -f myfunction 2> /dev/null
。これにより、if typeset -f myfunction > /dev/null 2>&1
4つのシェルすべてに移植可能になります。