私はUbuntuとCentOSディストリビューションで実行できるシンプルなbashスクリプトに取り組んでいます(DebianとFedora/RHELのサポートがプラスになります)、スクリプトが実行しているディストリビューションの名前とバージョンを知る必要があります(特定のアクション、たとえばリポジトリの作成をトリガーするため)。これまでのところ私が持っているのはこれです:
OS=$(awk '/DISTRIB_ID=/' /etc/*-release | sed 's/DISTRIB_ID=//' | tr '[:upper:]' '[:lower:]')
Arch=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')
VERSION=$(awk '/DISTRIB_RELEASE=/' /etc/*-release | sed 's/DISTRIB_RELEASE=//' | sed 's/[.]0/./')
if [ -z "$OS" ]; then
OS=$(awk '{print $1}' /etc/*-release | tr '[:upper:]' '[:lower:]')
fi
if [ -z "$VERSION" ]; then
VERSION=$(awk '{print $3}' /etc/*-release)
fi
echo $OS
echo $Arch
echo $VERSION
これはらしい機能し、ubuntu
またはcentos
(私は他のものを試していません)をリリース名として返します。しかし、私はこれを見つけるためのより簡単で信頼できる方法があるはずだと感じています-それは本当ですか?
RedHatでは機能しません。/etc/redhat-releaseには以下が含まれます:Redhat Linux Entrepriseリリース5.5
だから、バージョンは3番目のWordではありません、あなたはよりよく使うでしょう:
OS_MAJOR_VERSION=`sed -rn 's/.*([0-9])\.[0-9].*/\1/p' /etc/redhat-release`
OS_MINOR_VERSION=`sed -rn 's/.*[0-9].([0-9]).*/\1/p' /etc/redhat-release`
echo "RedHat/CentOS $OS_MAJOR_VERSION.$OS_MINOR_VERSION"
OS
とVER
を取得するには、最新の標準は/etc/os-release
。それ以前は、lsb_release
および/etc/lsb-release
。その前に、ディストリビューションごとに異なるファイルを探す必要がありました。
これが私が提案するものです
if [ -f /etc/os-release ]; then
# freedesktop.org and systemd
. /etc/os-release
OS=$NAME
VER=$VERSION_ID
Elif type lsb_release >/dev/null 2>&1; then
# linuxbase.org
OS=$(lsb_release -si)
VER=$(lsb_release -sr)
Elif [ -f /etc/lsb-release ]; then
# For some versions of Debian/Ubuntu without lsb_release command
. /etc/lsb-release
OS=$DISTRIB_ID
VER=$DISTRIB_RELEASE
Elif [ -f /etc/debian_version ]; then
# Older Debian/Ubuntu/etc.
OS=Debian
VER=$(cat /etc/debian_version)
Elif [ -f /etc/SuSe-release ]; then
# Older SuSE/etc.
...
Elif [ -f /etc/redhat-release ]; then
# Older Red Hat, CentOS, etc.
...
else
# Fall back to uname, e.g. "Linux <version>", also works for BSD, etc.
OS=$(uname -s)
VER=$(uname -r)
fi
uname
を取得するにはArch
がまだ最善の方法だと思います。しかし、あなたが与えた例は明らかにIntelシステムのみを処理します。次のようにBITS
と呼びます。
case $(uname -m) in
x86_64)
BITS=64
;;
i*86)
BITS=32
;;
*)
BITS=?
;;
esac
または、Arch
をより一般的で明確なバージョンに変更します:x86
およびx64
または類似:
case $(uname -m) in
x86_64)
Arch=x64 # or AMD64 or Intel64 or whatever
;;
i*86)
Arch=x86 # or IA32 or Intel32 or whatever
;;
*)
# leave Arch as-is
;;
esac
もちろん、それはあなた次第です。
私はこれを最初のステップとして使います:
ls /etc/*release
Gentoo、RedHat、Arch、SuSEには、次のようなファイルがあります。 /etc/gentoo-release
。人気があるようです release-files についてこのサイトをチェックしてください。
DebianとUbuntuには/etc/lsb-release
にはリリース情報も含まれており、前のコマンドで表示されます。
別の簡単なものはuname -rv
。インストールされているカーネルが標準のディストリビューションカーネルである場合は、 通常 時々そこで名前を見つける。
lsb_release -a
。 Debianで動作し、Ubuntuだと思いますが、残りについてはわかりません。 LSB(Linux Standard Base)に関連しているため、通常はすべてのGNU/Linuxディストリビューションに存在するはずです。
ワンライナー、フォールバック、1行の出力、エラーなし。
( lsb_release -ds || cat /etc/*release || uname -om ) 2>/dev/null | head -n1
python -m platform
出力例:
Ubuntu:
Linux-4.9.184-linuxkit-x86_64-with-Ubuntu-18.04-bionic
Debian:
Linux-4.14.117-grsec-grsec+-x86_64-with-debian-buster-sid
Centos:
Linux-3.10.0-957.1.3.el7.x86_64-x86_64-with-centos-7.6.1810-Core
Mac OS X:
Darwin-17.7.0-x86_64-i386-64bit
その行から特定の値が必要な場合は platform module docs を参照してください。たとえば、Linuxディストリビューション名のみが必要な場合は、
python -c "import platform;print(platform.linux_distribution()[0])"
JavaScript開発者からヒントをもらいましょう。バージョンをテストするのではなく、機能をテストします。きれいではありませんが、動作します。必要に応じて拡張します。
function os_type
{
case `uname` in
Linux )
LINUX=1
which yum && { echo centos; return; }
which zypper && { echo opensuse; return; }
which apt-get && { echo debian; return; }
;;
Darwin )
DARWIN=1
;;
* )
# Handle AmgiaOS, CPM, and modified cable modems here.
;;
esac
}
最近のほとんどのLinux OSシステムでは、ファイル/etc/os-release
は本当に標準になりつつあり、ほとんどのOSに含まれています。したがって、Bashスクリプト内にファイルを含めるだけで、記述されているすべての変数にアクセスできます here (例:NAME、VERSION、...)
だから私はこれを私のBashスクリプトで使っています:
if [ -f /etc/os-release ]
then
. /etc/os-release
else
echo "ERROR: I need the file /etc/os-release to determine what my distribution is..."
# If you want, you can include older or distribution specific files here...
exit
fi
最も成功する可能性の高い順に、次のとおりです。
cat /etc/*version
cat /proc/version #linprocfs/version for FreeBSD when "linux" enabled
cat /etc/*release
uname -rv
ほとんどのケースをカバー(AFAIK):Debian、Ubuntu、Slackware、Suse、Redhat、Gentoo、* BSD、そしておそらく他のケース。
ファイル/etc/debian_version
が存在する場合、ディストリビューションはDebianまたはDebian派生物です。このファイルにはリリース番号が含まれている場合があります。私のマシンでは現在6.0.1
です。テスト中または不安定な場合は、testing/unstableと表示されるか、次期リリースの番号が含まれている可能性があります。私の印象では、少なくともUbuntuでは、このファイルは常にテスト/不安定であり、リリース番号は含まれていませんが、私が間違っている場合は誰かが修正してくれます。
Fedora(少なくとも最近のリリース)には同様のファイル、つまり/etc/Fedora-release
があります。
LSBリリースファイルを使用できない、または使用したくない場合(パッケージがもたらす依存関係のため)、ディストリビューション固有のリリースファイルを探すことができます。 Bcfg2 には、使用できる可能性のあるディストリビューションのプローブがあります。 http://trac.mcs.anl.gov/projects/bcfg2/browser/doc/server/plugins/probes /group.txt
多くの2つの方法:
1)使用
lsb_release -a
CentOS 5.5とUbuntu 10.04でテストしました
centOSの出力は次のとおりです。
LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description: CentOS release 5.5 (Final)
Release: 5.5
Codename: Final
そしてUbuntuの場合:
LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description: CentOS release 5.5 (Final)
Release: 5.5
Codename: Final
2)次のコマンドを入力します。
cat /etc/*-release
CentOS 5.5とUbuntu 10.04でテストしましたが、正常に動作します。
私は良いスクリプトを見つけます ここから これはほとんどの一般的なLinuxディストリビューションで機能します:
#! /bin/bash
# return an awkable string consisting of
# unix OS type, or
# Linux dist, or
# a long guess (based on /proc), or
# no clue
giveUp () {
echo "Unknown"
exit 0
}
# keep this easily awkable, prepending an initial clue
versionGuess () {
if [ -e /proc/version ]; then
echo -n "Unsure "
cat /proc/version
exit 0
fi
return 1
}
# if we have ignition, print and exit
gotDist () {
[ -n "$1" ] && echo "$1" && exit 0
}
# we are only interested in a single Word "dist" here
# various malformations can occur; admin will have to code appropately based on output
linuxRelease () {
if [ -r /etc/lsb-release ]; then
dist=$(grep 'DISTRIB_ID' /etc/lsb-release | sed 's/DISTRIB_ID=//' | head -1)
gotDist "$dist"
fi
dist=$(find /etc/ -maxdepth 1 -name '*release' 2> /dev/null | sed 's/\/etc\///' | sed 's/-release//' | head -1)
gotDist "$dist"
dist=$(find /etc/ -maxdepth 1 -name '*version' 2> /dev/null | sed 's/\/etc\///' | sed 's/-version//' | head -1)
gotDist "$dist"
return 1
}
# start with uname and branch the decision from there
dist=$(uname -s 2> /dev/null)
if [ "$dist" = "Linux" ]; then
linuxRelease
versionGuess
giveUp
Elif [ -n "$dist" ]; then
echo "$dist"
exit 0
else
versionGuess
giveUp
fi
# we shouldn't get here
giveUp
# done
バージョンなし、distのみ:
cat /etc/issue | head -n +1 | awk '{print $1}'
誰かがディストリビューションも必要としている場合:
#!/usr/bin/env bash
LINUX_VERSION_NAME=`lsb_release -sr`
# Distribution specific installation
if [[ ${LINUX_VERSION_NAME} == "18.04" ]]
then
echo "It is: ${LINUX_VERSION_NAME}"
else
echo "It is not ${LINUX_VERSION_NAME}"
fi
出力:
It is: 18.04
Lsb_release -scに変更して、ディストリビューションを取得します。
LINUX_VERSION_NAME=`lsb_release -sc`
# Distribution specific installation
if [[ ${LINUX_VERSION_NAME} == "bionic" ]]
then
echo "It is: ${LINUX_VERSION_NAME}"
else
echo "It is not ${LINUX_VERSION_NAME}"
fi
出力:
It is: bionic
これはUbuntu 14とCentOS 7でテストされました
cat /etc/os-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g' | sed 's/["]//g' | awk '{print $1}'
このスクリプトはDebianで動作します(Ubuntuでは多少の調整が必要になる場合があります)
#!/usr/bin/env bash
echo "Finding Debian/ Ubuntu Codename..."
CODENAME=`cat /etc/*-release | grep "VERSION="`
CODENAME=${CODENAME##*\(}
CODENAME=${CODENAME%%\)*}
echo "$CODENAME"
# => saucy, precise, lucid, wheezy, squeeze
screenfetchスクリプトユーティリティを使用します。
#!/usr/bin/env bash
check_distro2(){
if [[ -e /etc/redhat-release ]]
then
DISTRO=$(cat /etc/redhat-release)
Elif [[ -e /usr/bin/lsb_release ]]
then
DISTRO=$(lsb_release -d | awk -F ':' '{print $2}')
Elif [[ -e /etc/issue ]]
then
DISTRO=$(cat /etc/issue)
else
DISTRO=$(cat /proc/version)
fi
}
check_distro2
echo $DISTRO
facter Ruby gemがあり、OS OSに関するいくつかの事実を提供します。 OSリリースファイル、その他のデータを分析し、端末画面に出力します。まず、rubygemsのインストールから始めます。
# apt-get install rubygems
お使いのOSに適した上記のケースを使用してください。次に、gem自体をインストールします。
# gem install facter
次に使用します:
$ facter
注:インストールの詳細については、facter gemのソースを参照してください。