コマンドのインストール前にインストール済みか確認したい。できれば POSIX 互換にしたい。
インストーラーのスクリプトを書く際に、事前に必須コマンドが導入されているかチェックしたかったのです。
一般的に which
コマンドが使われますが、POSIX 準拠コマンド一覧には which
がありません。
「which
より確実なのあったなぁ、なんだっけかなぁ」と、ここ1年で作成/更新された Qiita 記事を「bash
関数
コマンド
存在
確認
」でググっても(タイトルから)ピンポイントでわかる情報がみつかりませんでした。いや、1年以上前の未更新記事ならたくさんあるのですが、自分のググラビリティとして。
TL;DR
which でなければ type コマンドです
TS;DR
関数
#!/usr/bin/env bash
function existsCmd () {
type -a $1 > /dev/null 2>&1
}
用途
if ! existsCmd bash; then
echo 'bash does not exist'
exit $LINENO
fi
echo 'bash exists'
if existsCmd hoge; then
echo 'hoge exists'
exit $LINENO
fi
echo 'hoge does not exist'
if ! existsCmd fuga; then
echo 'fuga does not exist'
exit $LINENO
fi
echo 'fuga exists'
実行結果
bash exists
hoge does not exist
fuga does not exist
- 動作確認環境:macOS Mojave(OSX 10.14.3), bash 3.2.57
- オンラインで動作確認する @ paiza.IO
参考文献&あわせて読みたい
- 「コマンドが存在するかしないかを判定して, 条件分岐する構文のまとめ」@ Qiita
- 「シェルスクリプトで関数を利用する」@ Qiita
- 「Bashでコマンドの存在チェックはwhichよりhashの方が良いかも→いやtypeが最強」@ Qiita