IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Expressions rationnelles, besoin d'un coup de main pour lister des partitions


Sujet :

Shell et commandes GNU

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 933
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 933
    Points : 15 381
    Points
    15 381
    Par défaut Expressions rationnelles, besoin d'un coup de main pour lister des partitions
    Bonjour,

    pour moi c'est le brouillard et au plus je lis des pages au plus je m'y enfonce...

    donc, désolé de vous déranger, mais quand j'exécute dans un terminal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    parts=$(blkid /dev/nbd*)
    printf '%s\n' "${parts[@]}"
    après avoir connecté un disque virtuel formaté avec 4 partoches et l'avoir bien monté avec qemu-nbd, j'obtiens ça,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /dev/nbd0p1: LABEL="25mo" UUID="9d75ee8c-97cf-40b6-9e6a-308e44e6dc22" TYPE="ext4" 
    /dev/nbd0p2: LABEL="15mo" UUID="6f2e4fd4-9e0a-46fa-aebb-83c90e94f679" TYPE="ext4" 
    /dev/nbd0p3: LABEL="12mo" UUID="7f5fd0e0-6adf-4cfd-977b-67a254f275a3" TYPE="ext4" 
    /dev/nbd0p4: LABEL="07mo" UUID="b4944abf-684e-45ad-9807-1e8e76d577c0" TYPE="ext4"
    qui est exactement ce que je veux, mais comment le faire fonctionner dans un script ?
    Car à l'heure actuelle, le retour est vide de chez vide, et c'est juste 1 ligne, pas 4.

    Une piste (qui ne m'amuse pas) : quand j'exécute la même chose avec fdisk, soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    parts=$(fdisk -l "$dvn"*) 
    printf '%s\n' "${parts[@]}"
    ça fonctionne mais c'est difficilement utilisable, fdisk étant très (trop !) verbeux sur ce coup-là.
    (Et $dvn c'est /dev/nbd, dvn pour /DeV/Nbd),

    En rajoutant echo $? après parts=... je récupère un 2 et le man nous explique que
    Citation Envoyé par man blkid
    If the specified token was not found, or no (specified) devices could be identified, an exit code of 2 is returned.
    Est-ce à dire qu'il y aurait un souci avec blkid ? Ou dans la commande avec l'astérisque ? Dans le terminal, j'ai ça, sans astérisque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ blkid /dev/nbd0
    $ echo $?
    2
    $ blkid /dev/nbd0p1
    /dev/nbd0p1: LABEL="25mo" UUID="9d75ee8c-97cf-40b6-9e6a-308e44e6dc22" TYPE="ext4" 
    $ echo $?
    0
    Merci à tous, au plaisir de vous lire...

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 470
    Points
    19 470
    Par défaut
    Bonjour,

    parts n'est pas un tableau.
    et * n'est pas une regex, c'est un Développement des chemins.

    utilise ceci plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mapfile -t parts < <(blkid /dev/nbd*)
    printf '%s\n' "${parts[@]}"

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 933
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 933
    Points : 15 381
    Points
    15 381
    Par défaut
    J'ai tenté ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mapfile -t parts < <(blkid /dev/nbd*)
    ret=$?; echo $ret
    printf '%s\n' "${parts[@]}"
    mais tout ce que je gagne c'est un 0 à l'echo $ret...


    PS : en terminal ça fonctionne,

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Bonjour

    Change d'outil. lsblk.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lsblk -o KNAME,MOUNTPOINT,SIZE,UUID,FSTYPE
    Colonnes disponibles (pour --output)*:
            NAME  nom du périphérique
           KNAME  nom du périphérique interne du noyau
         MAJ:MIN  numéro majeur:mineur du périphérique
          FSTYPE  type de système de fichiers
      MOUNTPOINT  où le périphérique est monté
           LABEL  étiquette du système de fichiers
            UUID  UUID du système de fichiers
        PARTTYPE  type de partition UUID
       PARTLABEL  étiquette de partition
        PARTUUID  UUID de partition
       PARTFLAGS  indicateurs de la partition*
              RA  avance en lecture («*readahead*») du périphérique
              RO  périphérique en lecture seule
              RM  périphérique amovible
         HOTPLUG  périphérique amovible ou connectable à chaud (USB, PCMCIA,*etc.)
           MODEL  identifiant de périphérique
          SERIAL  numéro de série du disque
            SIZE  taille du périphérique
           STATE  état du périphérique
           OWNER  nom d'utilisateur
           GROUP  nom de groupe
            MODE  permissions de nœud de périphérique
       ALIGNMENT  index d'alignement
          MIN-IO  taille minimale d'E/S
          OPT-IO  taille optimale d'E/S
         PHY-SEC  taille de secteur physique
         LOG-SEC  taille de secteur logique
            ROTA  périphérique tournant
           SCHED  ordonnanceur d'E/S
         RQ-SIZE  demande de taille de la file
            TYPE  type de périphérique
        DISC-ALN  abandon de l'index d'alignement
       DISC-GRAN  abandon de la granularité
        DISC-MAX  abandon du maximum d'octets
       DISC-ZERO  abandon des données de zéros
           WSAME  écriture du même maximum d'octets
             WWN  identifiant de stockage unique
            RAND  ajout d'aléa
          PKNAME  nom du périphérique parent interne du noyau
            HCTL  Hôte:Canal:Cible:Ulog pour SCSI
            TRAN  type de périphérique de transport
      SUBSYSTEMS  dédupliquer une chaîne de sous-systèmes
             REV  révision de périphérique
          VENDOR  constructeur du périphérique
    
    Consultez lsblk(8) pour obtenir des précisions complémentaires.
    

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 933
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 933
    Points : 15 381
    Points
    15 381
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    Change d'outil. lsblk.
    Moui, avec un grep derrière, pour n'avoir que les lignes qui m'intéressent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     lsblk -o KNAME,MOUNTPOINT,SIZE,UUID,FSTYPE | grep nbd
    nbd0                  60M                                      
    nbd0p1                25M 9d75ee8c-97cf-40b6-9e6a-308e44e6dc22 ext4
    nbd0p2                15M 6f2e4fd4-9e0a-46fa-aebb-83c90e94f679 ext4
    nbd0p3                12M 7f5fd0e0-6adf-4cfd-977b-67a254f275a3 ext4
    nbd0p4                 7M b4944abf-684e-45ad-9807-1e8e76d577c0 ext4
    J'en ai même une en plus, la première. Vais étudier ça...

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 933
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 933
    Points : 15 381
    Points
    15 381
    Par défaut
    Ne voulant pas rester sur un échec avec mapfile, j'ai un peu fouillé le web, ai trouvé un site sympa et simplissime, ai adapté ses exemples, ce qui donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    blkid /dev/nbd* | ( mapfile -t; printf "%s\n" "${MAPFILE[@]}" )
    /dev/nbd0p1: LABEL="25mo" UUID="9d75ee8c-97cf-40b6-9e6a-308e44e6dc22" TYPE="ext4" 
    /dev/nbd0p2: LABEL="15mo" UUID="6f2e4fd4-9e0a-46fa-aebb-83c90e94f679" TYPE="ext4" 
    /dev/nbd0p3: LABEL="12mo" UUID="7f5fd0e0-6adf-4cfd-977b-67a254f275a3" TYPE="ext4" 
    /dev/nbd0p4: LABEL="07mo" UUID="b4944abf-684e-45ad-9807-1e8e76d577c0" TYPE="ext4"
    et ma foi, ça le fait bien !
    Merci à vous,

    EDIT
    Citation Envoyé par N_BaH Voir le message
    utilise ceci plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf '%s\n' "${parts[@]}"
    Je reviens 5 minutes là-dessus parce que là, il y a un mystère : ces formules cabalistiques ne m'ont jamais donné le nombre de lignes du tableau, pour le connaître il faut compter ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blkid /dev/nbd* | ( IFS='\r'; mapfile -t; k=0; for i in ${MAPFILE[@]}; do let k++; echo "$i"; done; echo "nombre de lignes : "$k )
    et cette petite chose me permet de lire, après les infos des partoches,
    nombre de lignes : 4
    Oui, j'aurais pu mettre nombre de partitions : 4, chacun adaptera en fonction de ses besoins.
    Et attention à tout bien garder sur la même ligne à l'intérieur des parenthèses, oui, cette histoire de parenthèses est obligatoire et ennuyeuse car générant un sous-shell et donc les variables à l'extérieur et à l'intérieur ne se connaissent pas !

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ a="test a"
    $ (a="test b"; echo $a)
    test b
    $ echo $a
    test a
    Et ça c'est mortel quand on est fatigué ! Alors méfiance,

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 470
    Points
    19 470
    Par défaut
    le grep n'est vraiment pas indispensable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ mapfile -s1 -t parts < <(lsblk -n -o KNAME,MOUNTPOINT,SIZE,UUID,FSTYPE /dev/sda)
    edit: le problème de cette façon de faire (commande | mapfile), c'est que le tableau n'existe pas en dehors du pipe.
    c'est pourquoi j'utilise une Substitution de processus (<(commande)).

  8. #8
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 933
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 933
    Points : 15 381
    Points
    15 381
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    edit: le problème de cette façon de faire (commande | mapfile), c'est que le tableau n'existe pas en dehors du pipe.
    c'est pourquoi j'utilise une Substitution de processus (<(commande)).
    Tu as bien fait de revenir là-dessus, j'ai réussi à la faire fonctionner ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ mapfile -t toto < <(blkid /dev/nbd*)
    $ printf '%s\n' "${toto[@]}"
    /dev/nbd0p1: LABEL="25mo" UUID="9d75ee8c-97cf-40b6-9e6a-308e44e6dc22" TYPE="ext4" 
    /dev/nbd0p2: LABEL="15mo" UUID="6f2e4fd4-9e0a-46fa-aebb-83c90e94f679" TYPE="ext4" 
    /dev/nbd0p3: LABEL="12mo" UUID="7f5fd0e0-6adf-4cfd-977b-67a254f275a3" TYPE="ext4" 
    /dev/nbd0p4: LABEL="07mo" UUID="b4944abf-684e-45ad-9807-1e8e76d577c0" TYPE="ext4"
    Plus qu'à s'atteler au nombre de lignes (de partitions) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ IFS='\r'; k=0; for i in ${toto[@]}; do let k++; done; echo "nombre de lignes : "$k
    nombre de lignes : 4
    EDIT : MAIS IL RESTE UN AFFREUX SOUCI : ça ne fonctionne pas dans un script, cette ligne $ mapfile -t toto < <(blkid /dev/nbd*) à cause de l'astérisque ! Allez hop !, retour à la case départ, enfin, au post # 1...

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Et attention à tout bien garder sur la même ligne à l'intérieur des parenthèses, oui, cette histoire de parenthèses est obligatoire et ennuyeuse car générant un sous-shell et donc les variables à l'extérieur et à l'intérieur ne se connaissent pas !
    Euh ... ça, c'est plutôt faux. La conduite (pipe) crée un sous-shell à elle toute seule. Les parenthèses ne viennent qu'en second ressort. Il serait bon de vérifier que tu n'as pas créé un sous-shell dans un sous-shell .

    Je ne comprends pas cette manie de mettre des parenthèses plutôt que des accolades.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lsblk -o KNAME,MOUNTPOINT,SIZE,UUID,FSTYPE /dev/nbd??*

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 470
    Points
    19 470
    Par défaut
    montre-nous le script, comment tu l'exécutes, et avec quel utilisateur; parce qu'il n'y a pas de raison qu'un astérisque pose problème dans un script.
    sur "mon" Arch, blkid n'affiche rien en tant qu'utilisateur, je dois être root.

  11. #11
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 933
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 933
    Points : 15 381
    Points
    15 381
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    montre-nous le script, comment tu l'exécutes, et avec quel utilisateur; parce qu'il n'y a pas de raison qu'un astérisque pose problème dans un script.
    sur "mon" Arch, blkid n'affiche rien en tant qu'utilisateur, je dois être root.
    Tout est là,
    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    parts=$(blkid /dev/nbd*)
    printf '%s\n' "${parts[@]}"
    et le reste du script n'a rien à voir avec ça, sauf qemu-nbd -c /dev/nbd0 qui me crée le périphérique après un appel à modprobe nbd max_parts=16, et en lui passant un fichier de disque virtuel.
    Et je suis root aussi.

    Citation Envoyé par Flodelarab Voir le message
    Euh ... ça, c'est plutôt faux. La conduite (pipe) crée un sous-shell à elle toute seule. Les parenthèses ne viennent qu'en second ressort. Il serait bon de vérifier que tu n'as pas créé un sous-shell dans un sous-shell .
    Bon, j'ai dû me faire un petit nœud dans la tête, je suis bêtement parti du lien que j'ai donné, quand j'ai parlé de site sympa.

    Citation Envoyé par Flodelarab Voir le message
    Je ne comprends pas cette manie de mettre des parenthèses plutôt que des accolades.
    C'est un peu après le milieu de la page, là où il y a du printf.

    Ah, le morceau final, avec un fichier temporaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      tempfic=$(mktemp /tmp/test.XXX) 
      blkid /dev/nbd* | ( mapfile -t; k=0; for i in "${MAPFILE[@]}"; do let k++; echo "$i" >> $tempfic; done; echo "$k" >> $tempfic )
      cat $tempfic
    #/dev/nbd0p1: LABEL="25mo" UUID="9d75ee8c-97cf-40b6-9e6a-308e44e6dc22" TYPE="ext4" 
    #/dev/nbd0p2: LABEL="15mo" UUID="6f2e4fd4-9e0a-46fa-aebb-83c90e94f679" TYPE="ext4" 
    #/dev/nbd0p3: LABEL="12mo" UUID="7f5fd0e0-6adf-4cfd-977b-67a254f275a3" TYPE="ext4" 
    #/dev/nbd0p4: LABEL="07mo" UUID="b4944abf-684e-45ad-9807-1e8e76d577c0" TYPE="ext4" 
    #4

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 470
    Points
    19 470
    Par défaut
    ben... c'est dégueu, et inutile; autant rediriger directement la sortie de la commande vers un fichier.
    mais, les fichiers temporaires, c'est kk.
    en plus, il faudra peut-être lire le fichier ligne par ligne...
    donc, autant lire directement la sortie de la commande.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blkid /dev/nbd* | while read line; do : whatever using "$line"; done
    cf. Comment lire un fichier en shell, voir la partie avec plusieurs variables.
    mais, que veux-tu faire avec la sortie de la commande ?

    PS: quel est le shebang du script ?

  13. #13
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 309
    Points : 12 817
    Points
    12 817
    Par défaut
    Ou si on veut absolument utiliser mapfile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blkid /dev/nbd* |  { mapfile -t ; printf "%s\n" "${MAPFILE[@]}" ; printf "%d\n" ${#MAPFILE[@]} ; }
    Et avec la redirection dans un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blkid /dev/nbd* |  { mapfile -t ; printf "%s\n" "${MAPFILE[@]}" ; printf "%d\n" ${#MAPFILE[@]} ; } >fichier

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 470
    Points
    19 470
    Par défaut
    il n'y pas de gain à utiliser mapfile ainsi.

  15. #15
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 309
    Points : 12 817
    Points
    12 817
    Par défaut
    Bah, c'est comme la boucle juste pour compter le nombre de ligne...

  16. #16
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 933
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 933
    Points : 15 381
    Points
    15 381
    Par défaut
    Bonjour,

    ce matin, merci pour vos retours, mais c'est l'enfer...

    Avec la ligne de N_BaH (avec ou sans ":" [pas compris à quoi il servait -- typo ?]), dans les deux cas, des fois ça fonctionne et des fois pas, sans que j'aie pu déterminer pourquoi ce "des fois"…

    Par exemple, je fais tourner ma manière (qui fonctionne à tous les coups) puis je la commente et j'active
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      blkid /dev/nbd* | while read line; do echo "$line"; done;
    j'enregistre, j'exécute, ça fonctionne mais je n'ai pas le nombre de lignes (qui sera intéressant pour la suite), alors je passe à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      k=0; 
      blkid /dev/nbd* | while read line; do let k++; echo "$line"; done; 
      echo "$k"
    qui ne fonctionne pas, résultat vide !
    Je commente première et dernière lignes, ce qui me ramène à ça tout seul :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      blkid /dev/nbd* | while read line; do let k++; echo "$line"; done
    Résultat vide, donc c'est lié à l'ajout de let k++; ? Je le supprime et je relance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      blkid /dev/nbd* | while read line; do echo "$line"; done
    Résultat vide maintenant, alors que ça a fonctionné qq lignes plus haut.

    À ce stade, pour m'en sortir, je commente cette ligne puis décommente ma manière, j'exécute (c'est bon) et je peux la recommenter et continuer à jouer avec le while, jusqu'à la prochaine incongruité.

    Bon, ok, il y a un 'blème bien planqué : après avoir repris le contrôle, je lance la ligne de N_BaH
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      blkid /dev/nbd* | while read line; do echo "$line"; done
    et ça fonctionne bien, alors je rappelle mon script (qui n'a plus rien après à part les fonctions de libération de qemu-nbd et de suppression du module nbd) et il me donne maintenant lui aussi un résultat vide.
    C'est à n'y rien comprendre.
    À tel point que testant carrément à la ligne de commande, je réalise que mon blkid version 2.20.1 est en train de partir en sucette et qu'il va me falloir rebooter, ouais ouais !
    Bougez pas je reviens, en espérant que ça sera plus fiable sur la machine récente pour laquelle ce script est prévu...

    Et pas mieux avec la ligne de disedorgue.


    Ah, mon shebang c'est #!/bin/bash et tout ça c'est pour pouvoir monter facilement des disques virtuels (car j'ai des manips à faire sur des configurations et il sera plus rapide et plus simple pour moi d'éditer le fstab que de recopier les gigas des .vdi, même si en ce moment je perds là-dessus un temps dément...)

  17. #17
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 933
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 933
    Points : 15 381
    Points
    15 381
    Par défaut
    Coucou me revoilou, après un reboot, et j'ai lancé le script avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      k=0; 
      blkid /dev/nbd* | while read line; do let k++; echo "$line"; done; 
      echo "$k"
    Résultat, 2 lignes au lieu de 4 et un compteur de lignes à 0.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /dev/nbd0p1: LABEL="25mo" UUID="9d75ee8c-97cf-40b6-9e6a-308e44e6dc22" TYPE="ext4"
    /dev/nbd0p2: LABEL="15mo" UUID="6f2e4fd4-9e0a-46fa-aebb-83c90e94f679" TYPE="ext4"
    0
    alors que si je tape la commande blkid /dev/nbd* dans un terminal, la réponse est bonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ blkid /dev/nbd*
    /dev/nbd0p1: LABEL="25mo" UUID="9d75ee8c-97cf-40b6-9e6a-308e44e6dc22" TYPE="ext4" 
    /dev/nbd0p2: LABEL="15mo" UUID="6f2e4fd4-9e0a-46fa-aebb-83c90e94f679" TYPE="ext4" 
    /dev/nbd0p3: LABEL="12mo" UUID="7f5fd0e0-6adf-4cfd-977b-67a254f275a3" TYPE="ext4" 
    /dev/nbd0p4: LABEL="07mo" UUID="b4944abf-684e-45ad-9807-1e8e76d577c0" TYPE="ext4"
    Et si je combine avec le comptage
    k=0; blkid /dev/nbd* | while read line; do let k++; echo "$line"; done; echo "$k"j'ai bien les 4 lignes de devices, mais le compteur k reste à 0. Encore une histoire de sous-process ? Confirmé en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ... echo "$line"; echo "$k"; done; echo "$k"
    /dev/nbd0p1: LABEL="25mo" UUID="9d75ee8c-97cf-40b6-9e6a-308e44e6dc22" TYPE="ext4"
    1
    /dev/nbd0p2: LABEL="15mo" UUID="6f2e4fd4-9e0a-46fa-aebb-83c90e94f679" TYPE="ext4"
    2
    /dev/nbd0p3: LABEL="12mo" UUID="7f5fd0e0-6adf-4cfd-977b-67a254f275a3" TYPE="ext4"
    3
    /dev/nbd0p4: LABEL="07mo" UUID="b4944abf-684e-45ad-9807-1e8e76d577c0" TYPE="ext4"
    4
    0
    Si qqun a une idée, moi, là, je suis sec, à part en passant par le fichier temporaire…

  18. #18
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 309
    Points : 12 817
    Points
    12 817
    Par défaut
    Dans un sens, ma solution d'utilisation de mapfile peut s'avérer utile, en fait...

    Bon blague à part, tu peux essayer comme ça (en scripting, car en terminal, ça peut être dégueulasse) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blkid /dev/nbd* | tee >(wc -l)

  19. #19
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 470
    Points
    19 470
    Par défaut
    on te l'a déjà dit : le pipe crée un sous-shell en dehors duquel les variables qui y sont créées n'existent pas et ne sont pas modifiées dans l'environnement parent.
    « un processus enfant ne peut pas altérer son processus parent »

    quant aux lignes qui n'apparaissent pas, je ne sais pas.

    mais pourquoi ne pas utiliser une Substitution de processus (<(...)) ? comme ça pas de pipe, pas de sous-shell...

    PS: le : a plusieurs significations, généralement true.
    dans le contexte, ce true sert de commentaire* à ce qui suit jusqu'au ; suivant.

    * Attention, ce n'est pas un vrai commentaire : les variables peuvent y être modifiées.

  20. #20
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 933
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 933
    Points : 15 381
    Points
    15 381
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    on te l'a déjà dit : le pipe crée un sous-shell en dehors duquel les variables qui y sont créées n'existent pas et ne sont pas modifiées dans l'environnement parent.
    « un processus enfant ne peut pas altérer son processus parent »
    Je pensais que c'était réservé aux parenthèses,

    Citation Envoyé par N_BaH Voir le message
    quant aux lignes qui n'apparaissent pas, je ne sais pas.
    mais parce que c'est un gros foutoir, le scripting, je ne vois que ça...

    Qu'on me comprenne bien. Jusqu'à présent (parce que ça vient de changer, lire + bas) j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      tempfic=$(mktemp /tmp/test.XXX) 
      blkid /dev/nbd* | ( mapfile -t; k=0; for i in "${MAPFILE[@]}"; do let k++; echo "$i" >> $tempfic; done; echo "$k" >> $tempfic )
      cat $tempfic
    et ça me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      avec blkid :
    /dev/nbd0p1: LABEL="25mo" UUID="9d75ee8c-97cf-40b6-9e6a-308e44e6dc22" TYPE="ext4" 
    /dev/nbd0p2: LABEL="15mo" UUID="6f2e4fd4-9e0a-46fa-aebb-83c90e94f679" TYPE="ext4" 
    /dev/nbd0p3: LABEL="12mo" UUID="7f5fd0e0-6adf-4cfd-977b-67a254f275a3" TYPE="ext4" 
    /dev/nbd0p4: LABEL="07mo" UUID="b4944abf-684e-45ad-9807-1e8e76d577c0" TYPE="ext4" 
    4
    Mais je réalise, en passant à l'étape suivante, que je n'ai pas besoin du nombre de lignes (le 4 juste dessus), je vais donc le calculer après avec
    k=0; while read champ1 et_le_reste; do echo "${champ1%:}"; let k++; done < "$tempfic" ; echo "$k" et ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /dev/nbd0p1
    /dev/nbd0p2
    /dev/nbd0p3
    /dev/nbd0p4
    4
    Exactement ce que je veux.
    Donc je modifie la boucle qui chagrine tout le monde en supprimant le comptage des lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      tempfic=$(mktemp /tmp/test.XXX) 
      blkid /dev/nbd* > "$tempfic"
      cat "$tempfic"
    Mais c'est pas terrible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      avec blkid :
    /dev/nbd0p1: LABEL="25mo" UUID="9d75ee8c-97cf-40b6-9e6a-308e44e6dc22" TYPE="ext4" 
    /dev/nbd0p2: LABEL="15mo" UUID="6f2e4fd4-9e0a-46fa-aebb-83c90e94f679" TYPE="ext4" 
    /dev/nbd0p3: LABEL="12mo" UUID="7f5fd0e0-6adf-4cfd-977b-67a254f275a3" TYPE="ext4"
    Je perds la dernière ligne ! Qu'à cela ne tienne, la solution est facile, il me semble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      tempfic=$(mktemp /tmp/test.XXX) # penser à rm -f $tempfic
      blkid /dev/nbd* > "$tempfic"
      sync
      cat "$tempfic"
    mais non, c'est la cata !
    Rien ! Plus rien !
    Je termine le script, je le relance sans rien changer et là c'est bon.
    Je l'arrête à nouveau, je le relance et c'est de nouveau le pâté !
    Alors que dans un autre terminal, la commande de disedorgue fonctionne toujours très bien (pourquoi dis-tu que "ça peut être dégueulasse" ? Elle est très bien, ta commande !)

    Citation Envoyé par N_BaH Voir le message
    mais pourquoi ne pas utiliser une Substitution de processus (<(...)) ? comme ça pas de pipe, pas de sous-shell...
    On verra, on verra, pour le moment j'en ai trop marre, je vais me balader !
    Et si les keufs me contrôlent, je leur dirai que
    - j'ai besoin de m'aérer le dedans de la tête, vous comprenez, monsieur l'agent, je fais de l'informatique...
    - Ah ok, allez, circulez !

    EDIT : dernière minute avant de plier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      tempfic=$(mktemp /tmp/test.XXX) 
      sync # un autre ici
      blkid /dev/nbd* > "$tempfic"
      sync
      cat "$tempfic"
    Et ça s'est bien exécuté, alleluia !

    À pluche,

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/01/2007, 12h35
  2. Réponses: 7
    Dernier message: 23/12/2006, 13h43
  3. [RegEx] Besoin d'un coup de main pour écrire une regex
    Par gaboo_bl dans le forum Langage
    Réponses: 7
    Dernier message: 18/08/2006, 17h53
  4. besoin d'un coup de main pour une requête ;)
    Par Fabouney dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/11/2005, 23h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo