lsb-releaseなしでDebianコードネームを取得する方法


13

私はそれをsources.listファイルにエコーできるように、debianコード名を出力する必要があるスクリプトを作成しようとしています。

私はこのスクリプトをDebianのどのバージョンでも動作させるようにしているので、リリースコードネームのbash変数を設定したいと思っていました。これは簡単です(lsb_release -cを使用)。ただし、デフォルトではデプロイメントイメージにlsb_releaseが含まれていません。sources.listを修正するためにこのスクリプトが必要なため、apt-getを使用してlsb-releaseをインストールすることはできません。 。

システムに関するリリース番号やその他の情報を取得する方法はたくさんありますが、コードネームを取得するための信頼できる場所が見つかりません。

どんなアイデアでも大歓迎です!

(私がこれをテストしているOSはDebian Squeezeです)


1
削除を検討しているときにこれをlsb_release
ググった

回答:


20

以下を使用できます/etc/os-release

(
  . /etc/os-release
  printf '%s\n' "$VERSION"
)
7 (wheezy)

10

squeezeにはが付属していません/etc/os-release。これは私の「ハック」です。

dpkg --status tzdata|grep Provides|cut -f2 -d'-'

やあ、仲間。これはヤバい!まさに私が必要としたもの。Linux Mint LMDE(Debian Edition)の他の部分では、Mintが構築されたDebianのバージョンが表示されません。しかし、あなたの解決策はします。ありがとう!
GTodorov

4

debianのバージョン番号と共にコードを印刷できます:

root@debian:/home/mohsen# grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g
8 (jessie)

または、番号からコード名を取り出して、次のように整理することもできます。

grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g |sed s/[0-9]//g | sed s/\)$//g |sed s/\(//g
jessie

または、より慣用的に:awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
jasonwryan

1
@jasonwryan Evenawk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
Costas

@Costas出力はコードネームのみです。
PersianGulf 2015年

3
コード名だけが必要な場合、それは非常に簡単ですawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas

4

Debianディストリビューションのコード名はから取得できます/etc/os-release。このファイルを解析する代わりに、現在の環境に影響を与えないように、ファイルを新しい環境にソースしecho、その新しい環境でコマンドを実行できます。

env -i bash -c '. /etc/os-release; echo $VERSION_CODENAME'

分解するには:

  • env :新しい環境でコマンドを実行します。
  • -i :既存の環境から環境変数を継承しないでください。
  • bash :bashを実行して、os-releaseファイルのソースとなるechoを実行するシェルを用意します。
  • -cbash対話型シェルを起動するのではなく、コマンドを実行することを伝えます。
  • . /etc/os-release:のコンテンツをos-release新しい環境に取り込みます。os-release環境変数を設定する数行が含まれています。これにより、新しい環境でこれらの環境変数が設定されます。
  • ; :このコマンドを分離して、次のコマンドを実行します。
  • echo $VERSION_CODENAMEos-releaseファイルによって設定されたコード名をエコーアウトします。

すばらしい回答です。そのようなファイルを使用する方法を学びました。私はこのように使用しましecho "$(. /etc/os-release && echo $VERSION_CODENAME"たが、にはないことに気付き$VERSION_CODENAMEましたstretch。とても悲しいニュース。
Himura

1
私の仕事には問題ないように私はそれをこのように修正しましたecho "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"が、それは悪いように見えます
Himura

これは最もエレガントなアプローチのように見えます(少なくとも解析が含まれていないおかげで)
aexl

2

systemdの場合:

hostnamectl | grep "Operating System"

出力:

  Operating System: Debian GNU/Linux 8 (jessie)

わたしにはできる。
AnthonyB 2017年

Debian Squeezeにはsystemdパッケージがなかったため、これは確かにDebian Squeezeでは機能しません。Debian 8 Jessie(systemdがデフォルトのinitシステムになった)でも、hostnamectlはsystemdがインストールされている場合にのみインストールされるため、問題のシステムがDebianが提供する他の3または4のinitシステムのいずれかを使用している場合、このソリューションは機能しません。
アクセルベッケルト2017

0

もう1つのヒューリスティックは、現在実行中のOSのパッケージのソースを確認することです。

単純な(そしておそらくエラーが発生しやすい)バリアント:

fgrep -r /debian/ /etc/apt/sources.list \
    | egrep -v '^ *#' \
    | awk '{print $3}' \
    | egrep -v '[-/]'  \
    | uniq

より信頼できる方法は、apt-cache policy(追加のパラメーターなしで)の出力から詳細を解析することです。

apt-cache policy \
    | fgrep o=Debian, \
    | fgrep ,l=Debian, \
    | fgrep ,c=main, \
    | awk -F '[,=]' '{print $6}'

apt-cache policyローカルシステムで使用中のすべてのAPTリポジトリを一覧表示します。Debianに由来するものDebian(つまり、ラベルが付いていないものDebian debug)を除外し、メインアーカイブ(contribまたは以外non-free)のみを調べて、対応する値を選択します。

さらに安定したアプローチは、要素の順序に依存せずn=、残りの行で値を見つけることです。

apt-cache policy \
    | fgrep o=Debian, \
    | fgrep ,l=Debian, \
    | fgrep ,c=main, \
    | egrep -o 'n=[^, ]*' \
    | awk -F= '{print $2}'

さらに別の可能性は、/var/lib/apt/lists/*Releaseファイルを解析せずに自分で解析することapt-cacheです。

egrep -l '^Origin: Debian$' /var/lib/apt/lists/*Release \
    | xargs egrep -l '^Label: Debian$' \
    | xargs egrep -L 'Codename: .*-' \
    | xargs fgrep Codename \
    | awk '{print $2}'

0

私の必要性は、sources.listにいくつかのURLを追加することでした。そして、バージョンコード名を動的に配置できるようにするために、次のコードを使用します(コード名が括弧内にあるという事実に依存します)。@PersianGulf 回答に触発されまし

grep "VERSION=" /etc/os-release |awk -F= {' print tolower($2)'}|sed s/\.*\(//g | sed s/" ".*\"//g


0

@Costasの回答を拡張すると、そのコマンドは16.04では機能しませんでした。完全な名前の「Xerial Xerus」が返されましたが、「xerial」だけが必要でした。このコマンドは、最初の単語のみが返され、すべて小文字になることを追加します。

awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release | awk '{print $1}' | awk '{ print tolower($0) }'

これは「ジェシー」でも機能します


0

のみ使用grep

grep -Po 'VERSION="[0-9]+ \(\K[^)]+' /etc/os-release

試してみてください(この投稿の執筆時点での出力):

$ docker run --rm debian:stable-slim grep -Po 'VERSION="[0-9]+ \(\K[^)]+' /etc/os-release
stretch

0

これはbcocaがDebian squeezeに書いたものへの代替アプローチかもしれません(またはそうでないかもしれません)-私はそれをUbuntu 18.04でテストしました:

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