Auteur Sujet: Éditer un fichier de config linux sans ligne de commande  (Lu 31280 fois)

0 Membres et 1 Invité sur ce sujet

corrector

  • Invité
Est-ce que bash gère UTF8?
« Réponse #36 le: 14 mai 2013 à 13:55:22 »
echo été | xxd
« Modifié: 15 mai 2013 à 05:28:20 par corrector »

vivien

  • Administrateur
  • *
  • Messages: 47 076
    • Twitter LaFibre.info
Éditer un fichier de config linux sans ligne de commande
« Réponse #37 le: 14 mai 2013 à 14:07:57 »
Ubuntu 13.04 64bits :
$ echo été | xxd
0000000: c3a9 74c3 a90a                           ..t...

corrector

  • Invité
Est-ce que bash gère UTF8?
« Réponse #38 le: 14 mai 2013 à 14:11:24 »
Il faut faire tous les tests!
« Modifié: 15 mai 2013 à 05:28:24 par corrector »

vivien

  • Administrateur
  • *
  • Messages: 47 076
    • Twitter LaFibre.info
Éditer un fichier de config linux sans ligne de commande
« Réponse #39 le: 14 mai 2013 à 14:20:07 »
$ echo été | wc -
      1       1       6 -


$ if [[ é == ? ]]; then echo "é est un caractère"; fi
é est un caractère
$ if [[ é == ?? ]]; then echo "é est 2 caractères"; fi
$ if [[ é == [é] ]]; then echo "é est un caractère"; fi
é est un caractère
$ if [[ é == [[:alpha:]] ]]; then echo "é est alpha"; fi
é est alpha

corrector

  • Invité
Est-ce que bash gère UTF8?
« Réponse #40 le: 14 mai 2013 à 14:25:43 »
Bravo!

Qu'indique locale?
« Modifié: 15 mai 2013 à 05:28:30 par corrector »

BadMax

  • Client Free adsl
  • Expert
  • *
  • Messages: 3 481
  • Malissard (26)
Éditer un fichier de config linux sans ligne de commande
« Réponse #41 le: 14 mai 2013 à 15:08:35 »
# echo été | xxd
0000000: e974 e90a                                .t..


corrector

  • Invité
Démonstration que bash gère ISO-Latin-1
« Réponse #42 le: 15 mai 2013 à 05:23:28 »
# echo été | xxd
0000000: e974 e90a                                .t..
Ah oui, quand même. Tu n'es pas du tout en UTF8.

J'y comprends rien (pour moi ça a toujours marché)
Voilà : ça marche parce que tu n'es pas en UTF8.

Comme la discussion porte sur le support UTF8 de bash, tu es un peu hors-sujet.
« Modifié: 15 mai 2013 à 06:31:46 par corrector »

corrector

  • Invité
Démonstration que bash gère les octets dont le premier bit est à 1
« Réponse #43 le: 15 mai 2013 à 06:40:22 »
Alors je fais une nouvelle tentative :
seb@nestor:~$ for f in /data/media/musique/flac/Sigur\ Rós/Með\ suð\ í\ eyrum\ við\ spilum\ endalaust/*.flac; do t=$(printf "%s\n" $f | file -); echo "$t - $(basename "$f")"; done

(Ça fonctionne aussi sans le printf, mais je voulais forcer bash à traiter l'affichage)
Ça te convainc un peu plus ?

Moi, je considère qu'un shell qui prend de l'UTF-8 en entrée et produit encore de l'UTF-8 en sortie sait gérer l'UTF-8 correctement (c'est à dire que ses traitements sont transparents vis-à-vis de ce jeu de caractères).
Mais ce n'est peut être pas ta définition de la bonne gestion UTF-8.
Auquel cas, j'attends la tienne pour comprendre quel doute t'habite encore ...
Décomposons
for f in /data/media/musique/flac/Sigur\ Rós/Með\ suð\ í\ eyrum\ við\ spilum\ endalaust/*.flac;
do
   t=$(printf "%s\n" $f | file -)
   echo "$t - $(basename "$f")"
done


  • /data/media/musique/flac/Sigur\ Rós/Með\ suð\ í\ eyrum\ við\ spilum\ endalaust/*.flac : globbing (englobement? englobage?) d'un chemin comportant des caractères non-ASCII encodés en UTF8 :
    • MOTIF = /data/media/musique/flac/Sigur\ Rós/Með\ suð\ í\ eyrum\ við\ spilum\ endalaust/*.flac ;
      décomposition de MOTIF en CHEMIN/MOTIF_SIMPLE
      par motif (Perl-style) :
      ([^?*]*)/([^/]+)
      avec CHEMIN = \1 et MOTIF_SIMPLE = \2
      on obtient :
      CHEMIN = /data/media/musique/flac/Sigur\ Rós/Með\ suð\ í\ eyrum\ við\ spilum\ endalaust
      MOTIF = *.flac
    • ouverture du répertoire CHEMIN = /data/media/musique/flac/Sigur\ Rós/Með\ suð\ í\ eyrum\ við\ spilum\ endalaust : DIR *dir = readdir("/data/media/musique/flac/Sigur\ Rós/Með\ suð\ í\ eyrum\ við\ spilum\ endalaust")
    • récupération d'un élèment du répertoire : struct dirent *entry = readdir (dir);
      si entry est nul : break
    • recopie de entry->d_name (qui est un texte comportant des caractères non-ASCII encodés en UTF8) dans NOM_FICHIER
    • englobement de NOM_FICHIER contre MOTIF_SIMPLE, sans doute par automate déterministe;
      il me semble que le motif reg-exp correspondant à MOTIF_SIMPLE est (|([^.].*))\.flac autrement dit (\.flac)|([^.].*\.flac)
      si pas de correspondance : continue
    • concaténation de CHEMIN "/" NOM_FICHIER dans CHEMIN_FICHIER
    • ajout de CHEMIN_FICHIER au résultat de l'englobement
  • for f in : affectation à une variable, qui contient donc un texte comportant des caractères non-ASCII encodés en UTF8
  • $f : décomposition de $f (texte comportant des caractères non-ASCII encodés en UTF8) en mots en fonction des séparateurs "Internal Field Separator" (variable spéciale $IFS)
    printf "%s\n" $f | file - : passage du résultat comme arguments du programme commande interne au shell printf
    Pourquoi pas faire file $f tout simplement?
  • $(basename "$f") : passage d'un texte comportant des caractères non-ASCII encodés en UTF8 en argument du programme basename;
    récupération du contenu émis sur le descripteur de fichier n°1 par ce processus, suppression du dernier retour à la ligne;
    Pourquoi quoter $f ce coup ci et pas la ligne d'avant?
  • "$t - $(basename "$f")" : fabrication d'un texte comportant des caractères non-ASCII encodés en UTF8
  • echo "$t - $(basename "$f")" : copie sur le descripteur de fichier n°1 d'un texte comportant des caractères non-ASCII encodés en UTF8
Qu'est-ce que tu veux prouver?

On voit que bash ne se viande pas sur les octets dont le premier bit est à 1. Super. On ne s'en doutait pas.

On va donc pouvoir travailler sur des données en ISO-Latin-1 avec bash! 8)
« Modifié: 15 mai 2013 à 20:17:43 par corrector »

corrector

  • Invité
linux supporte UTF8 (lol)
« Réponse #44 le: 15 mai 2013 à 06:50:52 »
Moi, je considère qu'un shell qui prend de l'UTF-8 en entrée et produit encore de l'UTF-8 en sortie sait gérer l'UTF-8 correctement (c'est à dire que ses traitements sont transparents vis-à-vis de ce jeu de caractères).
Pinaillage : le jeu de caractère est Unicode; UTF8 est un encodage possible d'Unicode.

Quels sont ces "traitements"?
  • motif (Perl-style) :
    ([^?*]*)/([^/]+)
    = chercher le dernier / et s'assurer qu'il n'y a pas de ? ni * avant
  • (|([^.].*))\.flac autrement dit
    (\.flac)|([^.].*\.flac)
    = le nom se termine par .flac et ne commence pas par . ou bien le nom est .flac
  • $f : décomposition de $f en mots en fonction des séparateurs "Internal Field Separator" (variable spéciale $IFS)
  • suppression du dernier retour à la ligne
Tu pourrais aussi soutenir que linux (notamment ext2 et le VFS) supporte UTF8 à ce compte là : il traite bien les noms de fichier en UTF8.
« Modifié: 17 mai 2013 à 09:40:45 par corrector »

BadMax

  • Client Free adsl
  • Expert
  • *
  • Messages: 3 481
  • Malissard (26)
Éditer un fichier de config linux sans ligne de commande
« Réponse #45 le: 15 mai 2013 à 14:35:24 »
Ah oui, quand même. Tu n'es pas du tout en UTF8.
Voilà : ça marche parce que tu n'es pas en UTF8.

Comme la discussion porte sur le support UTF8 de bash, tu es un peu hors-sujet.

Je comprends toujours pas. Autre exemple alors :
# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
# echo été | xxd
0000000: e974 e90a                                .t..

Rappel de l'ancien résultat :
# echo été | xxd
0000000: e974 e90a                                .t..


corrector

  • Invité
Mentir à la ligne de commande est un péché
« Réponse #46 le: 15 mai 2013 à 14:40:04 »
C'est l'histoire du type qui dit : "je ne parle pas français et je ne fais pas de prose". Il ment.

LC_CTYPE="en_US.UTF-8"

est un mensonge : cela ne décrit pas la réalité.

Ce n'est pas parce que tu dis un truc que ça devient vrai.

Il faut :
1) passer en UTF8;
2) ensuite annoncer aux processus que tu l'as fait via l’environnement.
« Modifié: 15 mai 2013 à 20:19:17 par corrector »

BadMax

  • Client Free adsl
  • Expert
  • *
  • Messages: 3 481
  • Malissard (26)
Éditer un fichier de config linux sans ligne de commande
« Réponse #47 le: 15 mai 2013 à 14:44:17 »
Ah non mais j'ai rien fait, tous les paramètres sont d'origine. Tous mes autres serveurs (du RH 3/4/5, du Ubuntu, etc) affichent la même valeur et sont pourtant tous en UTF8.

J'suis lourd mais j'ai toujours pas compris. Ou alors "echo été" n'est pas le bon test.