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 :

[Bash 4.4.7]: Bug mapfile ?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut [Bash 4.4.7]: Bug mapfile ?
    Bonjour,
    J'ai l'impression que mapfile n'aime pas la réentrance pour les fichiers normaux.
    Voici le souci que je rencontre:

    Dans un premier temps, je crée 2 fonctions dont l'une appel l'autre via un mapfile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ xx(){ mapfile -C yy -c 1 -t TT < <(echo "$@") ; }
    $ yy(){ echo "$@" ;}
    Maintenant, appelons la fonction xx via un mapfile qui utilisera une substitution de process en guise de fichier d'entrée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ mapfile -C xx -c 1 -t UU < <(echo -e "Premiere ligne" A{1..45} "\nDeuxieme ligne" B{1..45} "\nTroisieme ligne" C{1..45})
    0 0 Premiere ligne A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 A38 A39 A40 A41 A42 A43 A44 A45 
    0 1 Deuxieme ligne B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 B16 B17 B18 B19 B20 B21 B22 B23 B24 B25 B26 B27 B28 B29 B30 B31 B32 B33 B34 B35 B36 B37 B38 B39 B40 B41 B42 B43 B44 B45 
    0 2 Troisieme ligne C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20 C21 C22 C23 C24 C25 C26 C27 C28 C29 C30 C31 C32 C33 C34 C35 C36 C37 C38 C39 C40 C41 C42 C43 C44 C45
    Ici, tout est OK.
    Maintenant, créons un fichier qui contiendra exactement les mêmes données que la substitution de process:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ echo -e "Premiere ligne" A{1..45} "\nDeuxieme ligne" B{1..45} "\nTroisieme ligne" C{1..45} >fic.txt
    Et appelons la fonction xx via un mapfile mais qui cette fois utilisera le fichier précédemment créé en guise de fichier d'entrée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ mapfile -C xx -c 1 -t UU <fic.txt 
    0 0 Premiere ligne A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 A38 A39 A40 A41 A42 A43 A44 A45 
    0 1  B17 B18 B19 B20 B21 B22 B23 B24 B25 B26 B27 B28 B29 B30 B31 B32 B33 B34 B35 B36 B37 B38 B39 B40 B41 B42 B43 B44 B45 
    0 2 ligne C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20 C21 C22 C23 C24 C25 C26 C27 C28 C29 C30 C31 C32 C33 C34 C35 C36 C37 C38 C39 C40 C41 C42 C43 C44 C45
    Et là, on voit que seule la première ligne est complète... Et bien sur, je ne rencontre ce souci que lorsque je fais un appel à mapfile dans une fonction appelée par un autre mapfile.

    Si quelqu'un a une explication, je suis preneur.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 117
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Si quelqu'un a une explication, je suis preneur.
    Explication, aucune.

    Constatation, le même retour foireux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    0 0 Premiere ligne A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 A38 A39 A40 A41 A42 A43 A44 A45 
    0 1  B17 B18 B19 B20 B21 B22 B23 B24 B25 B26 B27 B28 B29 B30 B31 B32 B33 B34 B35 B36 B37 B38 B39 B40 B41 B42 B43 B44 B45 
    0 2 ligne C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20 C21 C22 C23 C24 C25 C26 C27 C28 C29 C30 C31 C32 C33 C34 C35 C36 C37 C38 C39 C40 C41 C42 C43 C44 C45
    Bash 4.2.37
    Et pour être sûr de ne pas me tromper, j'ai fait des copier/coller de tes lignes.

    Ça doit être une histoire de buffer ou similaire, parce que si j'enlève la première ligne, la deuxième (qui est maintenant la 1re est bonne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # mapfile -C xx -c 1 -t UU <fic3.txt
    0 0 Deuxieme ligne B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 B16 B17 B18 B19 B20 B21 B22 B23 B24 B25 B26 B27 B28 B29 B30 B31 B32 B33 B34 B35 B36 B37 B38 B39 B40 B41 B42 B43 B44 B45 
    0 1 6 C17 C18 C19 C20 C21 C22 C23 C24 C25 C26 C27 C28 C29 C30 C31 C32 C33 C34 C35 C36 C37 C38 C39 C40 C41 C42 C43 C44 C45

    EDIT :
    Et en générant trois lignes bien similaires (tous les nombres sur 2 chiffres, intitulés des lignes supprimés) pour comparer d'un coup d'œil, on obtient ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    # cat ficp.txt 
     A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 A38 A39 A40 A41 A42 A43 A44 A45 A46 A47 A48 A49 A50 A51 A52 A53 A54 A55 
     B11 B12 B13 B14 B15 B16 B17 B18 B19 B20 B21 B22 B23 B24 B25 B26 B27 B28 B29 B30 B31 B32 B33 B34 B35 B36 B37 B38 B39 B40 B41 B42 B43 B44 B45 B46 B47 B48 B49 B50 B51 B52 B53 B54 B55 
     C11 C12 C13 C14 C15 C16 C17 C18 C19 C20 C21 C22 C23 C24 C25 C26 C27 C28 C29 C30 C31 C32 C33 C34 C35 C36 C37 C38 C39 C40 C41 C42 C43 C44 C45 C46 C47 C48 C49 C50 C51 C52 C53 C54 C55
    # mapfile -C xx -c 1 -t UU < ficp.txt 
    0 0  A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 A38 A39 A40 A41 A42 A43 A44 A45 A46 A47 A48 A49 A50 A51 A52 A53 A54 A55 
    0 1 29 B30 B31 B32 B33 B34 B35 B36 B37 B38 B39 B40 B41 B42 B43 B44 B45 B46 B47 B48 B49 B50 B51 B52 B53 B54 B55 
    0 2  C16 C17 C18 C19 C20 C21 C22 C23 C24 C25 C26 C27 C28 C29 C30 C31 C32 C33 C34 C35 C36 C37 C38 C39 C40 C41 C42 C43 C44 C45 C46 C47 C48 C49 C50 C51 C52 C53 C54 C55
    /EDIT

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Désolé, pourtant, j'essaye de faire attention à l'orthographe... je ferais attention la prochaine fois avec le verbe appellationner

    Bon, blague à part, ce qui est intéressant ici, c'est que l'on obtient exactement la même désynchronisation, ce qui me fait fortement douter à un problème de buffer système, ça sent vraiment le bug.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 117
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Désolé, pourtant, j'essaye de faire attention à l'orthographe...
    C'est la faute à cet internet tout pourri qui nous cerne de toutes parts, plein d'horreurs, de fautes, de tout et n'importe quoi, et ça déteint, ça se répand, c'est triste...

    Citation Envoyé par disedorgue Voir le message
    Bon, blague à part, ce qui est intéressant ici, c'est que l'on obtient exactement la même désynchronisation, ce qui me fait fortement douter à un problème de buffer système, ça sent vraiment le bug.
    J'ai fait la manip (dingue ) suivante : enlever un certain nombre de caractères, identique sur chacune des trois lignes, et j'ai lancé ta commande.
    Ça donne ça (ça commence avec fica.txt à qui j'ai enlevé A45 B45 C45) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    # mapfile -C xx -c 1 -t UU <fica.txt
    0 0 Premiere ligne A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 A38 A39 A40 A41 A42 A43 A44 
    0 1  B18 B19 B20 B21 B22 B23 B24 B25 B26 B27 B28 B29 B30 B31 B32 B33 B34 B35 B36 B37 B38 B39 B40 B41 B42 B43 B44 
    0 2 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20 C21 C22 C23 C24 C25 C26 C27 C28 C29 C30 C31 C32 C33 C34 C35 C36 C37 C38 C39 C40 C41 C42 C43 C44
    # mapfile -C xx -c 1 -t UU <ficb.txt
    0 0 Premiere ligne A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 A38 A39 A40 A41 A42 A43 
    0 1  B19 B20 B21 B22 B23 B24 B25 B26 B27 B28 B29 B30 B31 B32 B33 B34 B35 B36 B37 B38 B39 B40 B41 B42 B43 
    0 2  C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20 C21 C22 C23 C24 C25 C26 C27 C28 C29 C30 C31 C32 C33 C34 C35 C36 C37 C38 C39 C40 C41 C42 C43
    # mapfile -C xx -c 1 -t UU <ficc.txt
    0 0 Premiere ligne A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 A38 A39 A40 A41 A42 
    0 1  B20 B21 B22 B23 B24 B25 B26 B27 B28 B29 B30 B31 B32 B33 B34 B35 B36 B37 B38 B39 B40 B41 B42 
    0 2 7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20 C21 C22 C23 C24 C25 C26 C27 C28 C29 C30 C31 C32 C33 C34 C35 C36 C37 C38 C39 C40 C41 C42
    # mapfile -C xx -c 1 -t UU <ficd.txt
    0 0 Premiere ligne A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 A38 A39 A40 A41 
    0 1  B21 B22 B23 B24 B25 B26 B27 B28 B29 B30 B31 B32 B33 B34 B35 B36 B37 B38 B39 B40 B41 
    0 2 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20 C21 C22 C23 C24 C25 C26 C27 C28 C29 C30 C31 C32 C33 C34 C35 C36 C37 C38 C39 C40 C41
    # mapfile -C xx -c 1 -t UU <fice.txt
    0 0 Premiere ligne A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 A27 A28 A29 A30 A31 A32 A33 A34 A35 A36 A37 
    0 1  B25 B26 B27 B28 B29 B30 B31 B32 B33 B34 B35 B36 B37 
    0 2 C18 C19 C20 C21 C22 C23 C24 C25 C26 C27 C28 C29 C30 C31 C32 C33 C34 C35 C36 C37
    # mapfile -C xx -c 1 -t UU <ficf.txt
    0 0 Premiere ligne A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 A19 A20 A21 A22 A23 A24 A25 A26 
    0 1  B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 B16 B17 B18 B19 B20 B21 B22 B23 B24 B25 B26 
    0 2 7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20 C21 C22 C23 C24 C25 C26
    # mapfile -C xx -c 1 -t UU <ficg.txt
    0 0 Premiere ligne A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 
    0 1  B15 
    # mapfile -C xx -c 1 -t UU <fich.txt
    0 0 Premiere ligne A1 A2 A3 A4 A5 A6 A7 
    # mapfile -C xx -c 1 -t UU <ficj.txt
    0 0 Premiere ligne A1 A2
    Très curieux de constater qu'au plus j'en ai enlevé, au moins il y en avait d'affiché
    Regarde ci-dessus la sortie de ficj.txt, et son contenu dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Premiere ligne A1 A2 
    Deuxieme ligne B1 B2 
    Trosieme ligne C1 C2
    (Trosieme sans "i" pour un bon alignement vertical, oui !)

    Et rajouter des caractères dans le fichier n'améliore pas les choses,

    Tu devrais nous faire une explication de texte caractère par caractère de ta ligne de commande (flemme de lire le man)
    Bon courage !

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Le pire, c'est que si on modifie la fonction xx pour qu'elle appelle le mapfile au travers un tuyau (donc création d'un sous shell), alors le problème disparaît mais on perd le tableau TT:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xx(){ echo "$@" | mapfile -C yy -c 1 -t TT ; }
    Pour l'explication du code:
    Par défaut mapfile lit l'entrée standard et ici les paramètres utilisés sont:
    -C <fonction_a_appeler>.
    -c <n> : la fonction définie dans -C sera appelée toutes les n lignes (donc ici dans les 2 cas, à toutes les lignes)
    -t : ça, c'est juste pour ne pas capturer le retour à la ligne ("\n") de chaque ligne.
    Et le paramètre final, est le tableau dans lequel on souhaite mettre chaque ligne, si on ne le spécifie pas, alors le tableau sera MAPFILE.

    Sinon, mapfile, lorsqu'il appelle une fonction, il lui fourni en paramètre le n° d'indexe du tableau en cours de traitement et toute la ligne qu'il mettra dans le tableau au retour de la fonction.
    C'est la raison des nombres qui s'affiche au début de chaque ligne:
    0 0
    0 1
    0 2
    La colonne de 0 est le mapfile appelant yy et l'autre colonne est le mapfile appelant xx.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    un bug bash ? bashbug !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    un bug bash ? bashbug !
    Je viens de le signaler, mais comme mon anglais est plus qu'inexistant, on verra ce que cela donne...

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Suite à une discussion via mail interposé avec un developpeur de bash, j'ai fait un test sous bash 4.4.12 mais sous cygwin, et là tout fonctionne bien.

    Est-ce que quelqu'un a les moyens de tester avec la même version de bash mais sous linux afin de confirmer ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    je suis sur GNU bash, version 4.4.23(1)-release (x86_64-unknown-linux-gnu), et le comportement est identique à ce qui est décrit ici.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/10/2017, 00h50

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