![如何在简单的 shell 脚本中获取发行版名称和版本号?](https://linux22.com/image/866/%E5%A6%82%E4%BD%95%E5%9C%A8%E7%AE%80%E5%8D%95%E7%9A%84%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E8%8E%B7%E5%8F%96%E5%8F%91%E8%A1%8C%E7%89%88%E5%90%8D%E7%A7%B0%E5%92%8C%E7%89%88%E6%9C%AC%E5%8F%B7%EF%BC%9F.png)
我正在开发一个简单的 bash 脚本,该脚本应该能够在 Ubuntu 和 CentOS 发行版上运行(支持 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
(我没有尝试过其他)作为发布名称。然而,我有一种感觉,一定有一种更简单、更可靠的方法来找出这个问题——是真的吗?
它不适用于红帽。 /etc/redhat-release 包含:Redhat Linux Entreprise 版本 5.5
所以,版本不是第三个词,你最好使用:
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"
答案1
要得到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
仍然是最好的方式。但你给出的例子显然只处理英特尔系统。我要么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
但这当然取决于你。
答案2
我会将此作为第一步:
ls /etc/*release
Gentoo、RedHat、Arch 和 SuSE 有一个名为 例如 的文件/etc/gentoo-release
。好像很受欢迎,看看这个网站发布文件。
Debian 和 Ubuntu 应该有一个/etc/lsb-release
也包含版本信息的文件,并将与上一个命令一起显示。
另一个快速的是uname -rv
。如果安装的内核是库存发行版内核,您有时通常会在其中找到该名称。
答案3
lsb_release -a
。适用于 Debian,我猜是 Ubuntu,但我不确定其余的。通常它应该存在于所有 GNU/Linux 发行版中,因为它与 LSB(Linux Standard Base)相关。
答案4
python -m platform
样本输出:
乌班图:
Linux-4.9.184-linuxkit-x86_64-with-Ubuntu-18.04-bionic
德班:
Linux-4.14.117-grsec-grsec+-x86_64-with-debian-buster-sid
森托斯:
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
看平台模块文档如果您需要该行的特定值。例如,如果您只需要 Linux 发行版名称,请使用
python -c "import platform;print(platform.linux_distribution()[0])"