Saya sedang mengerjakan skrip bash sederhana yang seharusnya dapat berjalan di distribusi Ubuntu dan CentOS (dukungan untuk Debian dan Fedora/RHEL akan menjadi nilai tambah) dan saya perlu mengetahui nama dan versi distribusi yang dijalankan skrip ( untuk memicu tindakan tertentu, misalnya pembuatan repositori). Sejauh ini yang saya dapatkan adalah ini:
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
Ini sepertinya untuk bekerja, mengembalikan ubuntu atau centos (Saya belum mencoba yang lain) sebagai nama rilis. Namun, saya merasa pasti ada cara yang lebih mudah dan lebih andal untuk mengetahui hal ini — apakah itu benar?
Ini tidak bekerja untuk RedHat.
/etc/redhat-release berisi :
Redhat Linux Entreprise rilis 5.5
Jadi, versinya bukan kata ketiga, sebaiknya gunakan :
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"
Jawaban yang Diterima:
Untuk mendapatkan OS dan VER , standar terbaru tampaknya adalah /etc/os-release .
Sebelumnya ada lsb_release dan /etc/lsb-release . Sebelum itu, Anda harus mencari file yang berbeda untuk setiap distribusi.
Inilah yang saya sarankan
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
Saya pikir uname untuk mendapatkan ARCH masih merupakan cara terbaik. Tapi contoh yang Anda berikan jelas hanya menangani sistem Intel. Saya akan menyebutnya BITS seperti ini:
case $(uname -m) in
x86_64)
BITS=64
;;
i*86)
BITS=32
;;
*)
BITS=?
;;
esac
Atau ubah ARCH menjadi versi yang lebih umum, namun tidak ambigu:x86 dan x64 atau serupa:
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
tapi tentu saja itu terserah Anda.
Terkait:Apa perbedaan antara print dan printf di awk?