Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails) *** mise à jour 12/10/2014 ***

#1 Le 17/04/2013, à 00:29

fnux

[Résolu] Comment récupérer getconf LONG_BIT et lsb_release -c?

Bonjour tout le monde.

Je découvre le langage bash et j'essaye de me créer un petit script qui doit d'abord trouver la version d'Ubuntu et son type.

Dans une console, la commande "getconf LONG_BIT" répond soit 32, soit 64.

De même, la commande "lsb_release -c" répond soit :

- Codename:       lucid pour Ubuntu 10.04
- Codename:       precise pour Ubuntu 12.04
- Codename:       quantal pour Ubuntu 12.10

Dans mon script, que dois-je alors faire pour récupérer :

- la valeur de getconf LONG_BIT dans une variable (par exemple $FLAVOR) ?

- le nom de la version d'Ubuntu (lucid ou precise ou quantal) dans une autre variable (par exemple $DISTRO) ?

J'ai essayé plein de combinaisons, mais je n'y arrive vraiment pas ! hmm

Par exemple, en passant par deux fichiers temporaires, le script suivant :

#!/bin/bash
# search the OS distibution and its type
`getconf LONG_BIT > version.txt` > /dev/null
for WORD in `cat version.txt`
do
   echo $WORD
done
`lsb_release -c > release.txt` > /dev/null
for WORD in `cat release.txt`
do
   echo $WORD
done

m'affiche bien les valeurs que je cherche car à l'exécution j'obtiens ceci :

fnux@desk-121064:~$ sudo sh test-distro.sh
64
Codename:
quantal
fnux@desk-121064:~$ 

Mais si j'essaye d'assigner ces valeurs à des variables comme par exemple ci-dessous :

#!/bin/bash
# search the OS distibution and its type
`getconf LONG_BIT > version.txt` > /dev/null
for WORD in `cat version.txt`
do
   FLAVOR= $WORD
done
`lsb_release -c > release.txt` > /dev/null
for WORD in `cat release.txt`
do
   DISTRO= $WORD
done
echo $FLAVOR
echo $DISTRO

alors j'obtiens cela :

fnux@desk-121064:~$ sudo sh test-distro.sh
test-distro.sh: 7: test-distro.sh: 64: not found
test-distro.sh: 13: test-distro.sh: Codename:: not found
test-distro.sh: 13: test-distro.sh: quantal: not found


fnux@desk-121064:~$ 

Est-ce que quelqu'un peut m'aider car je suis vraiment paumé ?

Merci d'avance.

Dernière modification par fnux (Le 18/04/2013, à 00:26)


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The French West Palm Beach Linux Association.

Hors ligne

#2 Le 17/04/2013, à 07:10

pingouinux

Re : [Résolu] Comment récupérer getconf LONG_BIT et lsb_release -c?

Bonjour,

$ FLAVOR=$(getconf LONG_BIT)
$ DISTRO=$(lsb_release -sc)
$ echo $FLAVOR $DISTRO
64 precise

Remarque : Pas d'espace d'un côté ou de l'autre du signe =

Dernière modification par pingouinux (Le 17/04/2013, à 07:15)

Hors ligne

#3 Le 17/04/2013, à 13:10

fnux

Re : [Résolu] Comment récupérer getconf LONG_BIT et lsb_release -c?

Salut pinguoinux,

pingouinux a écrit :

Bonjour,

$ FLAVOR=$(getconf LONG_BIT)
$ DISTRO=$(lsb_release -sc)
$ echo $FLAVOR $DISTRO
64 precise

Remarque : Pas d'espace d'un côté ou de l'autre du signe =

Merci pour cette solution bien plus élégante que celle que j'avais quand même fini par mettre au point en passant par la lecture de fichiers intermédiaires et qui marche aussi... mais qui est vraiment un peu "crade". tongue

#!/bin/bash
# search the OS distibution and its type
`lsb_release -c > distro.txt` > /dev/null
for DISTRO in `cat distro.txt`
do
   echo > /dev/null
done
`getconf LONG_BIT > flavor.txt` > /dev/null
for FLAVOR in `cat flavor.txt`
do
   echo > /dev/null
done
echo $FLAVOR
echo $DISTRO
rm distro.txt
rm flavor.txt

Merci encore.

Je reviendrai encore pour d'autres conseils, car j'aimerai aussi pouvoir modifier certains fichiers de configuration du système soit en ajoutant des paramètres à des lignes déjà existantes, soit en ajoutant de nouveau paramètres (par exemple : mettre en commentaire une ligne de etc/sudoers et y ajouter une ligne à un certain endroit, ajouter un complément de chemin à la ligne ENV_SUPATH de /etc/login.defs ou encore modifier la ligne du PATH= de /etc/environment.

Bon, je vais googeler un peu pour voir si je trouve mon bonheur et faire des tests.

Si je n'y parviens pas, je viendrai demander de l'aide ici.

En fait, j'essaye de faire un script qui, quelque soit la version d'Ubuntu (10.04, 12.04, 12.10 et 13.04 et ce aussi bien pour les releases 32 bits que 64 bits) installe correctement (car il y a des différences) entre autre les dernières versions stables de go, mono et node de façon automatique tout en utilisant les sources de leurs dépôts officiels et non pas celles assez en retard proposées par Ubuntu, sachant que cette installation complète demande presque une heure de temps en raison des gros downloads et surtout de l'installation de mono. roll

Dès que j'aurai réussi à terminer ce script (qui est presque fini), je le proposerai ici (si ça peut intéresser quelqu'un).

Merci encore de ton aide.


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The French West Palm Beach Linux Association.

Hors ligne

#4 Le 17/04/2013, à 13:27

pingouinux

Re : [Résolu] Comment récupérer getconf LONG_BIT et lsb_release -c?

Ton script était en effet inutilement tortueux. Même si tu veux utiliser un fichier intermédiaire, c'est

lsb_release -c > distro.txt

et non

`lsb_release -c > distro.txt` > /dev/null

Hors ligne

#5 Le 17/04/2013, à 14:28

fnux

Re : [Résolu] Comment récupérer getconf LONG_BIT et lsb_release -c?

Re salut pingouinux.

pingouinux a écrit :

Ton script était en effet inutilement tortueux.

C'est vrai, mais quand je ne connais pas, j'essaye quand même de trouver une solution, même si elle n'est pas très académique. wink

pingouinux a écrit :

Même si tu veux utiliser un fichier intermédiaire, c'est

lsb_release -c > distro.txt

et non

`lsb_release -c > distro.txt` > /dev/null

Là je ne suis pas d'accord avec toi, car ma commande :

`lsb_release -c > distro.txt` > /dev/null

permet de créer le fichier distro.txt sans que rien ne soit affiché dans la console, ce que je voulais, et ce d'autant plus que je détruis ce fichier juste après l'avoir lu.

Mais il est peut être aussi possible de créer ce fichier sans rien afficher dans la console d'une manière plus propre, mais là je ne connais pas.

Au fait, je débute avec bash seulement depuis ce week-end passé et je dois reconnaître que ses help et man ne sont pas super explicites pour des beginners comme moi. roll

En tout cas, ta solution initiale est la plus propre et aussi la plus efficace.

Encore merci.

Dernière modification par fnux (Le 17/04/2013, à 14:30)


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The French West Palm Beach Linux Association.

Hors ligne

#6 Le 17/04/2013, à 14:32

pingouinux

Re : [Résolu] Comment récupérer getconf LONG_BIT et lsb_release -c?

La commande que je t'indique en #4 n'affiche rien dans la console non plus. Il ne faut évidemment pas mettre les ` `.

Hors ligne

#7 Le 18/04/2013, à 00:23

fnux

Re : [Résolu] Comment récupérer getconf LONG_BIT et lsb_release -c?

pingouinux a écrit :

La commande que je t'indique en #4 n'affiche rien dans la console non plus. Il ne faut évidemment pas mettre les ` `.

Merci.


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The French West Palm Beach Linux Association.

Hors ligne

#8 Le 22/04/2013, à 15:55

pingouinux

Re : [Résolu] Comment récupérer getconf LONG_BIT et lsb_release -c?

@fnux : Réponse à ton courriel

$ VERSION=$(lsb_release -sd|cut -d' ' -f2)
$ echo $VERSION
12.04.2

$ KERNEL=$(uname -r)
$ echo $KERNEL
3.5.0-27-generic

ou (selon ce que tu veux)

$ KERNEL=$(uname -r|sed 's/-generic$//')
$ echo $KERNEL
3.5.0-27

Hors ligne

#9 Le 22/04/2013, à 23:15

fnux

Re : [Résolu] Comment récupérer getconf LONG_BIT et lsb_release -c?

Rer Salut Pingouinux.

pingouinux a écrit :

@fnux : Réponse à ton courriel

$ VERSION=$(lsb_release -sd|cut -d' ' -f2)
$ echo $VERSION
12.04.2

$ KERNEL=$(uname -r)
$ echo $KERNEL
3.5.0-27-generic

ou (selon ce que tu veux)

$ KERNEL=$(uname -r|sed 's/-generic$//')
$ echo $KERNEL
3.5.0-27

Merci encore une fois. C'est exactement ce que je cherchais.

Autre question : où est-ce que je peux trouver de la documentation claire (en français ou en anglais) sur l'ensemble des variables internes, et aussi sur la façon de les utiliser que ce soit en ligne de commande ou dans un fichier .sh (car il me semble que la syntaxe est souvent différente) ?

D'ailleurs, je poste un autre sujet : "comment modifier les couleurs du prompt" ici : http://forum.ubuntu-fr.org/viewtopic.ph … #p13294101

Ce qui montre bien que je n'ai pas encore tout compris ! lol lol lol

Cela m'aiderait à mieux apprendre comment utiliser bash.

Merci encore de toutes tes infos qui sont particulièrement claires et concises (ce qui n'est pas le cas des différents "man" que j'ai consulté).

Dernière modification par fnux (Le 23/04/2013, à 01:21)


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The French West Palm Beach Linux Association.

Hors ligne

#10 Le 23/04/2013, à 16:21

fnux

Re : [Résolu] Comment récupérer getconf LONG_BIT et lsb_release -c?

Bon, pour conclure et grâce à pengouinux, voici un petit script qui peut servir.

#!/bin/bash
# test-system.sh
#
# get the Ubuntu distribution name
DISTRO=$(lsb_release -sc)
# get the distribution type (e.g. 64 bits)
FLAVOR=$(getconf LONG_BIT)
# get the full distribution version (e.g. 12.04.1)
VERSION=$(lsb_release -sd|cut -d' ' -f2)
# get the kernel number
KERNEL=$(uname -r|sed 's/-generic$//')
# assing a short version number 
case $DISTRO in
    'lucid')
        RELEASE="10.04";;
    'maverick')
        RELEASE="10.10";;
    'natty')
        RELEASE="11.04";;
    'oneiric')
        RELEASE="11.10";;
    'precise')
        RELEASE="12.04";;
    'quantal')
        RELEASE="12.10";;
    'raring')
        RELEASE="13.04";;
    *)
        RELEASE="xx.yy";;
    esac
# print the results to the console
echo "Distribution: "$DISTRO", Flavor: "$FLAVOR"bits, Release: "$RELEASE", Full version: "$VERSION", Kernel: "$KERNEL
echo ""

A utiliser soit avec la commande :

sh test-system.sh

soit aussi comme çà :

./test-system.sh

Cela doit vous donner un résultat du genre ci-dessous :

Distribution: lucid, Flavor: 64bits, Release: 10.04, Full version: 10.04, Kernel: 2.6.32-21
ou aussi
Distribution: precise, Flavor: 32bits, Release: 12.04, Full version: 12.04.2, Kernel: 3.5.0-28

Salut et encore merci à pengouinux. smile

Dernière modification par fnux (Le 23/04/2013, à 16:24)


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The French West Palm Beach Linux Association.

Hors ligne

#11 Le 23/04/2013, à 16:29

pingouinux

Re : [Résolu] Comment récupérer getconf LONG_BIT et lsb_release -c?

Tu te compliques bien la vie :

$ RELEASE=$(lsb_release -sr)
$ echo $RELEASE
12.04

ou même directement

$ RELEASE=$(lsb_release -r)
$ echo $RELEASE
Release: 12.04

Hors ligne

#12 Le 23/04/2013, à 17:30

fnux

Re : [Résolu] Comment récupérer getconf LONG_BIT et lsb_release -c?

Re salut pingouinux,

pingouinux a écrit :

Tu te compliques bien la vie :

$ RELEASE=$(lsb_release -sr)
$ echo $RELEASE
12.04

ou même directement

$ RELEASE=$(lsb_release -r)
$ echo $RELEASE
Release: 12.04

C'est vrai que je me complique peut-être vraiment la tâche, mais pour la seule et unique raison que malgré mes très longues recherches avec google, je n'arrive pas à trouver de documentation assez claire et surtout détaillée et encore surtout assez complète pour faire ne serait-ce que ce genre de petit script.

De même (et merci encore pour tes explications et celles de Bousky dans le post  http://forum.ubuntu-fr.org/viewtopic.ph … p13294101), mais à part avec vous, je n'ai jamais pu touver un seul exemple concret qui différencie la syntaxe de SH de celle de BASH et encore moins une doc qui différencie les commandes du terminal de celles d'un fichier script. hmm

Heureusement, il y a les spécialistes sympas comme vous deux (et d'autres aussi) sur ce forum pour débrouiller des débutants comme moi. tongue

Voici d'ailleurs le même script que précédemment, mais corrigé et en couleur pour "SH" wink

#!/bin/sh
# test-system.sh to use with sh
#
# get the OS type
SYSTEM=$(uname)
# get the Ubuntu distribution name
DISTRO=$(lsb_release -sc)
# get the distribution type (e.g. 64 bits)
FLAVOR=$(getconf LONG_BIT)
# get the full distribution version (e.g. 12.04.1)
VERSION=$(lsb_release -sd|cut -d' ' -f2)
# get the kernel number
KERNEL=$(uname -r|sed 's/-generic$//')
# get the short version number 
RELEASE=$(lsb_release -sr)
# print the results to the console
echo "\033[1;34mOS: \033[1;31m"$SYSTEM", \033[1;34mDistribution: \033[1;31m"$DISTRO"\033[34m, Flavor: \033[1;31m"$FLAVOR"\033[1;31mbits, \033[1;34mRelease: \033[1;31m"$RELEASE"\033[1;34m, Full Version: \033[1;31m"$VERSION"\033[34m, Kernel: \033[1;31m"$KERNEL"\033[0m"
echo ""

et le même encore pour "BASH" wink

#!/bin/bash
# test-system.sh to use with ./ or bash
#
# get the OS type
SYSTEM=$(uname)
# get the Ubuntu distribution name
DISTRO=$(lsb_release -sc)
# get the distribution type (e.g. 64 bits)
FLAVOR=$(getconf LONG_BIT)
# get the full distribution version (e.g. 12.04.1)
VERSION=$(lsb_release -sd|cut -d' ' -f2)
# get the kernel number
KERNEL=$(uname -r|sed 's/-generic$//')
# get the short version number 
RELEASE=$(lsb_release -sr)
# print the results to the console
echo -e "\E[1;34mOS: \E[1;31m"$SYSTEM", \E[1;34mDistribution: \E[1;31m"$DISTRO"\E[34m, Flavor: \E[1;31m"$FLAVOR"\E[1;31mbits, \E[1;34mRelease: \E[1;31m"$RELEASE"\E[1;34m, Full Version: \E[1;31m"$VERSION"\E[34m, Kernel: \E[1;31m"$KERNEL"\E[0m"
echo ""

Vu les différences de syntaxe, quel est alors le meilleur choix : sh ou bash ?

Et surtout quel est l'avantage éventuel de l'un sur l'autre ?

Par exemple, quel est le meilleur des deux pour traiter facilement des lectures/écritures de fichiers ?

Merci encore de ton aide ainsi qu'à Bousky car ce n'est vraiment pas avec les "man" que je pourrai y arriver. roll

j'ai édité pour corriger le script .sh

Dernière modification par fnux (Le 23/04/2013, à 19:52)


N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The French West Palm Beach Linux Association.

Hors ligne

#13 Le 23/04/2013, à 18:41

pingouinux

Re : [Résolu] Comment récupérer getconf LONG_BIT et lsb_release -c?

Dans ton script sh, sur la ligne echo, ne pas mettre des [[, mais [. Remplace aussi la première ligne par

#!/bin/sh

Tu peux aussi consulter man lsb_release.

Je n'utilise pratiquement que bash, qui a plus de possibilités que sh.

Hors ligne

Haut de page ↑