Pracuji na jednoduchém bash skriptu, který by měl být schopen běžet na distribucích Ubuntu a CentOS (podpora Debianu a Fedory/RHEL by byla výhodou) a potřebuji znát název a verzi distribuce, na které skript běží ( za účelem spuštění konkrétních akcí, například vytváření úložišť). Zatím mám toto:
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
 Toto zdá se pracovat, vrací ubuntu nebo centos (jiné jsem nezkoušel) jako název vydání. Mám však pocit, že musí existovat jednodušší a spolehlivější způsob, jak to zjistit – je to pravda?
 Nefunguje to pro RedHat.
 /etc/redhat-release obsahuje:
 Redhat Linux Entreprise release 5.5
Verze tedy není třetí slovo, raději použijte :
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"
Přijatá odpověď:
 Chcete-li získat OS a VER , nejnovější standard se zdá být /etc/os-release .
 Před tím existoval lsb_release a /etc/lsb-release . Předtím jste museli hledat různé soubory pro každou distribuci.
Zde je to, co bych navrhoval
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
 Myslím, že uname získat ARCH je stále nejlepší způsob. Ale příklad, který jste uvedl, se zjevně zabývá pouze systémy Intel. Buď bych to nazval BITS takhle:
case $(uname -m) in
x86_64)
    BITS=64
    ;;
i*86)
    BITS=32
    ;;
*)
    BITS=?
    ;;
esac
 Nebo změňte ARCH být běžnější, přesto jednoznačné verze:x86 a x64 nebo podobně:
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
ale to je samozřejmě na vás.
Související:Jaký je rozdíl mezi print a printf v awk?