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

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

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

答え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つのシェルすべてに移植可能になります。

答え2

試験結果

type functionname

$ if type existingfunction >/dev/null 2>&1 ; then echo yes ; else echo no ; fi
yes
$

$ if type nonexistingfunction >/dev/null 2>&1 ; then echo yes ; else echo no ; fi
no
$

答え3

コードの読みやすさと正確性のために、

if [[ "$(type -t myfunction)" = "function" ]] ; then
   # the function is defined and accesible
fi

組み込みまたは .onlytypeを使用すると、エイリアス、組み込み関数、ファイルなども検索し、不要なオブジェクト型に対して0(true)を返すことができます。help typeman bashtype text

関連情報