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 :

Commande sort : comportement étrange !?


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    babasseur
    Inscrit en
    Janvier 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : babasseur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2023
    Messages : 21
    Points : 11
    Points
    11
    Par défaut Commande sort : comportement étrange !?
    Salut.

    Voici un petit code à exécuter:
    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
    #!/bin/bash
     
    /bin/bash --version
    echo
    echo
     
    fic='./test.txt'
     
    rm $fic
     
    echo 'La Mort En Ligne (2003).avi' >> $fic
    echo 'LA Panthere Rose (2006).mkv' >> $fic
    echo 'LA Panthere Rose 2 (2009).mkv' >> $fic
    echo 'la Petite Boutique Des Horreurs (1960).mkv' >> $fic
    echo 'LA Proie D Une Ombre (2021).mkv' >> $fic
    echo 'la Lettre Inachevee (1960)' >> $fic
    echo 'La Maison Des Damnés (1973)' >> $fic
    echo 'Lamb (2021).avi' >> $fic
     
     
    echo '---------- cat du fichier '$fic
    cat $fic
    echo "------------------------------"
    echo 
    echo '---------- sort du fichier '$fic
    sort $fic
    echo "------------------------------"
    J'obtiens en sortie (comme vous ?) les lignes suivantes:

    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
     
    GNU bash, version 5.0.17(1)-release (x86_64-redhat-linux-gnu)
    Copyright (C) 2019 Free Software Foundation, Inc.
    Licence GPLv3+ : GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/gpl.html>
     
    Ceci est un logiciel libre ; vous être libre de le modifier et de le redistribuer.
    AUCUNE GARANTIE n'est fournie, dans les limites permises par la loi.
     
     
    ---------- cat du fichier ./test.txt
    La Mort En Ligne (2003).avi
    LA Panthere Rose (2006).mkv
    LA Panthere Rose 2 (2009).mkv
    la Petite Boutique Des Horreurs (1960).mkv
    LA Proie D Une Ombre (2021).mkv
    la Lettre Inachevee (1960)
    La Maison Des Damnés (1973)
    Lamb (2021).avi
    ------------------------------
     
    ---------- sort du fichier ./test.txt
    la Lettre Inachevee (1960)
    La Maison Des Damnés (1973)
    Lamb (2021).avi
    La Mort En Ligne (2003).avi
    LA Panthere Rose (2006).mkv
    LA Panthere Rose 2 (2009).mkv
    la Petite Boutique Des Horreurs (1960).mkv
    LA Proie D Une Ombre (2021).mkv
    ------------------------------
    C'est super bizarre !!!! Tout se passe comme si sort ne tenait aucun compte ni des espaces, ni des majuscules et minuscules !
    J'utilise cette commande depuis que Linux existe (eh oui je suis plus tout jeune snif), je n'avais jamais remarqué ça.
    Pour moi, ce n'est pas du tout le comportement attendu.

    Qu'en pensez-vous ? Comment expliquez vous ça ? Comment rétablir un comportement "normal" de ma commande sort, le cas échéant.
      0  0

  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 474
    Points
    19 474
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LC_COLLATE=C sort -f tonFichier
    mais je ne sais plus le pourquoi du LC_COLLATE
    quant au -f, c'est pour ne pas tenir de la casse; là, c'est toi qui voit.
      0  0

  3. #3
    Membre à l'essai
    Homme Profil pro
    babasseur
    Inscrit en
    Janvier 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : babasseur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2023
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    Si j'en crois cette page, voici ce que fait LC_COLLATE:
    https://unix.stackexchange.com/quest...fore-uppercase

    Autrement dit si je comprends bien ça inverse le comportement par défaut vis à vis des min et des maj.

    Mais ça n'explique pas le comportement actuel de ma commande qui ne tient pas compte des espaces, et ignore complètement les min et les maj.
    Ce nest pas sensé être son comportement par défaut !
      0  0

  4. #4
    Membre à l'essai
    Homme Profil pro
    babasseur
    Inscrit en
    Janvier 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : babasseur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2023
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    OK avec
    j'ai l'impression que je retombe plus ou moins sur mes pieds, mais j'ai un peu de mal à comprendre encore ce que fait l'option -d (ordre du dico), et j'ai peur que tout ça ait des implications si je combine la sortie de sort avec une commande uniq (typiquement).

    Va falloir faire des p*tains de tests, et ça me fait grmbl grmbl.

    De toute façon pour moi cette histoire de LC_ALL ou LC_COLLATE est clairement un bug.
    Si on veut ignorer la casse, l'option -f, --ignore-case est sensée justement servir à ça. Alors que là par défaut cette option ne sert à rien à du tout ! (sauf si la page de manuel est mensongère)

    Les développeurs de bash finissent par faire n'importe quoi à force de pseudo améliorations, ce qui provoque des bugs surprise de version en version.
    Chuis pas content !!!

    Merci à toi N_BaH de m'avoir mis sur la piste.

    Je ne passe pas le sujet en [résolu] dans l'immédiat, j'attends éventuellement d'autres commentaires.
      0  0

  5. #5
    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 474
    Points
    19 474
    Par défaut
    sort, ce n'est pas bash : c'est GNUcoreutils.
      0  0

  6. #6
    Membre à l'essai
    Homme Profil pro
    babasseur
    Inscrit en
    Janvier 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : babasseur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2023
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    Oui en plus, je n'avais pas réalisé qu'il s'agit de variables d'environnement.
    Merci à toi.
    Je me suis énervé tout seul.
      0  0

  7. #7
    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

    Ce n'est pas nouveau et c'est très gênant. Quand tes lignes commencent par 2 champs numériques, il les concatène dans un tri numérique. Ce qui oblige à introduire une séparation artificielle, comme un "M" par exemple. Ce n'est effectivement pas le comportement que l'on souhaite par défaut.
      0  0

  8. #8
    Membre à l'essai
    Homme Profil pro
    babasseur
    Inscrit en
    Janvier 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : babasseur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2023
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    Salut à toi,

    Est-ce que c'est pas plutôt parce qu'il semble ne pas tenir compte des caractères espaces comme je le signalais plus haut ?
    Ou je n'ai pas compris ce que tu dis.

    Apparemment ce comportement repose sur des variables de localisation qui ne sont peut-être pas bien positionnées chez moi.

    PS: j'ai utilisé cette commande en toute confiance pendant des années y compris en entreprise et c'est seulement maintenant que je réalise que tous mes scripts ksh et bash étaient potentiellement foireux. Ca m'horripile ce sentiment d'insécurité.
      0  0

  9. #9
    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
    Pour la locale FR_fr (et bien d'autre) la partie collate est défini dans (sur un wsl ubuntu) :
    /usr/share/i18n/locales/iso14651_t1_common

    Après faut comprendre les règles pour les divers parties...

    Pour un sort, vaut mieux écouter le conseil du man (*** WARNING *** The locale specified by the environment affects sort order. Set LC_ALL=C to get the traditional sort order that uses native byte values.)
      0  0

  10. #10
    Membre à l'essai
    Homme Profil pro
    babasseur
    Inscrit en
    Janvier 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : babasseur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2023
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    Oui LC_ALL=C semble résoudre le problème (non prise en compte des espaces et non distinction maj/min) mais je trouve hallucinant que ce ne soit pas le comportement par défaut.

    D'ailleurs l'existence même de l'option -f (--ignore-case) tend à prouver selon moi qu'historiquement c'était bien le comportement par défaut (au moins pour la casse).
    Ou alors il faut signaler ça dans les pages de manuel ! C'est absolument pas intuitif.
    Et si on en rendu là pour une commande aussi basique que sort, alors il est permis de mettre douter le comportement de l'ensemble des commandes shell. C'est légèrement problématique je trouve !!! (est-ce que ls ou mkdir font bien ce qu'ils sont sensés faire ? --> Ben j'en sais plus rien !)
      0  0

  11. #11
    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
    Ton raisonnement est valable dans le monde de l'ascii mais dés que tu passes dans le monde de l'unicode, tu ne peux plus te permettre de penser comme ça. Dis toi que toi, tu as la chance de pouvoir utiliser la locale C car tu utilises un alphabet très proche de l'ascii, ce qui n'est pas le cas pour par exemple le mandarin.
    Sort travail sur du texte et pas que de type latin.
    Par défaut l'espace est le séparateur de mot, comment toi tu trierais 2 phrases par ordre alphabétique ? Tu verras qu'en y réfléchissant un peu, tu ferais comme sort.
      0  0

  12. #12
    Membre à l'essai
    Homme Profil pro
    babasseur
    Inscrit en
    Janvier 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : babasseur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2023
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    C'est le rôle des locale de permettre aux chinois mandarins d'adapter leur système au comportement par défaut, de langue anglaise. Et nous de même. Pas l'inverse.
    Sinon on aboutit à une commande sort qui ne tient carrément plus compte des espaces ! (et sans offrit une option qui irait dans ce sens si on le souhaite). Où va-t-on, là ?!
    Je ne te suis pas et je ne crois pas que ce soit l'explication. Peut-être que je me trompe.
      0  0

  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
    Non, pas d'accord, montre à un enfant une lettre "a" et une lettre "B" à un enfant et demande lui quelle lettre est la première, il te dira le "a" et pourtant un sort en locale C te dira le "B"...

    Pareil pour l'espace, l'enfant l'ignorera, celui ci, n'est pas pris en compte.

    C'est ça un tri alphabétique. Toi tu veux un tri binaire sur de l'alphabétique.

    L'espace n'existe pas dans l'alphabet, c'est juste un séparateur de mot.
      0  0

  14. #14
    Membre à l'essai
    Homme Profil pro
    babasseur
    Inscrit en
    Janvier 2023
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : babasseur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2023
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Non, pas d'accord, montre à un enfant une lettre "a" et une lettre "B" à un enfant et demande lui quelle lettre est la première, il te dira le "a" et pourtant un sort en locale C te dira le "B"...

    Pareil pour l'espace, l'enfant l'ignorera, celui ci, n'est pas pris en compte.

    C'est ça un tri alphabétique. Toi tu veux un tri binaire sur de l'alphabétique.

    L'espace n'existe pas dans l'alphabet, c'est juste un séparateur de mot.
    Mais non, je me fiche que les maj viennent avant les min ou l'inverse. (d'ailleurs ce doit être le rôle de l'option -d de faire ça, et c'est arbitraire)
    J'estime juste que la commande sort doit faire ce qu'elle est sensée faire, c'est à dire trier des chaînes en fonction des caractères et de leur position.
    Or une majuscule et une minuscule, ce n'est pas la même chose et un caractère espace, bah ce n'est un pas un caractère vide !

    Parce qu là c'est du grand n'importe quoi, je suis désolé. Je ne sais pas comment on peut soutenir le contraire ! Ca s'appelle de la mauvaise foi, chinois mandarins et enfants de 5 ans ou pas. Pourquoi ne pas considérer aussi que le caractère "0" compte pour du beurre désormais. C'est juste une idée. Une idée farfelue peut-être mais pourquoi pas ?
    On peut très bien ajouter une option pour ça, où est le problème ? Moi je veux bien. Mais ça ne doit en aucun cas être le comportement par défaut, ce serait juste aberrant, non ? C'est pareil.
      0  0

  15. #15
    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 474
    Points
    19 474
    Par défaut modération : discussion close.
    te rends-tu compte que ta colère, ici, n'a pas de sens ?
    ce serait plus constructif de la diriger vers les développeurs du programme.

    tu peux ne pas être d'accord avec la façon dont fonctionne un moteur à explosion, ça sert à rien de t'en prendre au mécanicien qui t'explique comment il tourne.
      3  1

Discussions similaires

  1. [PowerShell] Comportement étrange d'un output d'une commande.
    Par Sithx dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 13/10/2020, 23h36
  2. Réponses: 9
    Dernier message: 22/11/2011, 11h26
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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