cerhu > comp.os.* > comp.os.linux.configuration

Alex Ternaute (10/01/2019, 19h45)
Bonjour,

J'ai pris l'habitude, pour faire des effacements collectifs dans mes
dossiers de travail, de renommer ce que je veux garder en majuscules, ou
avec juste une majuscule en début de nom.
Jusqu'à présent, je n'avais jamais eu de souci :

$ mkdir toto Toto
$ ls -d [A-Z]*
Toto
$ rm -R [a-z]*
$ ls
Toto

Récemment j'ai reçu une machine neuve avec un Ubuntu préinstallé, et je
fais comme d'habitude, mais là j'efface _tous_ les fichiers et dossiers.
En tâtonnant, je m'aperçois que l'expression [A-Z]* donne la même chose
que [a-z]*.

Est-ce que quelqu'un peut m'indiquer comment rendre les substitutions
sensibles à la casse ?

Un grand merci par avance.
Nicolas George (10/01/2019, 19h47)
Alex Ternaute , dans le message
<5c3784b8$0$21601$426a74cc>, a écrit :
> Est-ce que quelqu'un peut m'indiquer comment rendre les substitutions
> sensibles à la casse ?


Montre-nous la sortie de « locale » sur les deux environnements.
Alex Ternaute (10/01/2019, 19h52)
Bonjour,

Nicolas George a écrit :

>> Est-ce que quelqu'un peut m'indiquer comment rendre les substitutions
>> sensibles à la casse ?

> Montre-nous la sortie de « locale » sur les deux environnements.


La machine qui différencie la casse :
LANG=en_US
LC_CTYPE="en_US"
LC_NUMERIC="en_US"
LC_TIME="en_US"
LC_COLLATE=C
LC_MONETARY="en_US"
LC_MESSAGES="en_US"
LC_PAPER="en_US"
LC_NAME="en_US"
LC_ADDRESS="en_US"
LC_TELEPHONE="en_US"
LC_MEASUREMENT="en_US"
LC_IDENTIFICATION="en_US"
LC_ALL=

la "mauvaise bête" qui ne le fait pas :
LANG=fr_FR.UTF-8
LANGUAGE=
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=

Et une autre qui ignore également la casse :
LANG=fr_FR.UTF-8
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=
Benoit Izac (10/01/2019, 20h02)
Bonjour,

Le 10/01/2019 à 18:45, Alex Ternaute a écrit dans le message
<5c3784b8$0$21601$426a74cc> :

[..]
> que [a-z]*.
> Est-ce que quelqu'un peut m'indiquer comment rendre les substitutions
> sensibles à la casse ?


Je suppose que c'est bash, est-ce que la commande ci-dessous résout le
problème ?

$ shopt -u nocaseglob
Nicolas George (10/01/2019, 20h13)
Alex Ternaute , dans le message
<5c378642$0$21601$426a74cc>, a écrit :
> LC_COLLATE=C
> LC_COLLATE="fr_FR.UTF-8"


C'est très probablement lui le coupable.

Personnellement, je conseille de laisser toutes les locales à C/POSIX
sauf les quelques unes qu'on souhaite activement changer. Les locales
sont une invention très mal pensée.
Alex Ternaute (11/01/2019, 11h06)
Bonjour,

Nicolas George :

> LC_COLLATE=C


C'est maintenant dans mon .bash_profile

Un grand merci
Alex Ternaute (11/01/2019, 11h21)
Bonjour,

Benoit Izac :

>> Est-ce que quelqu'un peut m'indiquer comment rendre les substitutions
>> sensibles à la casse ?

> Je suppose que c'est bash, est-ce que la commande ci-dessous résout le
> problème ?
> $ shopt -u nocaseglob


C'est bien bash, mais la commande n'a pas l'effet escompté ici (elle a
peut-être un effet ailleurs, note).

J'avais vu ce "nocaseglob" dans le man de bash mais pas trouvé (lu en
diagonale) comment le manipuler. Je viens de voir que shopt est largement
utilisé dans le .bashrc par défaut d'Ubuntu, du coup j'apprends
quelquechose.

Merci pour ta réponse.
Jo Engo (11/01/2019, 11h40)
Le Thu, 10 Jan 2019 18:13:02 +0000, Nicolas George a écrit :

>> LC_COLLATE=C LC_COLLATE="fr_FR.UTF-8"

> C'est très probablement lui le coupable.


En effet, pareil pour moi (debian unstable) :

abdallah@poupon-la-peste:~/toto$ ls -a
.. .. point.point test.sudo titi toto
abdallah@poupon-la-peste:~/toto$ echo *
point.point test.sudo titi toto
abdallah@poupon-la-peste:~/toto$ touch Beep
abdallah@poupon-la-peste:~/toto$ echo [a-z]*
Beep point.point test.sudo titi toto
abdallah@poupon-la-peste:~/toto$ locale
.../..
LC_COLLATE="fr_FR.UTF-8"
.../..
abdallah@poupon-la-peste:~/toto$ export LC_COLLATE="C"
abdallah@poupon-la-peste:~/toto$ echo [a-z]*
point.point test.sudo titi toto
Benoit Izac (11/01/2019, 19h04)
Bonjour,

Le 11/01/2019 à 10:21, Alex Ternaute a écrit dans le message
<5c38600e$0$3703$426a74cc> :

> C'est bien bash, mais la commande n'a pas l'effet escompté ici (elle a
> peut-être un effet ailleurs, note).
> J'avais vu ce "nocaseglob" dans le man de bash mais pas trouvé (lu en
> diagonale) comment le manipuler. Je viens de voir que shopt est largement
> utilisé dans le .bashrc par défaut d'Ubuntu, du coup j'apprends
> quelquechose.


« shopt -u » désactive l'option (u pour unset) ; pour l'activer c'est
« -s » (s pour set).

nocaseglob rend le « pathname expansion » insensible à la case ce qui
correspond au comportement que tu décrivais à un petit détail près ;
« [a-z]* » avec un LC_COLLATE français ne renverra pas les fichiers
commençants par « Z » contrairement à nocaseglob activé.
Alex Ternaute (11/01/2019, 22h21)
Bobjour,

Benoit Izac :

>> [ rm ne fait pas de différence entre [A-Z] et [a-z] ]

> « shopt -u » désactive l'option (u pour unset) ; pour l'activer c'est
> « -s » (s pour set).
> nocaseglob rend le « pathname expansion » insensible à la case ce qui
> correspond au comportement que tu décrivais à un petit détail près ;
> « [a-z]* » avec un LC_COLLATE français ne renverra pas les fichiers
> commençants par « Z » contrairement à nocaseglob activé.


Marche pas. Mais pour info, la réciproque fonctionne sur un système qui a
des "US" dans chaque LC :
$ mkdir -p Toto toto
$ ls
Toto/ toto/
$ shopt -s nocaseglob
$ rm -R [a-z]*
$ ls
[nada]

à +
Benoit Izac (11/01/2019, 23h55)
Bonjour,

Le 11/01/2019 à 21:21, Alex Ternaute a écrit dans le message
<5c38fac2$0$5505$426a74cc> :

> Marche pas.


Qu'est ce qui ne marche pas ? Désactiver nocaseglob pour résoudre ton
problème initial ? C'est normal puisqu'il ne venait pas de là mais de
la variable d'environnement LC_COLLATE.

Pour illustrer mes propos précédents :

$ ls
A Z a z
$ ls [a-z]*
a z
$ shopt -s nocaseglob
$ ls [a-z]*
A Z a z
$ shopt -u nocaseglob
$ LC_COLLATE=fr_FR.UTF-8
$ ls [a-z]*
A a z
$ unset LC_COLLATE
$ ls [a-z]*
a z
Lucas Levrel (13/01/2019, 00h41)
Le 11 janvier 2019, à 22:55, Benoit Izac a écrit :
>>> « [a-z]* » avec un LC_COLLATE français ne renverra pas les fichiers
>>> commençants par « Z » contrairement à nocaseglob activé.

> $ LC_COLLATE=fr_FR.UTF-8
> $ ls [a-z]*
> A a z


Très fort et surtout très piégeux !

Allez, c'est l'heure de zZzZzZ...
Alex Ternaute (14/01/2019, 11h26)
Bonjour,

Benoit Izac :

>>> nocaseglob rend le « pathname expansion » insensible à la case ce qui
>>> correspond au comportement que tu décrivais à un petit détail près ;
>>> « [a-z]* » avec un LC_COLLATE français ne renverra pas les fichiers
>>> commençants par « Z » contrairement à nocaseglob activé.

>> Marche pas.

> Qu'est ce qui ne marche pas ?


J'ai répondu de manière abrupte, certes. J'essaie maintenant de mieux
décrire ce que fait nocaseglob chez moi.

>$ shopt -u nocaseglob
>$ LC_COLLATE=fr_FR.UTF-8
>$ ls [a-z]*
> A a z
>$ unset LC_COLLATE
>$ ls [a-z]*
> a z


Pas forcément, ça dépend aussi des autres variables LC_*

Sur le desktop Ubuntu en tout-UTF-8 :
$ echo $LC_COLLATE
fr_FR.UTF-8
$ shopt -u nocaseglob
$ ls [a-z]*
a A z # en effet
$ unset LC_COLLATE
$ ls [a-z]*
a A z # hélas

Sur un serveur distant avec toutes les LC_* en "C" :
$ LC_COLLATE="fr_FR.UTF-8"
$ shopt -u nocaseglob
$ ls [a-z]*
a z

Je configure un terminal du desktop comme ceux du serveur :
$for LC in $(locale) ; do export $(echo $LC|cut -d = -f 1)=C ; done
et maintenant :
$ LC_COLLATE=fr_FR.UTF-8
$ shopt -u nocaseglob
$ ls [a-z]*
a z

Maintenant je suis mieux outillé pour ce cas de figure, merci.
à +
Lucas Levrel (16/01/2019, 21h04)
Bonjour,

Le 14 janvier 2019, à 09:26, Alex Ternaute a écrit :
> Pas forcément, ça dépend aussi des autres variables LC_*
> Sur le desktop Ubuntu en tout-UTF-8 :
> $ echo $LC_COLLATE
> fr_FR.UTF-8
> $ shopt -u nocaseglob
> $ ls [a-z]*
> a A z # en effet
> $ unset LC_COLLATE
> $ ls [a-z]*
> a A z # hélas


À mon avis le problème n'est pas d'autres LC_... mais LANG : en l'absence
de valeur dans une LC_..., $LANG est pris à la place. C'est le sens des
guillemets dans la sortie de « locale ».

[..]
> $ shopt -u nocaseglob
> $ ls [a-z]*
> a z


Normal, LC_ALL prend le pas sur toute valeur LC_... définie. C'est dit
dans « man 7 locale » (mais pas très clairement).
Jo Engo (18/01/2019, 12h41)
Le Fri, 11 Jan 2019 09:06:35 +0000, Alex Ternaute a écrit :

> C'est maintenant dans mon .bash_profile


He n'ap pas de ~/.bash_profile j'ai mis LC_COLLATE=C dans mon .bashrc
mais ça risque de ne pas marcher avec les shells de login %)

Discussions similaires
Comment lire des fichiers midi sous Ubuntu Mate (ou autre dérivé d'ubuntu) ?

Un ubuntu 16.04.2 qui a fait toutes les mises à jour demandées c'est un ubuntu 16.04.3 ou il y a une différence ?

[limit HS : mélange lenny et ubuntu]Munin server Debian, Munin-node ubuntu pas de données

Pourquoi Ubuntu 6.04 devient Ubuntu 6.06 ?


Fuseau horaire GMT +2. Il est actuellement 18h44. | Privacy Policy