252

I'm working on a simple bash script that should be able to run on Ubuntu and CentOS distributions (support for Debian and Fedora/RHEL would be a plus) and I need to know the name and version of the distribution the script is running (in order to trigger specific actions, for instance the creation of repositories). So far what I've got is this:

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

This seems to work, returning ubuntu or centos (I haven't tried others) as the release name. However, I have a feeling that there must be an easier, more reliable way of finding this out -- is that true?

It doesn't work for RedHat. /etc/redhat-release contains : Redhat Linux Entreprise release 5.5

So, the version is not the third word, you'd better use :

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"
Kusalananda
  • 333,661
Alix Axel
  • 2,929
  • Are you sure +-release works? Effectively you're looking assuming it will be /etc/lsb-release, so perhaps just call it that. – Mikel Jan 24 '11 at 05:57
  • @Mikel: I replaced * with + to avoid the comment formating, it should be etc/*-release, it seems to work. – Alix Axel Jan 24 '11 at 06:20
  • 10
    Never introduce a syntax error to get formatting right. Besides, the formatting is wrong only in the preview, the final view picks up the syntax from the tags. – Gilles 'SO- stop being evil' Jan 24 '11 at 21:07
  • Why no one mention this f.e. uname -rv | grep -i "name_of_distro" and use exit code? – fugitive Feb 06 '17 at 14:21
  • $ awk -F= '$1 ~ /ID|VERSION_ID/ {print $2;}' /etc/os-release; or awk -F= '$1 ~ /DISTRIB_ID|DISTRIB_RELEASE/ {print $2;}' /etc/lsb-release – Marslo Aug 11 '21 at 13:35

20 Answers20

258

To get OS and VER, the latest standard seems to be /etc/os-release. Before that, there was lsb_release and /etc/lsb-release. Before that, you had to look for different files for each distribution.

Here's what I'd suggest

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

I think uname to get ARCH is still the best way. But the example you gave obviously only handles Intel systems. I'd either call it BITS like this:

case $(uname -m) in
x86_64)
    BITS=64
    ;;
i*86)
    BITS=32
    ;;
*)
    BITS=?
    ;;
esac

Or change ARCH to be the more common, yet unambiguous versions: x86 and x64 or similar:

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

but of course that's up to you.

Mikel
  • 57,299
  • 15
  • 134
  • 153
  • 2
    I would check for lsb_release and use it if available, but it isn't available everywhere. For instance, it isn't in the default install of Fedora 14. – Steven D Jan 24 '11 at 05:47
  • Really? Did you try spelling it with - and _? Maybe it's in /lib/lsb or somewhere like that. What does rpm -qa "lsb*" print? – Mikel Jan 24 '11 at 05:56
  • 1
    rpm -qa "lsb* prints nothing. According to yum provides */lsb_release it is contained in a package called redhat-lsb which I guess is not installed by default. However, I'm not a Fedora expert, these are just the results from a random Fedora VM I have and could be very wrong. – Steven D Jan 24 '11 at 06:01
  • 3
    Just installed Fedora 14 in a VM, and there is no lsb-release, as you said. – Mikel Jan 24 '11 at 06:07
  • 1
    @Mikel: lsb_release seems to work great on Ubuntu 10.04 LTS, however in Fedora and CentOS I get a "command not found" error message. Also, /etc/lsb-release doesn't seem to exists in RHEL distros. On Fedora 13 for instance I have fedora-release, redhat-release and system-release. – Alix Axel Jan 24 '11 at 06:24
  • @Mikel: uname -s outputs "Linux" on both Ubuntu and Fedora, uname -r seems to output the kernel version. – Alix Axel Jan 24 '11 at 06:26
  • @Mikel: I've installed the redhat-lsb package on Fedora and it works great. I'm still surprised that there isn't a more straightforward way to find this info. I'll probably use this approach, however I've one question: how do I know if I should call yum -y install redhat-lsb or not? Do I have any easy way of finding out if I'm running a RHEL distro? – Alix Axel Jan 24 '11 at 06:38
  • @Steven D: I got the same results on Fedora 13 and I'll test that in a bit on CentOS 5.5. Thank you for the tip on redhat-lsb! – Alix Axel Jan 24 '11 at 06:40
  • @Alix Axel, yes, the uname -s is a fallback, in case you need something to work even if lsb-release can't be found, or it isn't Debian/Ubuntu or Red Hat/CentOS. – Mikel Jan 24 '11 at 06:51
  • I'd be wary of using the redhat-lsb package, it's not always installed. At least for RHEL and Fedora, the redhat-lsb package brought in a LOT of extra dependencies that aren't necessary for all servers. For example, on RHEL5, redhat-lsb requires /usr/bin/lpr, which brings in cups, which brings in avahi. I don't need mdns or printing on an HPC node or web server. – jsbillings Jan 24 '11 at 14:23
  • Noted. But at no point did I suggest installing it. :-) Reading /etc/redhat-release is sufficient on Red Hat-like systems. – Mikel Jan 24 '11 at 20:05
  • FYI: On Ubuntu cat /etc/debian_version outputs squeeze/sid – andrewsomething Jan 25 '11 at 02:52
  • Yep, but on Ubuntu, there should be /etc/lsb-release so it doesn't matter. But I'm not saying my list is exhaustive. It should be tested on all the systems you want it to work on. – Mikel Jan 25 '11 at 05:05
  • 8
    Don't use $OS, $VERSION, etc -- by convention, we capitalize environment variables (PAGER, EDITOR, SHELL, ...) and internal shell variables (BASH_VERSION, RANDOM, ...). All other variable names should contain at least one lowercase letter. This convention avoids accidentally overriding environmental and internal variables. – Chris Down Sep 16 '11 at 20:18
  • Never underestimate the braindead sysadmin who fakes that information "for security"... – vonbrand Jan 18 '13 at 03:11
  • lsb_release -a returns "-bash: lsb_release: command not found" on Raspberry with Raspbian (Debian 7.1 derived). – Peter Mortensen Jun 05 '14 at 11:31
  • I can query both values at once lsb_release -si -sr but the os name and version are on separate lines. – ThorSummoner Dec 29 '15 at 23:48
  • centos 7 don't contain lsb_release, need a more common way to detect. – Mithril Oct 27 '16 at 08:40
  • 1
    @Mithril Doesn't it have /etc/redhat-release or /etc/centos-release? That's the part I left as a TODO because I don't have a Red Hat or CentOS system. – Mikel Oct 27 '16 at 16:21
  • None of these methods work for Ubuntu 17.04. LSB is not installed by default, so you first need to know you are on Ubuntu in order to sudo apt install lsb-release. – Wouter Beek Aug 07 '17 at 03:07
  • @WouterBeek Ubuntu 17.04 should have /etc/lsb-release from base-files, marked Essential. https://packages.ubuntu.com/zesty/base-files – Mikel Aug 08 '17 at 03:55
  • @Mikel You are right and I was wrong: the file /etc/lsb-release is indeed present. The command lsb-release does not work (and requires package installation). – Wouter Beek Aug 08 '17 at 13:51
  • @WouterBeek I re-worded to make /etc/lsb-release equally prominent. Please me know if you have suggestions. – Mikel Aug 08 '17 at 19:50
  • @Mikel that script is absolutely amazing. would you happen to have a list of the sample outputs we can expect for $OS ? here's mine so far : Ubuntu, Debian, Slackware, Suse, Redhat, Gentoo, Arch, BSD, oldDebian, OpenSuSE, oldRedHatorCentos, I put "oldRedHatorCentos" hard coded on the final elseif so that $OS might have a value, same for "OpenSuSE", "oldDebian" I hard coded onto the "older debian" branch so that I might differenciate it from newer debians in case they fall higher up, in which case I expect they'll output "Debian". I'm triyng build a switch-case to use all over my script. – tatsu Mar 07 '19 at 13:55
  • /etc/redhat-release works for me – felipsmartins Mar 20 '20 at 20:46
  • Been using this script for a few years. Just added a case for MacOS (Darwin): elif [ "$(uname -s)" == Darwin ]; then OS=Darwin; DISTRO="$(uname -s)"; VER="(uname -r)" Note that I don't know whether this also works with watchOS and tvOS. Also note that the MacOS instance on GitHub doesn't seem to have uname -o at the moment. – adentinger Feb 21 '23 at 02:06
72

I'd go with this as a first step:

ls /etc/*release

Gentoo, RedHat, Arch & SuSE have a file called e.g. /etc/gentoo-release. Seems to be popular, check this site about release-files.

Debian & Ubuntu should have a /etc/lsb-release which contains release info also, and will show up with the previous command.

Another quick one is uname -rv. If the kernel installed is the stock distro kernel, you'll usually sometimes find the name in there.

Mat
  • 52,586
  • On Debian, that's uname -a. – tshepang Mar 29 '11 at 20:31
  • 3
    doesn't uname -rv contain the info though? uname -a will print things like type of processor and hostname that are irrelevant here. (But both kernel release (-r) and version (-v) are necessary, not all distros do it the same there) – Mat Mar 29 '11 at 20:34
  • uname -r gives 2.6.32-5-686-bigmem and uname -v gives #1 SMP Tue Mar 8 22:14:55 UTC 2011 on Debian 6. uname -a OTOH gives Linux debian 2.6.32-5-686-bigmem #1 SMP Tue Mar 8 22:14:55 UTC 2011 i686 GNU/Linux. – tshepang Mar 29 '11 at 22:22
  • the second part of uname -a is -n, i.e. nodename == hostname. so I'd say uname will not be interesting on Debian. Come to think of it, I'm not sure it is so useful on RedHat either. – Mat Mar 29 '11 at 22:26
  • Oh, ok. So it's just by luck that I set my hostname as default, debian. – tshepang Mar 29 '11 at 22:29
  • In Ubuntu for uname -rv I get the proper output 2.6.35-28-generic #49-Ubuntu SMP Tue Mar 1 14:39:03 UTC 2011. – Chethan S. Mar 29 '11 at 23:01
  • Thanks for this answer. uname -a reports GNU/Linux on many distros, and this isn't very useful when trying to determine the Linux distribution . – Stefan Lasiewski Mar 29 '11 at 23:09
  • Debian squeeze does not have /etc/lsb_release but it does have /etc/debian_version and the lsb_release -a command does work. – Shadur-don't-feed-the-AI Mar 30 '11 at 09:12
  • Using your input, you might find that this one-liner pretty much dumps the information needed many Linux distros: grep -Eh -- "DISTRIB_DESCRIPTION=|PRETTY_NAME=" /etc/*{_version,*-release} 2>>${LOGFILE} | cut -d= -f2 | tr -d "\"" | sort -u – ikaerom May 09 '22 at 09:17
41

lsb_release -a. Works on Debian and I guess Ubuntu, but I'm not sure about the rest. Normally it should exist in all GNU/Linux distributions since it is LSB (Linux Standard Base) related.

sakisk
  • 2,873
  • 3
    It's not installed by default on Gentoo. It wasn't by default on Fedora either at some point (probably is now though) – Mat Mar 29 '11 at 19:13
  • 2
    This worked on Debian squeeze, Fedora 14, and OpenSUSE 11.3. On Debian and SUSE the package containing lsb_release was lsb-release, on Fedora it was redhat-lsb. It was already installed on Debian and SUSE, but not on Fedora. I think this is the best answer so far. +1. – Faheem Mitha Mar 29 '11 at 20:09
  • 3
    lsb_release is not part of the CentOS 6 minimal install. – a coder Oct 08 '13 at 15:30
  • 2
    lsb_release -a returns "-bash: lsb_release: command not found" on Raspberry with Raspbian (Debian 7.1 derived). – Peter Mortensen Jun 05 '14 at 11:32
  • lsb_release -a works on Red Hat Enterprise Linux Server release 6.6 (Santiago) – jwilleke Jan 28 '15 at 13:56
37

One-liner, fallbacks, one line of output, no errors.

( lsb_release -ds || cat /etc/*release || uname -om ) 2>/dev/null | head -n1
joeytwiddle
  • 1,018
  • 9
  • 15
Markus
  • 371
  • Beautiful, thank you. Note this still doesn't work on Mac OS X, but it works fine on Ubuntu and CentOS (which are the three I have handy). – Wildcard Dec 23 '15 at 03:32
  • 2
    Brilliant! Why such a bueatiful answer not on the top? – Neo Mar 28 '17 at 02:08
  • Sadly it falls apart for /etc/os-release on Git for Windows SDK (MSYS2), because it will result in NAME=MSYS when uname -om gives a uniquer answer (x86_64 Msys). – Martin Braun Jan 24 '24 at 23:57
21
python -m platform

sample outputs:

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

See platform module docs if you need a specific value from that line. For example, if you need the Linux distro name only, use

python -c "import platform;print(platform.linux_distribution()[0])"
  • @ThiefMaster Here are a few sample outputs of the command:
    • 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

    Is there anything that is not clear about the linux distribution here?

    – Ilya Kharlamov Jan 07 '20 at 15:06
  • OK, so on those distros it contains some information. In any case, it's arbitrary text and thus not really useful to use in scripts... on Gentoo I have this for example: inux-4.19.86-gentoo-x86_64-Intel-R-_Core-TM-_i5-8259U_CPU_@_2.30GHz-with-glibc2.4 – ThiefMaster Jan 07 '20 at 17:35
  • @ThiefMaster Updated the original answer on how to get the specific value instead of arbitrary text. – Ilya Kharlamov Jan 08 '20 at 20:34
9
  1. lsb-* isn't installed/doesn't exist on base CentOS or Debian systems
  2. /proc/* doesn't exist on OSX

Take a tip from JavaScript developers: Don't test for the version, but for the capability. It's not pretty, but it works. Expand as necessary.

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 AmigaOS, CPM, and modified cable modems.
     ;;
esac
}
apaderno
  • 825
  • 7
    Yum could very well be Red Hat, Scientific Linux, or Fedora. There was an apt command for Fedora mimiking Debian's. And so on. Just clasifying anything with yum as CentOS gives you a range of supported systems from Red Hat 4 to Fedora 18, that is some 8 years of Linux history right there. If you need to know if is supported, specifically check for instead of guessing based on (unreliable) distribution identification! Sure, it leads to something of the ilk of autotools, but that can't be helped (just thank $DEITY that the Unix wars are over). – vonbrand Jan 18 '13 at 03:21
  • @vonbrand indeed, it is as you say. i don't attempt to differentiate between sub-flavours. and the order i check in (hopefully) removes most tricky situations (RHEL with apt-get installed), although i didn't do a lot of research. if RHEL can have apt-get installed, and Ubuntu users have yum... well, you're just bang out of luck. – Orwellophile Jan 22 '13 at 02:40
  • apt-get is also used by altlinux on rpm bazis, so this is the false answer – Малъ Скрылевъ Mar 10 '21 at 07:51
  • 1
    @МалъСкрылевъ I think my general point was: if you are only identifying the operating system in order to determine which package manager to run, then just check for the package manager. That's the "JavaScript" test-for-feature concept. FWIW, I have apt-get running here under cygwin (apt-cyg renamed). I should add that there entire concept of "test-for-feature" has worked for decades with configure and to an extent the more recent cmake build systems. – Orwellophile Mar 10 '21 at 11:12
  • well of example when I run the script on my linux it will return "debian" what is wrong, please note it on our post – Малъ Скрылевъ Mar 10 '21 at 18:16
7

In order of most probable success, these:

cat /etc/*version
cat /proc/version #linprocfs/version for FreeBSD when "linux" enabled
cat /etc/*release
uname -rv

cover most cases (AFAIK): Debian, Ubuntu, Slackware, Suse, Redhat, Gentoo, *BSD and perhaps others.

Eelvex
  • 686
  • cat /etc/*version does not work (there is no such file) on CentOS (at least on 6.4) – om-nom-nom Oct 23 '13 at 12:32
  • If you run the command in a container, /proc/version will contain the HOST distribution version, and not the container distribution one. – Dereckson Mar 24 '15 at 20:14
6

For most modern Linux OS systems, the file /etc/os-release is really becoming standard and is getting included in most OS. So inside your Bash script you can just include the file, and you will have access to all variables described here (for example: NAME, VERSION, ...)

So I'm just using this in my Bash script:

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
Chris Maes
  • 3,392
  • 1
    Just bear in mind that sourcing this file introduces another place to hide stuff. https://unix.stackexchange.com/a/433245/5132 – JdeBP Mar 10 '20 at 19:42
2

If the file /etc/debian_version exists, the distribution is Debian, or a Debian derivative. This file may have a release number; on my machine it is currently 6.0.1. If it is testing or unstable, it may say testing/unstable, or it may have the number of the upcoming release. My impression is that on Ubuntu at least, this file is always testing/unstable, and that they don't put the release number in it, but someone can correct me if I am wrong.

Fedora (recent releases at least), have a similar file, namely /etc/fedora-release.

Faheem Mitha
  • 35,108
  • Newer Debian versions use /etc/os-release instead. – Dereckson Mar 24 '15 at 20:14
  • 1
    @Dereckson I checked my wheezy machine, and it has both /etc/debian_version and /etc/os-release. – Faheem Mitha Mar 24 '15 at 20:17
  • Tested in a Jessie chroot created with debootstrap. But indeed, a local machine also under Jessie, this time installed a more conventional way, contains a /etc/debian_version file. So the way we prepare a Debian installation could affect the available release files, that's interesting. – Dereckson Mar 28 '15 at 10:05
  • Debian's os-release does not include the full version number from debian_version. See https://unix.stackexchange.com/questions/382531/ . – JdeBP Jul 29 '17 at 07:08
2

If you can't or don't want to use the LSB release file (due to the dependencies the package brings in), you can look for the distro-specific release files. Bcfg2 has a probe for the distro you might be able to use: http://trac.mcs.anl.gov/projects/bcfg2/browser/doc/server/plugins/probes/group.txt.

apaderno
  • 825
jsbillings
  • 24,406
0

This script works on Debian, (may need some tweak on 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
0

I find a good script from here which works for most of common linux dists:

#! /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
Mithril
  • 525
0

2 ways from many:

1) use

lsb_release -a

I tested it on CentOS 5.5 and Ubuntu 10.04

the output for CentOS is:

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

and for Ubuntu is:

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) enter the following command:

cat /etc/*-release

I tested it on CentOS 5.5 and Ubuntu 10.04, and it works fine.

Sam
  • 2,488
  • lsb_release is not in CentOS 6 (the min install fwiw) – a coder Oct 08 '13 at 15:34
  • 1
    lsb_release -a returns "-bash: lsb_release: command not found" on Raspberry with Raspbian (Debian 7.1 derived). – Peter Mortensen Jun 05 '14 at 11:34
  • Under Centos 7, you need the redhat-lsb-core package from EPEL installed, because why bother installing the "Linux Standard Base Core" package by default? Apparently you need the lsb-release package installed under Debian and derivatives. – Ben Stern May 29 '20 at 01:11
0

Some distros use *-issue files, some use *-version, some use *-release, or any combination of those 3 variations. Dirty and dirty way :

[root@radio ~]# for file in /etc/{*issue*,*version*,*release*}; do [[ -f $file ]] || continue; echo -- $file; cat $file; done;
-- /etc/issue
\S
Kernel \r on an \m

-- /etc/issue.net \S Kernel \r on an \m -- /etc/centos-release CentOS Linux release 7.9.2009 (Core) -- /etc/centos-release-upstream Derived from Red Hat Enterprise Linux 7.8 (Source) -- /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7"

-- /etc/redhat-release CentOS Linux release 7.9.2009 (Core) -- /etc/system-release CentOS Linux release 7.9.2009 (Core) -- /etc/system-release-cpe cpe:/o:centos:centos:7 [root@radio ~]#

ychaouche
  • 998
-1

Here is my simple chech_distro version. ^^;

#!/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

-1

Without version, just only dist:

cat /etc/issue | head -n +1 | awk '{print $1}'
coanor
  • 363
  • 1
    An answer from a year earlier by Yahya Yahyaoui said the same thing. Both of these answers were in fact addressed in 2011 in answers that have since been deleted. The reasons that they are wrong still apply. – JdeBP Jul 29 '17 at 06:56
-1

This was tested on Ubuntu 14 and CentOS 7

cat /etc/os-release | grep "PRETTY_NAME" | sed 's/PRETTY_NAME=//g' | sed 's/["]//g' | awk '{print $1}'
-1

Since the question doesn't specify restriction to /bin/sh etc, there is the solution with ruby shell interpreter.

There is a facter ruby gem, which gives you some facts about os OS, it analyzes OS release files, other data and prints to terminal screen. You can try is as follows, begining with rubygems installation:

# apt-get install ruby rubygems

Please use the case above that is eligible for your OS. Then install the gem itself.

# gem install facter

Then use:

$ facter

NOTE: See the facter gem sources to get more info in installation.

  • maybe because it requires ruby. I think we want only logic for /bin/sh – airtonix Oct 08 '20 at 22:34
  • @airtonix and where is the resitriction to "sh" in the question? – Малъ Скрылевъ Oct 09 '20 at 21:46
  • @МалъСкрылевъ it's implied by the tag [tag:shell-script]. Not that I'm downvoting, mind – Chris Davies Nov 06 '20 at 22:57
  • 1
    @МалъСкрылевъ should be obvious? you want a general function to return the platform name and so forth... but you choose to implement it in a way where it's useless on most platforms? Typically this operation is performed before installing anything else. so that means you have to work with /bin/sh – airtonix Feb 27 '21 at 03:55
  • @airtonix i saw here answer with python for example, anyway, the default installation can also include the ruby one with gems, but, that you have said isn't confirmed by the question conditions, because asker writes the initial state for check the os nowhere. This makes your comment false. – Малъ Скрылевъ Mar 10 '21 at 07:55
  • @МалъСкрылевъ ok, so if you're going to assume that ruby is pre-installed then just write a shell script that only returns "darwin" – airtonix Mar 11 '21 at 05:03
-1

If somebody needs the distro as well:

#!/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

Output:

It is: 18.04

Change to: lsb_release -sc to get the distro:

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

Output:

It is: bionic
jturi
  • 158
  • Won't your output of the first example be wrong, if you are not on 18.04 for a server that has does have the lsb_release command in the $PATH? – Mark Stewart Jun 14 '21 at 19:52
-4

This command works for Debian based and Redhat based distributions: Using tr filter, you convert the document to one-word-per-line format and then count the first line which contains the distribution name.

tr -s ' \011' '\012' < /etc/issue | head -n 1
  • The comments on the now-deleted answer from 2011 that said the same thing, still apply. As does the mis-placed answer, again now deleted, that said that /etc/issue did not contain a version or a name on zenwalk. This is an administrator-modifiable file containing a message presented to humans that has no guarantees of containing anything that can be pulled out programatically. – JdeBP Jul 29 '17 at 06:54