関数を含むファイルをまだインポートしていない場合は、関数が利用可能かどうかをテストできますか?
答え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つのシェルすべてに移植可能になります。
答え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 type
man bash
type text