1. ホーム
  2. バッシュ

[解決済み】bashに関数が存在するかどうかを判断する

2022-04-09 16:53:36

質問

現在、bashから実行されるユニットテストをいくつか行っています。ユニットテストはbashスクリプトで初期化、実行、クリーンアップされます。このスクリプトは通常、init()、execute()およびcleanup()関数を含んでいます。しかし、これらは必須ではありません。私は、これらが定義されているかどうかをテストしたいと思います。

以前、ソースをgrepしてsedすることで行いましたが、間違っていたようです。もっとエレガントな方法はないでしょうか?

編集:以下のスニップレットは魅力的なように動作します。

fn_exists()
{
    LC_ALL=C type $1 | grep -q 'shell function'
}

解決方法は?

こんな感じです。 [[ $(type -t foo) == function ]] && echo "Foo exists"

組み込みの type コマンドは、何かが関数なのか、組み込み関数なのか、外部コマンドなのか、それとも単に未定義なのかを教えてくれます。

その他の例

$ LC_ALL=C type foo
bash: type: foo: not found

$ LC_ALL=C type ls
ls is aliased to `ls --color=auto'

$ which type

$ LC_ALL=C type type
type is a shell builtin

$ LC_ALL=C type -t rvm
function

$ if [ -n "$(LC_ALL=C type -t rvm)" ] && [ "$(LC_ALL=C type -t rvm)" = function ]; then echo rvm is a function; else echo rvm is NOT a function; fi
rvm is a function