場合によっては、スクリプトがLinuxによって異なる動作をする必要があります。スクリプトが実行されているLinuxのバージョンを確認するにはどうすればよいですか?
できることとできないことに関してディストリビューションに基づいて仮定を試みたり作ったりしないでください。その方法には狂気があります(「ユーザーエージェントの検出」も参照)。代わりに、実行したいことがサポートされているかどうか、および使用したいコマンドやファイルの場所によってどのように実行されているかを検出します。
たとえば、パッケージをインストールしたい場合、dpkgまたはrpmの存在を確認することで、DebianのようなシステムとRedHatのようなシステムのどちらにいるかを検出できます(Debianマシンはそれらのrpmコマンド...)。 DebianシステムかRedHatシステムかだけでなく、それに基づいて何をするかを決定します。そうすれば、明示的にプログラムしていない派生ディストリビューションを自動的にサポートできます。ああ、そしてパッケージに特定の依存関係が必要な場合は、それらもテストして、不足しているものをユーザーに知らせます。
もう1つの例は、ネットワークインターフェイスの操作です。/etc/network/interfacesファイルまたは/ etc/sysconfig/network-scriptsディレクトリがあるかどうかに基づいて何をすべきかを考え出し、そこから進みます。
はい、もっと手間がかかりますが、Web開発者が過去10年以上にわたって犯したすべての間違いをやり直したくない場合は、最初からスマートな方法でそれを行います。
クロスディストリビューションの方法はありません。しかしながら:
- 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では問題なく動作します。 gyares は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
Bashビルトインを使用して行います。type -t
は、そのシンボルが関数の場合、function
を返します。type -t 2>/dev/null
からの出力の前にzz
を追加します。名前が定義されていない場合、出力文字列は空になり、==
演算子の左手がないという構文エラーが発生するためです。チェックした名前が関数でない場合は、次の分布チェックにスキップします。それ以外の場合は、分布タイプを見つけます。- 最後に、分布タイプをエコーして、関数の出力をcase .. esacブロックで簡単に使用できるようにします。
これをまっすぐなスクリプトとして実行しようとしている場合に備えて編集します。このスクリプトは、他のスクリプトから取得またはインクルードされることになっています。そのまま実行しても、それ自体は何も出力しません。それをテストするには、それをソーシングしてから関数を呼び出します、例えば:
source /path/to/this/script.sh
get_distribution_type
bashプロンプトで。
編集:このスクリプトはroot権限を必要としないことに注意してください。 rootで実行しないことをお勧めします。何も害はないはずですが、必要はありません。
CVSログに関連する メーリングリストの投稿 へのリンクが見つかりました。 initスクリプトスパゲッティのアンラップに役立つはずです。
カーネルバージョンを確認するには、uname -a
を実行します。ディストリビューションバージョンの確認は、ディストリビューションによって異なります。
Ubuntuおよびその他のOSでは、lsb_release -a
を実行するか、/ etc/lsb_releaseを読み取ることができます。
Debianはバージョンを/ etc/debian_versionに保存します
ほとんどのディストリビューションには、特定の分布を決定する独自の方法があります。
例えば:
Redhat (And derivatives): /etc/redhat-release
SUSE: /etc/SUSE-release
Linux Standard Base または [〜#〜] lsb [〜#〜] として知られる標準があります。/etc/lsb-releaseというファイル、またはLinuxディストリビューションに関する情報をエコーバックするlsb_releaseというプログラムが必要であることを定義しています。
lsb_release -a
python -c 'import platform ; print platform.dist()[0]'
他の回答に加えて:1つのファイルを解析したいだけの場合、ほとんどのディストリビューションは/ etc/issueを介してttyログインをパーソナライズします。例:
SUSE Linux Enterprise Server 10 SP2(i586)へようこそ-カーネル\ r(\ l)。
そして、はい、私はそれが次善であることを知っています。 :)
facter は、この種の発見に役立つツールですが、上記で説明した方法のいくつかを使用していて、Rubyが必要です。
必要なのは、お気に入りのシェルでuname -a
と入力することだけです。カーネルの名前とバージョンが出力されます。
次の方法でもバージョンを取得できます
cat /proc/version
o/p:
Linuxバージョン2.6.17-13mdv([email protected])(gccバージョン4.1.2 20070302(プレリリース)(4.1.2-1mdv2007.1))#1 SMP Fri Mar 23 19:03:31 UTC 2007
マーク、アダム、ミハイと賛成です(評判が悪いため投票できません)。 LSBとそれに関連するソリューション [〜#〜] fhs [〜#〜] に基づくソリューションは、ほとんどのディストリビューションで機能し、今後も機能する可能性があります。 LSBとFHSは友達です。
cat /etc/*release*
はほとんど常に機能することがわかりました。
Linuxのバージョンは難しい質問です。狭く見ると、「uname -r
」で取得できるカーネルバージョンがあります。ディストリビューションのバージョンはほとんど無知です。一部のディストリビューションの方が優れています(Redhat Enterprise Linuxなどのエンタープライズディストリビューション)。 Gentooのような他のディストリビューションは基本的に移動可能なターゲットであり、賢明なバージョンはまったくありません。バージョンに基づいて処理を行う必要がある場合は、関連する主要コンポーネントを確認してください。
Component Version command
glibc /lib/libc.so.6
gcc gcc --version
X xdpyinfo
libX11 pkg-config --modversion x11
gtk+ pkg-config --modversion gtk+-2.0
qt-4 pkg-config --modversion QtCore
etc...
Grubメニューを確認することもできます。通常、ディストリビューションやバージョンの情報がたくさん表示されます:-)