Você pode usar /etc/os-release
:
(
. /etc/os-release
printf '%s\n' "$VERSION"
)
7 (wheezy)
Eu estou tentando criar um script que requer que eu imprima o codinome debian para que eu possa ecoá-lo no arquivo sources.list.
Eu estou tentando fazer este script funcionar em qualquer versão do Debian, então eu esperava definir uma variável bash do nome de código do lançamento. Isso seria simples de fazer (com lsb_release -c), no entanto, nossas imagens de implantação não contêm lsb_release por padrão - e com esse script sendo necessário para corrigir o sources.list, instalar o lsb-release com o apt-get não seria uma opção .
Eu encontrei várias maneiras de obter o número do release e outras informações sobre o sistema, mas não consigo encontrar um local confiável para obter o codinome.
Qualquer ideia seria muito apreciada!
(o SO que estou testando é o Debian Squeeze)
Você pode usar /etc/os-release
:
(
. /etc/os-release
printf '%s\n' "$VERSION"
)
7 (wheezy)
squeeze não vem com /etc/os-release
, esse é o meu 'hack':
dpkg --status tzdata|grep Provides|cut -f2 -d'-'
Você pode imprimir o código junto com o número da versão do debian:
root@debian:/home/mohsen# grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g
8 (jessie)
OU você pode descobrir seu nome de código do número e do pranthese:
grep "VERSION=" /etc/os-release |awk -F= {' print $2'}|sed s/\"//g |sed s/[0-9]//g | sed s/\)$//g |sed s/\(//g
jessie
Para o systemd:
hostnamectl | grep "Operating System"
saída:
Operating System: Debian GNU/Linux 8 (jessie)
Outra heurística é ver de onde vêm os pacotes para o SO atualmente em execução.
Variante simples (e provavelmente sujeita a erros):
fgrep -r /debian/ /etc/apt/sources.list \
| egrep -v '^ *#' \
| awk '{print $3}' \
| egrep -v '[-/]' \
| uniq
Uma maneira mais confiável é analisar os detalhes da saída de apt-cache policy
(sem mais parâmetros):
apt-cache policy \
| fgrep o=Debian, \
| fgrep ,l=Debian, \
| fgrep ,c=main, \
| awk -F '[,=]' '{print $6}'
apt-cache policy
lista todos os repositórios do APT em uso no sistema local. Nós filtramos os que são originários do Debian, que são rotulados apenas Debian
(isto é, não aqueles rotulados como Debian debug
), então olhe apenas para o arquivo principal (não contrib
ou non-free
) e então selecione o valor correspondente .
Uma abordagem ainda mais estável seria não confiar na ordem dos elementos e encontrar o valor n=
na linha restante:
apt-cache policy \
| fgrep o=Debian, \
| fgrep ,l=Debian, \
| fgrep ,c=main, \
| egrep -o 'n=[^, ]*' \
| awk -F= '{print $2}'
Outra possibilidade seria analisar os arquivos /var/lib/apt/lists/*Release
ao invés de deixar apt-cache
fazer isso:
egrep -l '^Origin: Debian$' /var/lib/apt/lists/*Release \
| xargs egrep -l '^Label: Debian$' \
| xargs egrep -L 'Codename: .*-' \
| xargs fgrep Codename \
| awk '{print $2}'
Minha necessidade era adicionar algum URL em sources.list. E para poder colocar dinamicamente o nome do código da versão, eu uso este pedaço de código (confie no fato de que o nome do código está entre parênteses): Inspirado por @ PersianGulf resposta .
grep "VERSION=" /etc/os-release |awk -F= {' print tolower($2)'}|sed s/\.*\(//g | sed s/" ".*\"//g
Expandindo a @Costas resposta, esse comando não funcionou para 16.04, onde retornou o nome completo " Xerial xerus ", mas eu só queria" xerial ", é assim que o repositório que eu estava tentando puxar separou as diferentes versões. Este comando adiciona que apenas a primeira palavra será retornada e que será toda em minúsculas:
awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release | awk '{print $1}' | awk '{ print tolower($0) }'
Isso funciona para "jessie" também