私のマシンで実行されているLinuxマシンの名前を確認するコマンドを知っています。例えば:
cat /etc/version
cat /etc/issue
ターミナルから出力を取得し、UBUNTUまたはCENTOSであるかどうかを確認し、次のコマンドを実行するにはどうすればよいですか?
apt-get install updates
または
yum update
cat /etc/issue
残念ながら、ディストリビューション名を取得する確実な簡単な方法はありません。ほとんどの主要なディストリビューション に向かっている この情報を保存するために/etc/os-release
を使用するシステム。最新のディストリビューションのほとんどにはlsb_release
ツールも含まれていますが、これらは常にデフォルトでインストールされるわけではありません。そのため、使用できるいくつかのアプローチを以下に示します。
/etc/os-release
を使用
awk -F= '/^NAME/{print $2}' /etc/os-release
lsb_release
ツールがある場合は使用します
lsb_release -d | awk -F"\t" '{print $2}'
大部分のディストリビューションで機能するより複雑なスクリプトを使用します。
# Determine OS platform
UNAME=$(uname | tr "[:upper:]" "[:lower:]")
# If Linux, try to determine specific distribution
if [ "$UNAME" == "linux" ]; then
# If available, use LSB to identify distribution
if [ -f /etc/lsb-release -o -d /etc/lsb-release.d ]; then
export DISTRO=$(lsb_release -i | cut -d: -f2 | sed s/'^\t'//)
# Otherwise, use release info file
else
export DISTRO=$(ls -d /etc/[A-Za-z]*[_-][rv]e[lr]* | grep -v "lsb" | cut -d'/' -f3 | cut -d'-' -f1 | cut -d'_' -f1)
fi
fi
# For everything else (or if above failed), just use generic identifier
[ "$DISTRO" == "" ] && export DISTRO=$UNAME
unset UNAME
インストールされている場合、gcc
のバージョン情報を解析します。
CentOS 5.x
$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
Copyright (C) 2006 Free Software Foundation, Inc.
CentOS 6.x
$ gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
Copyright (C) 2010 Free Software Foundation, Inc.
Ubuntu 12.04
$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.
Ubuntu 14.04
$ gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
このようなタスクを実行するためにbashは必要ありません。/etc/version
や/etc/issue
などのファイルの処理を避けるために、高レベルのアプローチを使用することをお勧めします(/ etc/versionがありません13.10)。
したがって、代わりにこのコマンドを使用することをお勧めします。
python -mplatform | grep -qi Ubuntu && Sudo apt-get update || Sudo yum update
python platform モジュールは両方のシステムで動作します。残りのコマンドは、Ubuntuがpythonによって返されるかどうかを確認し、apt-get
else yum
を実行します。
これは、ファイルが存在するだけで、Ubuntu/CentOS/RHELのすべてのバージョンで動作する簡単な答えです(もちろん、Ubuntuボックスに/ etc/redhat-releaseをランダムにドロップした場合はフェイルセーフではありません)。
if [ -f /etc/redhat-release ]; then
yum update
fi
if [ -f /etc/lsb-release ]; then
apt-get update
fi
これらのタスクには Chef を使用します。;-)
Chefでは、 platform?
メソッドを使用できます。
if platform?("redhat", "centos", "Fedora")
# Code for only Red Hat Linux family systems.
end
または:
if platform?("ubuntu")
# Code for only Ubuntu systems
end
または:
if platform?("ubuntu")
# Do Ubuntu things
end
または:
if platform?("freebsd", "openbsd")
# Do BSD things
end
カーネル名でUbuntuを確認します。
if [ -n "$(uname -a | grep Ubuntu)" ]; then
Sudo apt-get update && Sudo apt-get upgrade
else
yum update
fi
apt-get -v &> /dev/null && apt-get update
which yum &> /dev/null && yum update
ディストリビューションが2つしかない場合は、短くすることができます。
apt-get -v &> /dev/null && apt-get update || yum update
どういうわけかyum -v
はCentOSでゼロ以外を返すので、代わりにwhich
を使用します。
もちろん、which
がインストールされていない場合、シナリオを考慮する必要があります。
次のスクリプトは、Ubuntuであるかどうかを示します。そうでなく、使用できる他のオプションがCentOSのみである場合は、else
句に含める必要があります。
dist=`grep DISTRIB_ID /etc/*-release | awk -F '=' '{print $2}'`
if [ "$dist" == "Ubuntu" ]; then
echo "ubuntu"
else
echo "not ubuntu"
fi
サブシェルで/etc/os-release
を実行し、その値をエコーします。
if [ "$(. /etc/os-release; echo $NAME)" = "Ubuntu" ]; then
apt-get install updates
else
yum update
fi
このコマンドを使用すると、CentOS、Ubuntu、Debianで動作します:grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'
DebianではDebian GNU/Linux
を生成し、UbuntuではUbuntu
を生成し、CentOSではCentOS Linux
を生成します。
Gawkの代わりにgrep、cut、sedを使用する利点は明らかです。Debianにはデフォルトでgawkがインストールされていないため、ランダムなDebianボックスに依存することはできません。
私はPythonを使用します
if ! python -c "exec(\"import platform\nexit ('centos' not in platform.linux_distribution()[0].lower())\")" ; then
echo "It is not CentOS distribution, ignoring CentOS setup"
exit 0
fi