Làm cách nào để có được tên mã đầy đủ của phân phối 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"

Đầu ra của các lệnh trên chỉ hiển thị tên mã một phần (nghĩa là trusty). Làm cách nào để có được tên mã đầy đủ ( đáng tin cậy ) của hệ thống Ubuntu đã cài đặt của tôi?


1
Dường như có một quy trình hội tụ hướng tới việc tìm nguồn cung cấp tệp /etc/os-release. Có lẽ bạn nên chỉ định ý của bạn bằng cách làm thế nào để tôi có được tên mã đầy đủ (đáng tin cậy) của hệ thống Ubuntu đã cài đặt của tôi? . Bạn chỉ muốn lặp lại nó trên thiết bị đầu cuối, hoặc bạn cần nó được gán cho một biến? Đây có phải sẽ được sử dụng trên một số hệ thống không phải là Ubuntu, Debian} không?
gniourf_gniourf

Câu trả lời:


43

Không sử dụng các công cụ bên ngoài:

Bạn chỉ có thể nguồn (lệnh nguồn là một dấu chấm .) /etc/os-releasevà bạn sẽ có quyền truy cập vào tất cả các biến được xác định ở đó:

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

Chỉnh sửa. Nếu bạn muốn xóa 14.04,phần (theo yêu cầu của terdon), bạn có thể:

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

Lưu ý rằng điều này hơi khó hiểu, vì trên các bản phân phối khác, VERSIONtrường có thể có định dạng khác nhau. Ví dụ, trên debian của tôi,

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

Sau đó, bạn có thể tưởng tượng một cái gì đó như thế này (trong một kịch bản):

#!/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
(echo được dựng sẵn) nhưng OK, làm thế nào về điều này : . /etc/os-release && echo ${VERSION//[0-9,. ]/ }?
terdon

1
@terdon có nhiều hơn một cách để lột da một con mèo ;D.
gniourf_gniourf

Điều gì đã xảy ra với tất cả các ý kiến ​​ở đây?
gniourf_gniourf

2
Có rất nhiều và bạn là một người đặc biệt tốt! Những bình luận không liên quan đến câu trả lời thực tế có thể bị xóa mà không cần cảnh báo.
terdon

8

Biến thể của tôi về những gì đã được cung cấp:

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

Câu trả lời ngắn nhất, Bashiest cho đến nay.

Nếu bạn không quan tâm tải /etc/os-releasenội dung của mình vào môi trường hiện tại của mình, bạn có thể giả mạo bash để nghĩ rằng nó tải một tập lệnh khá dễ dàng:

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

3
Làm thế nào bạn dám nói bashier hơn bất cứ điều gì khác cho đến nay ? Có những câu trả lời đầy đủ khác ở đây :D.
gniourf_gniourf

Tại sao các downvote? đó là một câu trả lời tốt (mặc dù không có gì khác biệt về mặt khái niệm so với những câu hỏi khác được đưa ra trước đó).
gniourf_gniourf

2
Heh, sử dụng thông minh thay thế quá trình, +1.
terdon

như mọi người mong đợi từ chủ nhân @terdon :)
Rinzwind

1
Một subshell đơn giản cũng sẽ làm công việc : ( . /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

Giải trình:

  • lsb_release -rs -> In phiên bản Ubuntu đã cài đặt của bạn.

  • grep $(lsb_release -rs) /usr/share/python-apt/templates/Ubuntu.info -> Lấy tất cả các dòng có phiên bản phát hành của bạn, trong trường hợp của tôi là 14.04.

  • grep -m 1 "Description: Ubuntu "-> Một lần nữa chỉ lấy dòng đầu tiên phù hợp (vì -mcờ) có chứa chuỗi Description: Ubuntu.

  • cut -d "'" -f2 -> in trường số 2 theo dấu ngoặc đơn '

Aw:

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

Giải trình:

Khai báo và gán Biến trong awk được thực hiện thông qua -vtham số. Vì vậy, giá trị của lsb_release -rs lệnh được gán cho biến varmà inturn giúp in trường 4, trường 5 từ các dòng chứa chuỗi 14.04và tồn tại nếu nó tìm thấy một. Cuối cùng, cutlệnh giúp loại bỏ các trích dẫn duy nhất.


4

Lệnh bạn đang tìm kiếm là:

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

Điều này rất xấu và không được tối ưu hóa. Tôi chắc chắn nên có một phương pháp dễ dàng hơn và điều này có một số vấn đề.


1
. /etc/os-release 
echo $VERSION

3
Bạn vẫn cần xóa các số, xem câu trả lời của @ gniourf_gniourf bên dưới sử dụng chính xác cùng một cách tiếp cận.
terdon

1

Dưới đây là một số lựa chọn hơn. Tất cả đều phân tích /etc/os-releasetệp, vào ngày 13.10 của tôi, trông như thế này:

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

Tất cả các giải pháp dưới đây sẽ phân tích dòng thứ hai để sản xuất Saucy Salamander.

  1. grep

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

    -onghĩa là "chỉ in phần phù hợp của dòng" và -Pcho phép Biểu thức chính quy tương thích Perl. Điều này cho phép chúng ta sử dụng \Kmà vứt bỏ những gì còn phù hợp đến thời điểm đó, mà kết hợp với -ophương tiện "chỉ in những gì phù hợp sau khi các \K. Vì vậy, khái niệm thường xuyên thực tế sử dụng sẽ phù hợp với hai chữ cuối cùng của một dòng có chứa VERSION=.

  2. awk

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

    Đặt dấu tách trường thành "spacecó nghĩa là các trường 3d và 4 của dòng chứa VERSION=là chuỗi chúng ta theo sau.

  3. sed

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

    Công -ntắc chặn đầu ra bình thường, không có dòng nào được in. Việc -rcho phép mở rộng các biểu thức chính quy. Sau đó, trên các dòng khớp VERSION=, chúng tôi sẽ xóa mọi thứ trừ hai từ cuối cùng. Ở pcuối có nghĩa là in.

  4. perl

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

    Phương -ntiện 'xử lý mọi dòng đầu vào với tập lệnh được đưa ra bởi -e". Thêm -lmột ký tự dòng mới vào mỗi lệnh gọi in (và một số nội dung khác không thể loại bỏ ở đây). Biểu thức chính quy khớp với hai từ cuối ( \blà ranh giới từ) và in chúng nếu dòng chứa VERSION=.

  5. lõi

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

    Ở đây, chúng tôi chỉ grepdòng có liên quan và sử dụng cutcài đặt dấu tách trường thành space( -d ' ') và in mọi thứ từ trường thứ 2 đến cuối dòng. Các tr -dlệnh sẽ xóa các "từ kết thúc.

  6. Vỏ tinh khiết (ăn cắp không biết xấu hổ @ gniourf_gniourf's sourceý tưởng thông minh ):

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

    Các .nguồn tệp tạo các biến có sẵn cho trình bao và tôi sử dụng các khả năng thao tác chuỗi của bash để xóa số phiên bản.


1

Sử dụng regex bạn có thể làm điều này:

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

Giải trình:

Điều này tìm kiếm dòng với VERSIONtrong tập tin /etc/os-release. Sau đó, nó tìm thấy 2 từ liên tiếp được ngăn cách bởi một khoảng trắng (Perl regex). Cờ -o chỉ giữ những gì phù hợp với tìm kiếm.

Bạn phải sử dụng [a-zA-Z]thay vì `w` để tránh bao gồm các chữ số.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.