pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


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