解決策 1:
クロス配布方法はありません。ただし:
- Redhat と仲間たち:
/etc/redhat-release
のテスト 、内容を確認- Debian:
/etc/debian_version
のテスト 、内容を確認- Mandriva とその仲間たち:
/etc/version
のテスト 、内容を確認- Slackware:
/etc/slackware-version
のテスト 、内容を確認
など。一般的に言えば、/etc/*-release
をチェックします。 および /etc/*-version
.
編集:私の古い(1年以上)bashスクリプトが横たわっているのを見つけました。これは、何年にもわたって一緒に石畳になったに違いありません(6年前の印象的なCVSログがあります)。そのままでは適切に動作しない可能性があります。インストール済みのディストリビューションを探してテストする必要はありませんが、良い出発点になるはずです。 CentOS、Fedora、および Gentoo で正常に動作します。 gyaresu は Debian Lenny でテストに成功しました。
#!/bin/bash
get_distribution_type()
{
local dtype
# Assume unknown
dtype="unknown"
# First test against Fedora / RHEL / CentOS / generic Redhat derivative
if [ -r /etc/rc.d/init.d/functions ]; then
source /etc/rc.d/init.d/functions
[ zz`type -t passed 2>/dev/null` == "zzfunction" ] && dtype="redhat"
# Then test against SUSE (must be after Redhat,
# I've seen rc.status on Ubuntu I think? TODO: Recheck that)
elif [ -r /etc/rc.status ]; then
source /etc/rc.status
[ zz`type -t rc_reset 2>/dev/null` == "zzfunction" ] && dtype="suse"
# Then test against Debian, Ubuntu and friends
elif [ -r /lib/lsb/init-functions ]; then
source /lib/lsb/init-functions
[ zz`type -t log_begin_msg 2>/dev/null` == "zzfunction" ] && dtype="debian"
# Then test against Gentoo
elif [ -r /etc/init.d/functions.sh ]; then
source /etc/init.d/functions.sh
[ zz`type -t ebegin 2>/dev/null` == "zzfunction" ] && dtype="gentoo"
# For Slackware we currently just test if /etc/slackware-version exists
# and isn't empty (TODO: Find a better way :)
elif [ -s /etc/slackware-version ]; then
dtype="slackware"
fi
echo $dtype
}
これはおそらく Bash でのみ正しく機能することに注意してください。他のシェル用に書き直すことができます。
そうは言っても、ディストリビューションではなく、機能をテストする必要があるかもしれません。メンテナンスの負担になったという理由だけで、私はもうこれを使用していません。クロスディストリビューション ツールとソリューションに頼る方が簡単です。
概念的には、次のようになります:
- 既知の「一般的な init スクリプト関数」タイプのファイルを取り込みます。それらはディストリビューション固有です。存在しない場合は、次の配布チェックに進みます。
- そのコア スクリプトから、存在が知られており、頻繁に使用され、名前が変更される可能性が低い特定の関数の存在を確認します。
type
を使用してそれを行います バッシュ組み込み。type -t
function
を返します そのシンボルが関数の場合。zz
を先頭に追加しますtype -t 2>/dev/null
からの出力に 名前が定義されていない場合、出力文字列は空になり、==
の左手が見つからないという構文エラーが発生するためです。 オペレーター。チェックしたばかりの名前が関数でない場合は、次のディストリビューション チェックに進みます。それ以外の場合は、ディストリビューション タイプが見つかりました。- 最後に、分散タイプをエコーして、関数の出力を case .. esac ブロックで簡単に使用できるようにします。
これをストレート スクリプトとして実行しようとしている場合に備えて編集します。このスクリプトは、他のスクリプトからソースまたはインクルードされることになっています。そのまま実行しても何も出力されません。それをテストするには、それをソースしてから関数を呼び出します。例:
source /path/to/this/script.sh
get_distribution_type
bash プロンプトで。
編集:このスクリプトは root 権限を必要としないことに注意してください。 root として実行しないことをお勧めします。何も害するべきではありませんが、必要はありません。
CVS ログに、関連するメーリング リストへの投稿へのリンクが見つかりました。 init スクリプトのスパゲッティをアンラップするのに役立つはずです。
解決策 2:
できることとできないことについて、ディストリビューションに基づいて推測しようとしないでください。その方法は狂気です (「ユーザー エージェントの検出」も参照してください)。代わりに、実行したいことがサポートされているかどうか、および使用したいコマンドまたはファイルの場所によってどのように実行されるかを検出します。
たとえば、パッケージをインストールする場合、dpkg または rpm の存在をチェックすることで、Debian ライクなシステムまたは RedHat ライクなシステムを使用しているかどうかを検出できます (最初に dpkg をチェックします。Debian マシンにはそれらのrpmコマンド...)。 Debian システムか RedHat システムかだけでなく、それに基づいて何をすべきかを決定してください。そうすることで、明示的にプログラムしていない派生ディストリビューションを自動的にサポートできます。パッケージに特定の依存関係が必要な場合は、それらもテストして、不足しているものをユーザーに知らせてください。
もう 1 つの例は、ネットワーク インターフェイスをいじることです。 /etc/network/interfaces ファイルまたは /etc/sysconfig/network-scripts ディレクトリがあるかどうかに基づいて何をすべきかを考え出し、そこから進みます。
はい、それはもっと手間がかかりますが、Web 開発者が過去 10 年以上にわたって犯してきた過ちをすべてやり直したいと思わない限り、最初から賢明な方法でそれを行うことができます。
解決策 3:
uname -a
を実行すると、カーネルのバージョンを確認できます。 、ディストリビューション バージョンの検索はディストリビューションに依存します。
Ubuntu およびその他の OS では、lsb_release -a
を実行できます。 または /etc/lsb_release を読む
Debian はバージョンを /etc/debian_version に保存します
解決策 4:
ほとんどのディストリビューションには、特定のディストリビューションを決定する独自の方法があります。
例:
Redhat (And derivatives): /etc/redhat-release
SUSE: /etc/SUSE-release
Linux Standard Base または LSB として知られる標準があります。これは、Linux ディストリビューションに関する情報をエコー バックする /etc/lsb-release というファイルまたは lsb_release というプログラムが必要であると定義しています。
lsb_release -a
解決策 5:
python -c 'import platform ; print platform.dist()[0]'
コード:http://hg.python.org/cpython/file/2.7/Lib/platform.py