関数が利用可能かどうかをテストする

関数が利用可能かどうかをテストする

関数を含むファイルをまだインポートしていない場合は、関数が利用可能かどうかをテストできますか?

ベストアンサー1

bash(またはkshその構文のソースまたはzsh1)で、次のことができます。

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の場合、yashAPIは少し異なります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>&14つのシェルすべてに移植可能になります。

おすすめ記事