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?