J'essaie de créer un script qui nécessite que j'imprime le nom de code debian afin de pouvoir l'écho dans le fichier sources.list.
J'essaie de faire fonctionner ce script sur n'importe quelle version de Debian, alors j'avais espéré définir une variable bash du nom de code de la version. Ce serait simple à faire (avec lsb_release -c), mais nos images de déploiement ne contiennent pas lsb_release par défaut - et avec ce script étant requis pour corriger les sources.list, installer lsb-release avec apt-get ne serait pas une option .
J'ai trouvé de nombreuses façons d'obtenir le numéro de version et d'autres informations sur le système, mais je ne trouve pas un endroit fiable pour obtenir le nom de code.
Toutes les idées seraient grandement appréciées!
(OS avec lequel je teste ceci est Debian Squeeze)
lsb_release
, consultez le code source de ce et de voir si vous êtes prêt à réinventer tout ce quiRéponses:
Vous pouvez utiliser
/etc/os-release
:la source
Squeeze n'est pas livré avec
/etc/os-release
, c'est mon «hack»:la source
Vous pouvez imprimer le code avec le numéro de version de debian:
OU vous pouvez masquer votre nom de code du numéro et du pranthèse:
la source
awk -F= '/VERSION=/ {gsub(/"/,""); print $2}' /etc/os-release
awk -F"[=\"]+" '/VERSION=/ {print $2}' /etc/os-release
awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release
Vous pouvez obtenir le nom de code de votre distribution Debian à partir de
/etc/os-release
. Au lieu d'essayer d'analyser ce fichier, vous pouvez le source dans un nouvel environnement, afin de ne pas impacter votre environnement actuel, et exécuter uneecho
commande dans ce nouvel environnement.Pour le décomposer:
env
: Exécutez une commande dans un nouvel environnement.-i
: N'héritez pas des variables d'environnement de l'environnement existant.bash
: Exécutez bash afin d'avoir un shell dans lequel le fichier os-release sera source et pour exécuter la commande echo.-c
: Dites quebash
nous voulons exécuter une commande plutôt que de démarrer un shell interactif.. /etc/os-release
: Source du contenu deos-release
dans notre nouvel environnement.os-release
contient quelques lignes définissant les variables d'environnement, et cela définira ces variables d'environnement dans notre nouvel environnement.;
: Séparez cette commande et exécutez la commande suivante.echo $VERSION_CODENAME
: Renvoie le nom de code défini par leos-release
fichier.la source
echo "$(. /etc/os-release && echo $VERSION_CODENAME"
mais on a remarqué qu'il n'y a pas$VERSION_CODENAME
dansstretch
. Très triste nouvelle.echo "$(. /etc/os-release && echo ${VERSION_CODENAME-stretch})"
qui semble correct pour ma tâche, mais ça a l'air mauvaisPour systemd:
production:
la source
Une autre heuristique consiste à voir d'où viennent les packages pour le système d'exploitation en cours d'exécution.
Variante simple (et probablement sujette aux erreurs):
Un moyen plus fiable consiste à analyser les détails de la sortie de
apt-cache policy
(sans autre paramètre):apt-cache policy
répertorie tous les référentiels APT utilisés sur le système local. Nous filtrons ceux qui proviennent de Debian, qui sont étiquetés justeDebian
(c'est-à-dire pas ceux étiquetés par exempleDebian debug
), puis regardons uniquement l'archive principale (pascontrib
ounon-free
) et sélectionnons ensuite la valeur correspondante.Une approche encore plus stable serait de ne pas se fier à l'ordre des éléments et de trouver la
n=
valeur dans la ligne restante:Encore une autre possibilité serait d'analyser les
/var/lib/apt/lists/*Release
fichiers vous-même au lieu de leapt-cache
faire:la source
Mon besoin était d'ajouter une URL dans sources.list. Et pour pouvoir mettre dynamiquement le nom du code de version, j'utilise ce morceau de code (comptez sur le fait que le nom de code est entre parenthèses): Inspiré par la réponse @PersianGulf .
grep "VERSION=" /etc/os-release |awk -F= {' print tolower($2)'}|sed s/\.*\(//g | sed s/" ".*\"//g
la source
En développant la réponse @Costas , cette commande n'a pas fonctionné pour 16.04 où elle a renvoyé le nom complet "Xerial Xerus" mais je voulais seulement "xerial" car c'est ainsi que le dépôt que j'essayais de séparer des différentes versions. Cette commande ajoute que seul le premier mot sera retourné et qu'il sera entièrement en minuscules:
Cela fonctionne aussi pour "Jessie"
la source
En utilisant uniquement
grep
:Essayez-le (sortie dès la rédaction de cet article):
la source
celui-ci pourrait (ou non) être une approche alternative à ce que bcoca a écrit sur Debian Squeeze - je l'ai testé sur Ubuntu 18.04:
la source