Linuxのディストリシューションを検出して処理を分岐する
Linuxディストリビューションを判定し、環境の違いをカバーするように実装する必要が出たので、検出方法を考えてみました。
/etc/ のファイルで検出する方法
多くのLinuxディストリビューションでは /etc/redhat-release にディストリビューション名が含まれているので、その部分だけを抜き出してみることにします。RHELの場合は実ファイルが存在しています。しかしCentOSなどの場合はcentos-relelease などへのシンボリックリンクが設定されているので、この違いによりRHELかどうかを判断できます。シンボリックリンクの場合はリンク先を readlink で確認できます。 いずれにせよ、*-release という名前が用いられていますので、-release の部分を削ることでディストリビューションを特定できます。
なおdebian, ubuntu の場合はファイル名が微妙に異なるので、これだけは別の方法で対応します。
これを次のように実装すれば、どのようなディストリビューションであっても名前は取得できます。
#!/bin/bash # macOS などの Linux ではない環境については uname -s の結果を用いる distro=$( uname -s ) if [ -e /etc/debian_version ] || [ -e /etc/debian_release ]; then if [ -e /etc/lsb-release ]; then distro=ubuntu else distro=debian fi else if [ -L /etc/redhat-release ]; then # /etc/redhat-release がシンボリックリンクの場合は # readlink でリンク先ファイル名を取得 cd /etc releasefile=$( cd /etc ; readlink redhat-release ) distro=${releasefile%*-release} elif [ -e /etc/redhat-release ]; then # /etc/redhat-release がリンクではない場合は # RHEL とみなす distro=redhat fi fi echo $distro
あとは、判定したディストリビューションごとの分岐を実装すればOKです。
apt or yum コマンドの有無を判定する
判定の目的が apt or yum のコマンドによるパッケージインストールを行うことにあるなら、つぎのように apt の有無で処理を分岐できます。
which apt 2> /dev/null if [ $? -eq 0 ]; then sudo apt -y update sudo apt -y upgrade sudo apt -y autoremove sudo apt -y install build-essential unzip jq else sudo yum -y update sudo yum -y upgrade sudo yum -y groupinstall "Development Tools" sudo yum -y install unzip jq fi