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