จะรับชื่อรหัสเต็มของการกระจาย 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"

ผลลัพธ์ของคำสั่งด้านบนแสดงเฉพาะชื่อรหัสบางส่วนเท่านั้น (เช่น, trusty) ฉันจะได้รับชื่อรหัสเต็ม ( trusty tahr ) ของระบบ Ubuntu ที่ติดตั้งไว้ได้อย่างไร


1
มันดูเหมือนว่าจะมีขั้นตอนการมาบรรจบกันที่มีต่อการจัดหา/etc/os-releaseของไฟล์ บางทีคุณควรระบุสิ่งที่คุณหมายถึงโดยฉันจะได้รับสมญานามเต็ม (trusty tahr) ของระบบ Ubuntu ที่ติดตั้งของฉันได้อย่างไร . คุณต้องการสะท้อนกับเทอร์มินัลหรือคุณต้องการให้มันกำหนดให้กับตัวแปรหรือไม่? จะใช้กับระบบที่ไม่ใช่ {Ubuntu, Debian} หรือไม่
gniourf_gniourf

คำตอบ:


43

การใช้เครื่องมือภายนอกไม่มี:

คุณสามารถเพียงแค่แหล่งที่มา (คำสั่งแหล่งที่เป็นจุด.) /etc/os-releaseและคุณจะสามารถเข้าถึงตัวแปรทั้งหมดที่กำหนดไว้ที่นั่น:

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

แก้ไข หากคุณต้องการลบ14.04,ส่วน (ตามที่ terdon ถาม) คุณสามารถ:

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

โปรดทราบว่านี่เป็นบิต clunky เนื่องจากในการกระจายอื่น ๆVERSIONสนามสามารถมีรูปแบบที่แตกต่างกัน เช่นบนเดเบียนของฉัน

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

จากนั้นคุณสามารถจินตนาการถึงสิ่งนี้ (ในสคริปต์):

#!/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

1
(ก้องเป็น builtin) แต่ตกลงวิธีการเกี่ยวกับเรื่องนี้: . /etc/os-release && echo ${VERSION//[0-9,. ]/ }?
terdon

1
@terdon ;Dมีมากกว่าหนึ่งวิธีที่จะผิวแมว
gniourf_gniourf

เกิดอะไรขึ้นกับความคิดเห็นทั้งหมดที่นี่?
gniourf_gniourf

2
มีมากมายและคุณเป็นคนดีโดยเฉพาะ! ความคิดเห็นที่ไม่เกี่ยวข้องกับคำตอบจริงสามารถลบได้โดยไม่มีการเตือน
terdon

8

ตัวแปรของฉันเกี่ยวกับสิ่งที่เสนอมาแล้ว:

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

คำตอบที่สั้นที่สุด Bashiest

หากคุณไม่สนใจที่จะโหลด/etc/os-releaseเนื้อหาลงในสภาพแวดล้อมปัจจุบันของคุณคุณสามารถปลอมทุบตีโดยคิดว่ามันเป็นการโหลดสคริปต์ได้ง่ายพอสมควร:

bash <(cat /etc/os-release; echo 'echo ${VERSION/*, /}')

3
คุณกล้าพูดว่าbashier กว่าสิ่งอื่นใดจนถึงปัจจุบันได้อย่างไร มีอื่น ๆ :Dตอบทุบตีเต็มได้ที่นี่
gniourf_gniourf

ทำไมต้องลงคะแนน มันเป็นคำตอบที่ดี (แม้ว่าจะไม่มีสิ่งใดที่แตกต่างจากแนวคิดอื่นที่ได้รับมาก่อน)
gniourf_gniourf

2
เขาใช้การทดแทนกระบวนการอย่างชาญฉลาด +1
terdon

ตามที่คาดหวังจากเจ้านาย @terdon :)
Rinzwind

1
subshell ง่าย ๆ ก็จะทำงานเช่นกัน: ( . /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

คำอธิบาย:

  • lsb_release -rs -> พิมพ์เวอร์ชัน Ubuntu ที่คุณติดตั้ง

  • grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info -> คว้าทุกบรรทัดที่มีเวอร์ชั่นวางจำหน่ายของคุณในกรณีของฉันคือ 14.04

  • grep -m 1 "Description: Ubuntu "-> อีกครั้งคว้าเพียงบรรทัดแรกจับคู่ (เพราะ-mธง) Description: Ubuntuซึ่งมีสตริง

  • cut -d "'" -f2 -> พิมพ์หมายเลขฟิลด์ 2 ตามเครื่องหมายคำพูดตัวคั่นเดียว '

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

คำอธิบาย:

การประกาศและการกำหนดค่าตัวแปรใน awk ทำได้โดยผ่าน-vพารามิเตอร์ดังนั้นค่าของlsb_release -rs คำสั่งจะถูกกำหนดให้กับตัวแปรvarซึ่ง inturn ช่วยพิมพ์ฟิลด์ 4, ฟิลด์ 5 จากบรรทัดมีสตริง14.04และมีอยู่หากพบหนึ่งcutคำสั่งสุดท้ายช่วย ลบคำพูดเดียว


4

คำสั่งที่คุณต้องการคือ:

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

นี้เป็นอย่างมากที่น่าเกลียดและไม่เหมาะสม ฉันแน่ใจว่าควรมีวิธีที่ง่ายกว่าและมีปัญหาบางอย่าง


1
. /etc/os-release 
echo $VERSION

3
คุณยังต้องลบตัวเลขออกโปรดดูคำตอบของ @ gniourf_gniourf ด้านล่างซึ่งใช้วิธีการเดียวกันทั้งหมด
terdon

1

นี่คือตัวเลือกเพิ่มเติม พวกเขาทั้งหมดแยกวิเคราะห์/etc/os-releaseไฟล์ซึ่งใน 13.10 ของฉันมีลักษณะเช่นนี้:

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/"

Saucy Salamanderทั้งหมดของการแก้ปัญหาด้านล่างจะแยกบรรทัดที่สองในการผลิต

  1. grep

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

    -oหมายถึง "พิมพ์เฉพาะส่วนการจับคู่ของเส้น" และ-Pช่วยให้การแสดงผลปกติ Perl เข้ากันได้ นี้จะช่วยให้เราใช้\Kที่ทิ้งสิ่งที่ถูกจับคู่ขึ้นไปยังจุดที่ซึ่งรวมกับ-oหมายถึง "พิมพ์เฉพาะสิ่งที่ตรงกับหลังจาก\K . VERSION=ดังนั้นการแสดงออกปกติที่ใช้จริงจะตรงกับคำสองคำสุดท้ายของสายที่มี

  2. awk

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

    การตั้งค่าตัวคั่นเขตข้อมูลเป็น"และspaceหมายความว่าเขตข้อมูล 3d และ 4rth ของบรรทัดที่มีVERSION=เป็นสตริงที่เรากำลังตามหลัง

  3. sed

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

    -nสวิทช์ไม่ใส่ออกตามปกติไม่มีเส้นจะถูกพิมพ์ การ-rอนุญาตให้แสดงออกปกติขยาย จากนั้นในบรรทัดที่ตรงกันVERSION=เราจะลบทุกอย่างยกเว้นคำสองคำสุดท้าย pที่พิมพ์ปลายหมายถึง

  4. perl

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

    -nกระบวนการหมายถึง' สายทุกท่านที่มีสคริปต์ที่กำหนดโดย-e". the -lเพิ่มอักขระ newline ให้โทรพิมพ์ทุก (และบางสิ่งอื่น ๆ ที่ไม่ได้ relevevant ที่นี่). การแสดงออกปกติตรงกับสองคำสุดท้าย ( \bคือขอบเขตของคำ) และ VERSION=พิมพ์พวกเขาหากสายมี

  5. coreutils

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

    ที่นี่เราเพียงแค่grepบรรทัดที่เกี่ยวข้องและใช้cutการตั้งค่าตัวคั่นฟิลด์เป็นspace( -d ' ') และพิมพ์ทุกอย่างจากฟิลด์ที่ 2 ถึงจุดสิ้นสุดของบรรทัด tr -dคำสั่งจะลบ"จากปลาย

  6. Pure shell (ขโมยsourceความคิดที่ฉลาดของ @ gniourf_gniourf อย่างไร้ยางอาย):

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

    .แหล่งไฟล์ซึ่งจะทำให้ตัวแปรที่มีเปลือกและฉันใช้ทุบตีของการจัดการสตริงความสามารถในการลบหมายเลขเวอร์ชัน


1

ใช้ regex คุณสามารถทำได้:

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

คำอธิบาย:

นี้จะค้นหาบรรทัดที่มีอยู่ในแฟ้มVERSION /etc/os-releaseจากนั้นจะพบคำ 2 คำคั่นด้วยเว้นวรรค (Perl regex) แฟล็ก -o เก็บเฉพาะสิ่งที่ตรงกับการค้นหา

คุณต้องใช้[a-zA-Z]แทน `w 'เพื่อหลีกเลี่ยงการใส่ตัวเลข

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.