GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Mendapatkan Nama Distribusi Dan Nomor Versi Dalam Script Shell Sederhana?

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?
Linux
  1. Bagaimana menemukan Versi Ubuntu, Nama Kode dan Arsitektur OS di Shell Script

  2. Bagaimana cara mengidentifikasi nama perangkat lunak server DNS jarak jauh dan versinya?

  3. Bagaimana Cara Mendapatkan Alamat Ip Eksternal Dalam Script Shell?

  1. Bagaimana cara mendapatkan nama cabang git saat ini menjadi variabel dalam skrip Shell?

  2. Bagaimana cara mengurutkan berdasarkan ekstensi file dan kemudian nama?

  3. Bagaimana saya bisa mendapatkan nama distribusi dan nomor versi dalam skrip shell sederhana?

  1. Cara mendefinisikan dan menggunakan fungsi di Linux Shell Script

  2. Bagaimana saya bisa mendapatkan alamat IP eksternal saya dalam skrip shell?

  3. Bagaimana cara mendapatkan pid dari suatu proses dan mengaktifkan kill -9 di skrip Shell?