Bagaimana cara mendapatkan nama kode lengkap distribusi Ubuntu?

33
$ lsb_release -c
Codename:   trusty

$ cat /etc/issue
Ubuntu 14.04 LTS \n \l

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"

Output dari perintah di atas hanya menunjukkan nama kode parsial (yaitu, trusty). Bagaimana cara saya mendapatkan nama kode lengkap ( tahr terpercaya ) dari sistem Ubuntu yang saya instal?

Avinash Raj
sumber
1
Tampaknya ada proses konvergen menuju sumber file /etc/os-release. Mungkin Anda harus menentukan apa yang Anda maksud dengan Bagaimana cara mendapatkan nama kode lengkap (dapat dipercaya) dari sistem Ubuntu yang saya instal? . Apakah Anda hanya ingin menggemakannya di terminal, atau Anda memerlukannya untuk variabel? Apakah ini akan digunakan pada beberapa sistem non-{Ubuntu, Debian}?
gniourf_gniourf

Jawaban:

43

Tidak menggunakan alat eksternal:

Anda bisa sumber (perintah sumber adalah titik .) /etc/os-releasedan Anda akan memiliki akses ke semua variabel yang didefinisikan di sana:

$ . /etc/os-release
$ echo "$VERSION"
14.04, Trusty Tahr

Edit. Jika Anda ingin menghapus 14.04,bagian (seperti yang diminta oleh terdon), Anda dapat:

$ . /etc/os-release
$ read _ UBUNTU_VERSION_NAME <<< "$VERSION"
$ echo "$UBUNTU_VERSION_NAME"
Trusty Tahr

Perhatikan bahwa ini agak kikuk, karena pada distribusi lain, VERSIONbidang dapat memiliki format berbeda. Misalnya, pada debian saya,

$ . /etc/os-release
$ read _ UBUNTU_VERSION_NAME <<< "$VERSION"
$ echo "$UBUNTU_VERSION_NAME"
(wheezy)

Kemudian, Anda dapat membayangkan sesuatu seperti ini (dalam sebuah skrip):

#!/bin/bash

if [[ -r /etc/os-release ]]; then
    . /etc/os-release
    if [[ $ID = ubuntu ]]; then
        read _ UBUNTU_VERSION_NAME <<< "$VERSION"
        echo "Running Ubuntu $UBUNTU_VERSION_NAME"
    else
        echo "Not running an Ubuntu distribution. ID=$ID, VERSION=$VERSION"
    fi
else
    echo "Not running a distribution with /etc/os-release available"
fi
gniourf_gniourf
sumber
1
(echo adalah builtin) tapi OK, bagaimana dengan ini: . /etc/os-release && echo ${VERSION//[0-9,. ]/ }?
terdon
1
@terdon ada lebih dari satu cara untuk menguliti kucing ;D.
gniourf_gniourf
Apa yang terjadi dengan semua komentar di sini?
gniourf_gniourf
2
Ada banyak dan milikmu sangat bagus! Komentar yang tidak relevan dengan jawaban aktual dapat dihapus tanpa peringatan.
terdon
8

Varian saya tentang apa yang sudah ditawarkan:

. /etc/os-release; echo ${VERSION/*, /}

Jawaban Bashiest terpendek hingga saat ini.

Jika Anda tidak ingin memuat /etc/os-releasekonten ke lingkungan Anda saat ini, Anda dapat memalsukan bash dengan menganggapnya memuat skrip dengan cukup mudah:

bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')
Oli
sumber
3
Beraninya kau mengatakan lebih bashier daripada yang lain sampai saat ini ? ada jawaban bash penuh lainnya di sini :D.
gniourf_gniourf
Mengapa downvote? itu adalah jawaban yang baik (meskipun tanpa konsep berbeda dari yang diberikan sebelumnya).
gniourf_gniourf
2
Heh, penggunaan subtitusi proses yang cerdas, +1.
terdon
seperti yang diharapkan dari master @terdon :)
Rinzwind
1
Sebuah subkulit sederhana akan melakukan pekerjaan juga: ( . /etc/os-release && echo ${VERSION/*, /} ).
gniourf_gniourf
5

Grep:

$ grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info | grep -m 1 "Description: Ubuntu " | cut -d "'" -f2
Trusty Tahr

Penjelasan:

  • lsb_release -rs -> Mencetak versi Ubuntu yang Anda instal.

  • grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info -> Ambil semua baris yang berisi versi rilis Anda, dalam kasus saya ini 14,04.

  • grep -m 1 "Description: Ubuntu "-> Sekali lagi hanya meraih baris pertama yang cocok (karena -mbendera) yang berisi string Description: Ubuntu.

  • cut -d "'" -f2 -> mencetak angka bidang 2 sesuai dengan tanda kutip tunggal pembatas '

Awk:

$ awk -v var=$(lsb_release -rs) '$3~var {print $4" "$5;exit;}' /usr/share/python-apt/templates/Ubuntu.info | cut -d"'" -f2
Trusty Tahr

Penjelasan:

Mendeklarasikan dan menugaskan Variabel dalam awk dilakukan melalui -vparameter. Jadi nilai lsb_release -rs perintah ditugaskan ke variabel varyang inturn membantu untuk mencetak bidang 4, bidang 5 dari garis berisi string 14.04dan ada jika ditemukan satu. Akhirnya cutperintah membantu untuk hapus tanda kutip tunggal.

Avinash Raj
sumber
4

Perintah yang Anda cari adalah:

grep -oP '(?<=VERSION\=\"(\d\d)\.(\d\d)\,\ )(.*?)(?="$)' /etc/os-release

Ini sangat jelek dan tidak dioptimalkan. Saya yakin harus ada metode yang lebih mudah dan ini memiliki beberapa masalah.

Braiam
sumber
1
. /etc/os-release 
echo $VERSION
MegaBrutal
sumber
3
Anda masih perlu menghapus angka-angkanya, lihat jawaban @ gniourf_gniourf di bawah ini yang menggunakan pendekatan yang persis sama.
terdon
1

Berikut ini beberapa pilihan. Mereka semua menguraikan /etc/os-releasefile yang, pada 13,10 saya, terlihat seperti ini:

NAME="Ubuntu"
VERSION="13.10, Saucy Salamander"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 13.10"
VERSION_ID="13.10"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

Semua solusi di bawah ini akan menguraikan lini kedua untuk diproduksi Saucy Salamander.

  1. grep

    grep -oP 'VERSION=.* \K\w* \w*' /etc/os-release
    

    The -oberarti "mencetak hanya bagian pencocokan dari garis" dan -Pmemungkinkan Perl Regular Expressions Kompatibel. Hal ini memungkinkan kita menggunakan \Kyang membuang apa pun yang cocok sampai saat itu, yang dikombinasikan dengan -ocara "mencetak hanya apa yang cocok setelah itu \K. Jadi, ekspresi reguler yang sebenarnya digunakan akan cocok dengan dua kata terakhir dari baris yang berisi VERSION=.

  2. awk

    awk -F'[" ]' '/VERSION=/{print $3,$4}'  /etc/os-release
    

    Mengatur pemisah bidang ke "dan spaceberarti bidang 3d dan 4 dari baris yang berisi VERSION=adalah string yang kita kejar.

  3. sed

    sed -nr '/VERSION=/{s/.* (\w* \w*)"/\1/;p}' /etc/os-release
    

    The -nberalih Menekan output normal, tidak ada garis akan dicetak. The -rmemungkinkan diperpanjang ekspresi reguler. Kemudian, pada baris yang cocok VERSION=, kami akan menghapus semuanya kecuali dua kata terakhir. Di pbagian akhir berarti cetak.

  4. perl

    perl -lne '/VERSION=.*\b(\w+ \w+)/ && print $1' /etc/os-release
    

    The -nmeans 'memproses setiap baris input dengan script yang diberikan oleh -e". -lMenambahkan karakter baris baru untuk setiap panggilan cetak (dan beberapa hal lain yang tidak relevan di sini). Ekspresi reguler cocok dengan dua kata terakhir ( \badalah batas kata) dan mencetaknya jika garis berisi VERSION=.

  5. coreutils

    grep VERSION= /etc/os-release | cut -d ' ' -f 2-  | tr -d '"' 
    

    Di sini, kami hanya grepbaris yang relevan dan menggunakan cutpengaturan pemisah bidang ke space( -d ' ') dan mencetak semuanya dari bidang ke-2 hingga akhir baris. The tr -dperintah akan menghapus "dari akhir.

  6. Shell murni (tanpa malu-malu mencuri sourceide pintar @ gniourf_gniourf ):

    . /etc/os-release && echo ${VERSION//[0-9,. ]/ }
    

    The .sumber file yang membuat variabel tersedia untuk shell dan saya menggunakan bash manipulasi string kemampuan untuk menghapus nomor versi.

terdon
sumber
1

Menggunakan regex Anda bisa melakukan ini:

grep 'VERSION' /etc/os-release | grep -oP "[a-zA-Z]+ [a-zA-Z]+"

Penjelasan:

Ini mencari baris dengan VERSIONdalam file /etc/os-release. Kemudian ia menemukan 2 kata berturut-turut yang dipisahkan oleh spasi (Perl regex). Bendera -o hanya menyimpan apa yang cocok dengan pencarian.

Anda harus menggunakan [a-zA-Z]alih-alih `w` untuk menghindari termasuk digit.

Romain Vincent
sumber