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 }' /etc/*-release | tr '[:upper:]' '[:lower:]')
fi
if [ -z "$VERSION" ]; then
VERSION=$(awk '{print }' /etc/*-release)
fi
echo $OS
echo $ARCH
echo $VERSION
这似乎可行,返回
ubuntu
或centos
(我没有尝试其他)作为发行版名称。但是,我觉得必须找到一种更简单,更可靠的方法来找到答案-真的吗?对RedHat不起作用。
/ etc / redhat -release包含:
Redhat Linux Entreprise 5.5版
所以,该版本不是第三个字,您最好使用:
OS_MAJOR_VERSION=`sed -rn 's/.*([0-9])\.[0-9].*//p' /etc/redhat-release`
OS_MINOR_VERSION=`sed -rn 's/.*[0-9].([0-9]).*//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
仍然是最好的方法。但是您给出的示例显然仅适用于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
但这当然取决于您。
评论
我会检查lsb_release并使用它(如果可用),但它并非在所有地方都可用。例如,它不是默认安装的Fedora 14。
–史蒂文·D
2011-1-24在5:47
真?您是否尝试使用-和_进行拼写?也许是在/ lib / lsb或类似的地方。 rpm -qa“ lsb *”打印什么?
– Mikel
2011-1-24在5:56
rpm -qa“ lsb *不打印任何内容。根据yum提供的* / lsb_release,它包含在名为redhat-lsb的程序包中,我认为默认情况下未安装该程序包。但是,我不是Fedora专家,这些只是结果从我拥有的随机Fedora VM中提取,可能是非常错误的。
–史蒂文·D
2011-1-24在6:01
正如您所说,仅将Fedora 14安装在VM中,并且没有lsb版本。
– Mikel
11年1月24日在6:07
不要使用$ OS,$ VERSION等-按照惯例,我们将环境变量(PAGER,EDITOR,SHELL等)和内部shell变量(BASH_VERSION,RANDOM等)大写。所有其他变量名称应至少包含一个小写字母。该约定避免了意外覆盖环境和内部变量。
–克里斯唐(Chris Down)
2011年9月16日在20:18
#2 楼
我首先要这样做:ls /etc/*release
Gentoo,RedHat,Arch和SuSE有一个文件,例如
/etc/gentoo-release
。 Debian和Ubuntu应该有一个
/etc/lsb-release
,其中也包含发行信息,并会显示上一条命令。另一个快速的是
uname -rv
。如果安装的内核是标准发行版内核,通常您有时会在其中找到名称。评论
在Debian上,这并不合意-a。
– tshepang
2011年3月29日在20:31
难道不是-rv包含信息吗? uname -a将显示与处理器类型和主机名无关的信息。 (但是内核发行版(-r)和版本(-v)都是必需的,并不是所有发行版都一样)
–垫子
2011年3月29日20:34
uname -r给出2.6.32-5-686-bigmem,而uname -v给出#1 SMP Tue Mar 8 Tue 2011在Debian 6上UTC。uname -a OTOH给出Linux debian 2.6.32-5-686- bigmem#1 SMP 2月3日星期二22:14:55 UTC 2011 i686 GNU / Linux。
– tshepang
2011-3-29在22:22
uname -a的第二部分是-n,即nodename == hostname。所以我想说Uname在Debian上不会很有趣。想一想,我不确定它在RedHat上是否有用。
–垫子
2011年3月29日在22:26
哦好的。幸运的是,我将主机名设置为默认的debian。
– tshepang
2011年3月29日在22:29
#3 楼
lsb_release -a
。可以在Debian上运行,我想是Ubuntu,但是我不确定其余的事情。通常,它与LSB(Linux标准库)相关,因此应该在所有GNU / Linux发行版中都存在。评论
Gentoo默认未安装它。在某些时候,Fedora上也不默认(可能现在是)
–垫子
2011年3月29日19:13
这适用于Debian压缩,Fedora 14和OpenSUSE 11.3。在Debian和SUSE上,包含lsb_release的软件包是lsb-release,在Fedora上是redhat-lsb。它已经安装在Debian和SUSE上,但未安装在Fedora上。我认为这是迄今为止最好的答案。 +1。
– Faheem Mitha
2011年3月29日在20:09
lsb_release不是CentOS 6最小安装的一部分。
–编码员
2013年10月8日15:30
lsb_release -a在具有Raspbian(派生Debian 7.1)的Raspberry上返回“ -bash:lsb_release:命令未找到”。
– Peter Mortensen
2014年6月5日在11:32
lsb_release -a适用于Red Hat Enterprise Linux Server 6.6版(圣地亚哥)
– jwilleke
15年1月28日在13:56
#4 楼
一线,后备,一行输出,没有错误。( lsb_release -ds || cat /etc/*release || uname -om ) 2>/dev/null | head -n1
评论
美丽,谢谢。请注意,这在Mac OS X上仍然不起作用,但是在Ubuntu和CentOS(我方便使用的三个)上可以正常工作。
–通配符
2015年12月23日下午3:32
辉煌!为什么这么漂亮的答案不在最前面?
– Neo
17 Mar 28 '17 at 2:08
#5 楼
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
查看平台模块文档,如果您需要该行中的特定值。例如,如果仅需要Linux发行版名称,请使用
python -c "import platform;print(platform.linux_distribution()[0])"
评论
@ThiefMaster以下是命令的一些示例输出:* Linux-3.10.0-957.1.3.el7.x86_64-x86_64-with-centos-7.6.1810-Core * Linux-4.14.117-grsec-grsec + -x86_64 -with-debian-buster-sid在这里,关于Linux发行版还有什么不清楚的地方吗?
–伊利亚·哈拉莫夫(Ilya Kharlamov)
20年1月7日在15:06
好的,因此在那些发行版中,它包含一些信息。无论如何,它是任意文本,因此在脚本中使用并没有真正的用处...在Gentoo上,例如:inux-4.19.86-gentoo-x86_64-Intel-R-_Core-TM-_i5-8259U_CPU_@_2 .30GHz-with-glibc2.4
– ThiefMaster
20年1月7日,17:35
@ThiefMaster更新了有关如何获取特定值而不是任意文本的原始答案。
–伊利亚·哈拉莫夫(Ilya Kharlamov)
20年1月8日在20:34
#6 楼
在基本的CentOS或Debian系统上未安装/不存在lsb- *
/ proc / *在OSX上不存在
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
}
评论
百胜很可能是Red Hat,Scientific Linux或Fedora。对于Fedora模仿Debian的命令有一个适当的命令。等等。只需用yum修饰任何东西,CentOS就会为您提供从Red Hat 4到Fedora 18的一系列受支持的系统,这就是大约8年的Linux历史。如果您需要了解是否支持
– vonbrand
13年1月18日,3:21
@vonbrand确实如此,正如您所说。我不会尝试区分不同口味。尽管我并没有做很多研究,但我签入的顺序(希望能)消除了大多数棘手的情况(安装了apt-get的RHEL)。如果RHEL可以安装apt-get,而Ubuntu用户则非常好...那么,您真是运气不佳。
–嗜尿菌
13年1月22日在2:40
#7 楼
为了获得最大可能的成功,请执行以下操作: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以及其他。
评论
cat / etc / * version在CentOS上不起作用(没有这样的文件)(至少在6.4上)
–om-nom-nom
13-10-23在12:32
如果在容器中运行该命令,则/ proc / version将包含HOST发行版本,而不是容器发行版本。
–德雷克森
15年3月24日在20:14
#8 楼
对于大多数现代Linux OS系统,文件/etc/os-release
实际上已成为标准文件,并且已包含在大多数OS中。因此,在您的Bash脚本中,您可以仅包含文件,并且可以访问此处描述的所有变量(例如: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
评论
请记住,采购此文件会引入另一个隐藏内容的地方。 unix.stackexchange.com/a/433245/5132
– JdeBP
20 Mar 10 '20 at 19:42
#9 楼
如果文件/etc/debian_version
存在,则发行版为Debian或Debian衍生产品。该文件可能有发行号;在我的机器上,当前是6.0.1
。如果正在测试或不稳定,则可能表示正在测试/不稳定,或者可能包含即将发布的版本号。我的印象是,至少在Ubuntu上,此文件始终处于测试/不稳定状态,并且他们没有在其中输入发行号,但是如果我输入错误,则有人可以纠正我。Fedora(至少最近发布的版本)具有类似的文件,即
/etc/fedora-release
。评论
较新的Debian版本使用/ etc / os-release。
–德雷克森
15年3月24日在20:14
@Dereckson我检查了我的Wheezy机器,它同时具有/ etc / debian_version和/ etc / os-release。
– Faheem Mitha
15年3月24日在20:17
在使用debootstrap创建的Jessie chroot中进行了测试。但是的确,同样位于Jessie之下的本地计算机,这次以一种更常规的方式安装,包含一个/ etc / debian_version文件。因此,我们准备Debian安装的方式可能会影响可用的发行文件,这很有趣。
–德雷克森
15年3月28日在10:05
Debian的OS发行版不包含debian_version的完整版本号。请参阅unix.stackexchange.com/questions/382531。
– JdeBP
17年7月29日在7:08
#10 楼
如果您不能或不想使用LSB发布文件(由于软件包引入了相关性),则可以查找特定于发行版的发布文件。 Bcfg2提供了您可能可以使用的发行版的探针:http://trac.mcs.anl.gov/projects/bcfg2/browser/doc/server/plugins/probes/group.txt#11 楼
有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上对其进行了测试,并且工作正常。
评论
lsb_release不在CentOS 6中(最小安装速度)
–编码员
13-10-8在15:34
lsb_release -a在具有Raspbian(派生Debian 7.1)的Raspberry上返回“ -bash:lsb_release:命令未找到”。
– Peter Mortensen
2014年6月5日在11:34
在Centos 7下,您需要安装EPEL的redhat-lsb-core软件包,因为默认情况下为什么要麻烦安装“ Linux Standard Base Core”软件包?显然,您需要在Debian及其衍生产品下安装lsb-release软件包。
–本·斯特恩
20年5月29日,1:11
#12 楼
该脚本适用于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
#13 楼
我从这里找到了一个适用于大多数常见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 "" ] && echo "" && 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
#14 楼
如果还需要发行版:#!/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
#15 楼
这是我简单的chech_distro版本。 ^^;#!/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 }')
elif [[ -e /etc/issue ]]
then
DISTRO=$(cat /etc/issue)
else
DISTRO=$(cat /proc/version)
fi
}
check_distro2
echo $DISTRO
#16 楼
没有版本,只有dist:cat /etc/issue | head -n +1 | awk '{print }'
评论
Yahya Yahyaoui一年前的回答也是如此。实际上,这两个答案都在2011年以后来被删除的答案解决。他们错误的原因仍然适用。
– JdeBP
17年7月29日在6:56
#17 楼
已在Ubuntu 14和CentOS 7上进行了测试。cat /etc/os-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g' | sed 's/["]//g' | awk '{print }'
评论
@don_crissti你会怎么做?
– BsdHelper
2015年11月23日,1:18
sed -n -e'/ PRETTY_NAME / s /^.*= \ |“ \ |。* // gp'/ etc / os-release
–cas
15年11月23日在1:41
@cas非常好!将其添加到我的工具箱中。谢谢你的分享。
– BsdHelper
15年11月24日在6:35
#18 楼
由于该问题未指定对/ bin / sh等的限制,因此有使用ruby shell解释器的解决方案。有一个ruby gem事实,它为您提供了有关OS OS的一些事实,它分析OS发行文件,其他数据并打印到终端屏幕。您可以尝试以下操作,从rubygems安装开始:
# apt-get install rubygems
请使用适合您的操作系统的上述情况。然后安装gem本身。
# gem install facter
然后使用:
$ facter
注意:请参阅事实gem来源以获取更多安装信息。
评论
失败者争论?
–МалъСкрылевъ
20/09/14在11:35
也许是因为它需要红宝石。我认为我们只需要/ bin / sh的逻辑
– airtonix
20-10-8在22:34
@airtonix,问题中对“ sh”的重新定位在哪里?
–МалъСкрылевъ
20-10-9在21:46
@МалъСкрылевъ由标签shell-script隐含。介意不是我在投票
–roaima
20-11-06在22:57
#19 楼
此命令适用于基于Debian和基于Redhat的发行版:使用
tr
过滤器,将文档转换为每行一个单词的格式,然后计算包含发行版名称的第一行。tr -s ' 1' '2' < /etc/issue | head -n 1
评论
关于2011年现在已删除的答案的评论说同样的话,仍然适用。放错位置的答案也一样,现在又删除了,它表示/ etc / issue在zenwalk上不包含版本或名称。这是一个管理员可修改的文件,其中包含呈现给人类的消息,但不能保证包含任何可以以编程方式提取的消息。
– JdeBP
17年7月29日在6:54
评论
您确定+发布有效吗?实际上,您正在假设它是/ etc / lsb-release,所以也许就这样称呼它。@Mikel:我用+替换了*,以避免注释格式,它应该是etc / *-release,它似乎可以工作。
切勿引入语法错误来正确设置格式。此外,格式化仅在预览中是错误的,最终视图从标记中提取语法。
为什么没有人提到这个uname -rv | grep -i“ name_of_distro”并使用退出代码?