Debs kod adı lsb-release olmadan nasıl edinilir


15

Sources.list dosyasına yankı böylece debian kod adını yazdırmak için gerektiren bir komut dosyası oluşturmaya çalışıyorum.

Bu betiğin Debian'ın herhangi bir sürümünde çalışmasını sağlamaya çalışıyorum, bu yüzden sürüm kodunun bash değişkenini ayarlamayı umuyordum. Bunu yapmak basit olurdu (lsb_release -c ile), ancak dağıtım resimlerimiz varsayılan olarak lsb_release içermez - ve bu komut dosyası sources.list'i düzeltmek için gerekliyse, lsb-release'in apt-get ile yüklenmesi bir seçenek olmaz .

Sürüm numarasını ve sistemle ilgili diğer bilgileri almanın çeşitli yollarını buldum, ancak kod adını almak için güvenilir bir yer bulamıyorum.

Herhangi bir fikir büyük mutluluk duyacağız!

(Bunu test ettiğim işletim sistemi Debian Squeeze)


1
Bunu göz önünde bulundurarak bırakarak googled varsa lsb_release, check out 's kaynak kodunu ve yeniden icat etmeye istekli olup olmadığınızı görmek tüm bu
aexl

Yanıtlar:


20

Şunları kullanabilirsiniz /etc/os-release:

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

10

sıkmak ile gemi değil /etc/os-release, bu benim 'kesmek':

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

Yooo, kardeşim. Bu hasta! Tam olarak ihtiyacım olan şey. Linux Mint LMDE'de (Debian Edition) başka hiçbir şey Mint'in üzerine inşa edildiği Debian sürümünü görüntülemez. Ama çözümünüz öyle. Teşekkürler!
GTodorov

5

Debian sürüm numarası ile birlikte kod yazdırabilirsiniz:

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

VEYA kod adınızı numaradan ve parantezden çıkarabilirsiniz:

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

Veya daha awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
aptalca

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

@ Costas benim çıktı sadece kod adı.
PersianGulf

4
Sadece kod adı istiyorsanız çok basitawk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Costas

5

Debian dağıtımınızın kod adını adresinden alabilirsiniz /etc/os-release. Bu dosyayı ayrıştırmaya çalışmak yerine, mevcut ortamınızı etkilememek ve echoyeni ortamda bir komut yürütmek için yeni bir ortama kaynak oluşturabilirsiniz.

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

Yıkmak için:

  • env : Yeni bir ortamda bir komut çalıştırın.
  • -i : Ortam değişkenlerini mevcut ortamdan devralmayın.
  • bash : Os-release dosyasını kaynaklayacak ve echo komutunu çalıştıracak bir kabuğa sahip olmak için bash komutunu çalıştırın.
  • -c: bashEtkileşimli bir kabuk başlatmak yerine bir komut yürütmek istediğimizi söyleyin .
  • . /etc/os-release: İçeriğini os-releaseyeni çevremize aktarın. os-releaseortam değişkenlerini ayarlayan birkaç satır içerir ve bu yeni ortamımızdaki ortam değişkenlerini ayarlar.
  • ; : Bu komutu ayırın ve sonraki komutu çalıştırın.
  • echo $VERSION_CODENAME: os-releaseDosya tarafından ayarlanan kod adını yankılayın .

1
Harika cevap, bu tür dosyaları kullanmayı öğrendim. Böyle kullandım echo "$(. /etc/os-release && echo $VERSION_CODENAME"ama hiç yok olduğunu fark $VERSION_CODENAMEiçinde stretch. Çok üzücü bir haber.
Himura

2
echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"Görevim için iyi görünen bu şekilde sabitledim , ama kötü görünüyor
Himura

1
Bu en zarif yaklaşıma benziyor (en azından ayrıştırma yapılmadığı için)
aexl

2

Systemd için:

hostnamectl | grep "Operating System"

çıktı:

  Operating System: Debian GNU/Linux 8 (jessie)

Benim için çalışıyor.
AnthonyB

Debian Squeeze bir systemd paketine sahip olmadığından bu kesinlikle Debian Squeeze üzerinde çalışmaz. Ve Debian 8 Jessie ile (systemd varsayılan başlangıç ​​sistemi haline geldiğinde), hostnamectl yalnızca systemd yüklüyse kurulur, bu nedenle söz konusu sistem Debian'ın sunduğu diğer 3 veya 4 başlatma sistemlerinden birini kullanıyorsa bu çözüm çalışmaz.
Axel Beckert

0

Bir diğer buluşsal yöntem, şu anda çalışan işletim sistemi için paketlerin nereden geldiğini görmektir.

Basit (ve muhtemelen hataya eğilimli) varyant:

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

Daha güvenilir bir yol, ayrıntıları çıktısından ayrıştırmaktır apt-cache policy(başka parametre olmadan):

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

apt-cache policyyerel sistemde kullanılan tüm APT depolarını listeler. Yalnızca etiketli Debian(yani etiketli olmayanlar Debian debug) Debian kaynaklı filtreleri filtreliyoruz , sonra yalnızca ana arşive (değil contribveya non-free) bakıp uygun değeri seçiyoruz.

Daha da istikrarlı bir yaklaşım, eleman sırasına güvenmemek n=ve kalan satırdaki değeri bulmak olacaktır :

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

Yine başka bir olasılık, /var/lib/apt/lists/*Releasedosyaları izin vermek yerine kendiniz ayrıştırmak olacaktır 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

Benim ihtiyacım sources.list'e biraz URL eklemekti. Ve dinamik olarak sürüm kodu adını koymak için, bu kod parçasını kullanın (kod adının parantez arasında olduğu gerçeğine güveniyorum): @PersianGulf yanıt esinlenerek .

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


0

@Costas yanıtı üzerine genişleyen , bu komut 16.04 için işe yaramadı ve burada "Xerial Xerus" tam adını verdi ancak ben sadece "xerial" istedim, bu yüzden çekmeye çalıştığım repo farklı sürümleri ayırdı. Bu komut, yalnızca ilk sözcüğün döndürüleceğini ve tümünün küçük harf olacağını ekler:

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

Bu "jessie" için de geçerli


0

Sadece şunu kullanarak grep:

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

Deneyin (bu yazıyı yazarken çıktı):

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

0

Bu bcoca Debian sıkmak yazdı ne alternatif bir yaklaşım olabilir (veya olmayabilir) - ben Ubuntu 18.04 test:

$ cat /etc/debian_version
buster/sid
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.