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)のみが表示されます。インストールされているUbuntuシステムの完全なコードネーム(trusty tahr)を取得するにはどうすればよいですか?


1
ファイルの調達に向けた収束プロセスがあるようです/etc/os-release。たぶん、インストールされたUbuntuシステムの完全なコードネーム(trusty tahr)を取得するにはどうすればいいのでしょうか?。端末にエコーするだけですか、それとも変数に割り当てる必要がありますか?これは、{Ubuntu、Debian}以外のシステムで使用される予定ですか?
gniourf_gniourf 14

回答:


43

外部ツールを使用しない:

ただソース(sourceコマンドはドット.)で、/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

他のディストリビューションでは、VERSIONフィールドの形式が異なる可能性があるため、これは少し不格好です。例えば、私のdebianでは、

$ . /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
(エコービルトイン)しかし、OK、これはどう. /etc/os-release && echo ${VERSION//[0-9,. ]/ }ですか:?
テルドン

1
@terdon猫の皮を剥ぐ方法は複数あり;Dます。
gniourf_gniourf 14

ここのすべてのコメントはどうなりましたか?
gniourf_gniourf 14

2
たくさんあり、あなたのものは特に良いものです!実際の回答とは無関係のコメントは、警告なしに削除できます。
テルドン

8

すでに提供されているものの私のバリアント:

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

これまでで最も短い、最も簡単な答え。

/etc/os-releaseのコンテンツを現在の環境にロードする必要がない場合は、bashを偽装して、スクリプトをかなり簡単にロードしていると考えることができます。

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

3
これまでにないほどバシエを言うのですか?他の完全なbashの回答がここにあります:D
gniourf_gniourf 14

なぜ下票なのですか?それは良い答えです(ただし、それ以前に与えられた他の概念と概念的に異なるものはありません)
gniourf_gniourf 14

2
へえ、プロセス置換の巧妙な使用、+ 1。
テルドン

マスター@terdonから期待されるように:)
Rinzwind 14

1
単純なサブシェルも同様に機能します( . /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その結果、フィールド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の回答を参照してください。
テルドン

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

以下のソリューションはすべて、2行目を解析して生成しSaucy Salamanderます。

  1. grep

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

    -oは、「行の一致部分のみを印刷する」という意味で、-PPerl互換の正規表現を有効にします。これは、私たちは使用することができます\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=、最後の2つの単語を除くすべてを削除します。p最後の手段の印刷で。

  4. perl

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

    -n手段「のプロセスによって与えられたスクリプトを使用して、すべての入力行-e」は。-lすべての印刷コール(とrelevevantここではない、いくつかの他のもの)に改行文字を追加します。正規表現が一致した最後の二つの単語(\bワード境界である)と、行にが含まれている場合、それらを出力しますVERSION=

  5. coreutils

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

    ここではgrep、関連する行のみを使用cutし、フィールドセパレーターをspace-d ' ')に設定して、2番目のフィールドから行末までをすべて印刷します。tr -dコマンドが削除されます"端から。

  6. 純粋なシェル(@gniourf_gniourfの巧妙なsourceアイデアを恥知らずに盗む):

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

    .ソースシェル変数を使用できるようになり、私はbashの者の使用するファイルの文字列操作機能をバージョン番号を削除します。


1

正規表現を使用すると、これを行うことができます:

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

説明:

これVERSIONにより、ファイル内の行が検索されます/etc/os-release。次に、スペースで区切られた2つの連続した単語を見つけます(Perl正規表現)。-oフラグは、検索に一致するもののみを保持します。

[a-zA-Z]数字を含めないようにするには、「w」の代わりに使用する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.