bashでコマンドの存在確認をする

最近環境構築の自動化にハマりつつあります。

Linux等のUNIX OSではほとんどが標準でパッケージマネージャが存在し、 アプリケーションの管理はパッケージマネージャで行われることが多いです。

macOSの場合、Homebrewを使うことによって アプリケーションのパッケージ管理の幅がグッと広がります。

brewで管理しているアプリを初期インストール時だけでなく、 brewが入っていない状態や追加でアプリをインストールしたい時など、 そもそもそのコマンドが生きているのかを確認したい場合があったので今回はその方法を紹介します。

結論

以下のコマンドでコマンドの生死がわかります。

$ type {command} >/dev/null 2>&1 && echo "{command} exists."

>/dev/null 2>&1とは???

それぞれ次のような意味です。

Shell 意味
>/dev/null 出力を破棄する
2>&1 標準エラー出力を標準出力として出力する

ちなみに、>/dev/nullスペシャルファイルの1つであらゆる入力をも破棄する特殊なインターフェースです。 別名ビットバケツ

つまり、出力は全てゴミ箱へ(まったく表示しない)と言う意味。

なぜこれで存在チェックが出来るかと言うと、 コマンドの終了コードを見ているからです。シェルでのtruefalseの終了コードは以下の通り。

$ true
$ echo $?
0
$ false
$ echo $?
1

そのため、コマンドが存在する場合は正常終了し、 終了コード0 = trueとして見なされ存在チェックが可能と言うわけですね。

いや、難しい...💦

おまけ

ちなみにpwshでは以下のようにやると同じようなことが出来るそうです。

PS> if (Get-Command {command} -ea SilentlyContinue) { echo "{command} exists." }

(pwshだとand演算子、or演算子で分岐処理出来ないかも?)