正確には、Linuxディストリビューションの名前(可能ならバージョンも)を取得したい(ただしLinux以外も一応想定しておく)という話です。lsb_releaseやuname -oなどを使って収集するコードを書いてみました。厳密さはあまり考えないものとしています。

コードはGistに置きました: osname.cpp。C++でやるべきことではないと思いましたが、いろいろあってC++で書いてしまいました。戦略は次の順に試した得られた文字列を採用という感じです。

  1. lsb_release -d。次のlsb-releaseだけでよいかと思ったけど、結果が異なる場合があるという話を見かけたので: 天泣記
  2. /etc/lsb-releaseのDISTRIB_DESCRIPTION行。Ubuntuのような追加のパッケージ入れないとlsb_release使えないけどこのファイルはある環境のため。
  3. /etc/lsb-releaseのDISTRIB_ID行。Gentooの[gentoo-x86] Contents of /sys-apps/lsb-release/lsb-release-1.4-r1.ebuildでDISTRIB_IDしか存在しなさそうに感じたので。
  4. os-release (/etc/os-release, /usr/lib/os-release)。lsb_releaseとどっち先にするか迷った。
  5. /etc/redhat-release。RHELとCentOSは無視できないかなと思った(主に5系)。だから、/etc/*-releaseはいろいろある中でこれだけ特別。
  6. uname -oと次のuname(2)の組み合わせ。GNU Coreutilsのuname -oの出力はビルド時に埋め込まれる文字列なので、実行してみるしかない。
  7. 最後はuname(2)の結果を組み合わせる。

uname -oを入れた理由は、使える場合uname -s (utsname::sysname)より望ましい場合が多いと考えているためです。uname – Wikipediaに様々な環境での出力例があって便利でした。

/etc/redhat-releaseなどのファイルの中身を直接読み取ることについては、lsb準拠のLinuxならディストリビューションやバージョンの識別はパッケージ情報やlsb_releaseを使おう – よくきたはてダという否定的な意見も見かけますが、これをもとに何かするわけではないので今回は気にせずそのまま使っています。


スポンサード リンク

この記事のカテゴリ

  • ⇒ OSの名前を取得する