私はそれをsources.listファイルにエコーできるように、debianコードネームを出力する必要があるスクリプトを作成しようとしています。
私はこのスクリプトをDebianのどのバージョンでも動作させるようにしているので、リリースコードネームのbash変数を設定したいと思っていました。これは簡単です(lsb_release -cを使用)。ただし、デフォルトではデプロイメントイメージにlsb_releaseは含まれていません。sources.listを修正するためにこのスクリプトが必要なため、apt-getを使用してlsb-releaseをインストールすることはできません。 。
システムに関するリリース番号やその他の情報を取得する方法はたくさんありますが、コードネームを取得するための信頼できる場所が見つかりません。
どんなアイデアでも大歓迎です!
(私がこれをテストしているOSはDebian Squeezeです)
/etc/os-release
を使用できます。
(
. /etc/os-release
printf '%s\n' "$VERSION"
)
7 (wheezy)
squeezeには/etc/os-release
が付属していません。これが私の「ハック」です。
dpkg --status tzdata|grep Provides|cut -f2 -d'-'
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
Debianディストリビューションのコード名は/etc/os-release
から取得できます。このファイルを解析する代わりに、現在の環境に影響を与えないように、新しい環境にファイルを供給し、その新しい環境でecho
コマンドを実行できます。
env -i bash -c '. /etc/os-release; echo $VERSION_CODENAME'
分解するには:
env
:新しい環境でコマンドを実行します。-i
:既存の環境から環境変数を継承しません。bash
:bashを実行して、os-releaseファイルを読み込むシェルがあり、echoコマンドを実行できるようにします。-c
:インタラクティブシェルを起動するのではなく、コマンドを実行することをbash
に伝えます。. /etc/os-release
:os-release
のコンテンツを新しい環境に取り込みます。 os-release
には、環境変数を設定する数行が含まれています。これにより、これらの環境変数が新しい環境に設定されます。;
:このコマンドを区切り、次のコマンドを実行します。echo $VERSION_CODENAME
:os-release
ファイルで設定されたコード名をエコーアウトします。Systemdの場合:
hostnamectl | grep "Operating System"
出力:
Operating System: Debian GNU/Linux 8 (jessie)
もう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}'
さらにもう1つの可能性は、/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}'
これはbcocaがDebian squeezeに書いたものへの代替アプローチかもしれません(またはそうでないかもしれません)-私はそれをUbuntu 18.04でテストしました:
$ cat /etc/debian_version
buster/sid
@ Costas の回答を展開すると、そのコマンドは16.04では機能せず、完全な名前「Xerial Xerus」が返されましたが、「xerial」しか欲しなかったので、そこからプルしようとしていました異なるバージョンを分離しました。このコマンドは、最初のWordのみが返され、すべて小文字になることを追加します。
awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release | awk '{print $1}' | awk '{ print tolower($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
私の必要は、sources.listにURLを追加することでした。そして、バージョンコード名を動的に配置できるように、私は次のコードを使用します(コード名が括弧内にあるという事実に依存しています): @ PersianGulfanswer 。
grep "VERSION=" /etc/os-release |awk -F= {' print tolower($2)'}|sed s/\.*\(//g | sed s/" ".*\"//g