OVH Cloud OVH Cloud

comportement bizarre de cut

6 réponses
Avatar
Jo
Bonjour, j'ai une différence d'éxécution de cut dans un script
et directement en ligne de commande.
Je sais que lorsque j'enlève le pipe avec cut le comportement redevient
normal


j'ai un fichier

monfic:
----------------
#
#
"Jean Dupond1":*:*:10.0.0.1
"Jean Dupond2":*:*:10.0.0.2
"Jean Dupond3":*:*:10.0.0.3

#
----------------

si je passe la commande, le résultat est ok.

[host]#grep -v "#" monfic | cut -d: -f4
10.0.0.1
10.0.0.2
10.0.0.3



si je passe la commande

[host]#for I in `grep -v "#" monfic | cut -d: -f4 `;do echo "$I" ; done;
10.0.0.1
fic1
fic2
fic3
10.0.0.3


je ne comprends pas le résutat, car non seulement 10.0.0.2 disparait, mais
en plus
c'est remplacer par le listage du répertoire courant !!!



J'ai aussi cette autre différence de comportement.
je n'arrive pas à l'expliquer.


commande direct:
[host]#grep -v "#" monfic | cut -d: -f1,2,3,4
"Jean Dupond1":*:*:10.0.0.1
"Jean Dupond2":*:*:10.0.0.2
"Jean Dupond3":*:*:10.0.0.3


commande qui sera dans un script :
[host]#for I in `grep -v "#" monfic | cut -d: -f1,2,3,4 `;do echo "$I---" ;
done;
"Jean---
Dupond1":*:*:10.0.0.1---
"Jean---
Dupond2":*:*:10.0.0.2---
"Jean---
Dupond3":*:*:10.0.0.3---


note : je demande le champs 1,2,3,4 pour tester, et j'ajoute le --- pour
comprendre où est la fin de $I.

quelqu'un peut-il m'expliquer ?

Jo.

6 réponses

Avatar
Stephane CHAZELAS
Le Fri, 11 Jul 2003 10:50:37 +0200, Jo écrivait :
[...]
[host]#for I in `grep -v "#" monfic | cut -d: -f4 `;do echo "$I" ; done;
10.0.0.1
fic1
fic2
fic3
10.0.0.3


je ne comprends pas le résutat, car non seulement 10.0.0.2 disparait, mais
en plus
c'est remplacer par le listage du répertoire courant !!!


Je pense que si tu rajoutais "set -f" avant le for, tu verrais:

10.0.0.1
*
10.0.0.3

Mais je ne vois pas pourquoi 10.0.0.2 disparait au profit d'une
étoile..

J'ai aussi cette autre différence de comportement.
je n'arrive pas à l'expliquer.


commande direct:
[host]#grep -v "#" monfic | cut -d: -f1,2,3,4
"Jean Dupond1":*:*:10.0.0.1
"Jean Dupond2":*:*:10.0.0.2
"Jean Dupond3":*:*:10.0.0.3


commande qui sera dans un script :
[host]#for I in `grep -v "#" monfic | cut -d: -f1,2,3,4 `;do echo "$I---" ;
done;
"Jean---
Dupond1":*:*:10.0.0.1---
"Jean---
Dupond2":*:*:10.0.0.2---
"Jean---
Dupond3":*:*:10.0.0.3---


Là c'est simple, l'output de "grep -v "#" monfic | cut -d:
-f1,2,3,4" est découpé (par l'utilisation des `...`), sur les
sauts de lignes, mais aussi sur les espaces et les tabulations
(enfin tous les caractère qui composent le paramètre spécial
IFS).

Tu devrais donc faire:
IFS='
' # juste un saut de ligne;
set -f
for i in `...

--
Stéphane

Avatar
Stephane Dupille
< snip >
si je passe la commande
[host]#for I in `grep -v "#" monfic | cut -d: -f4 `;do echo "$I" ; done;
10.0.0.1
fic1
fic2
fic3
10.0.0.3


Chez moi ça marche :
~> for I in `grep -v "#" monfic | cut -d: -f4 `;do echo "$I" ; done;
10.0.0.1
10.0.0.2
10.0.0.3

Quel est le shell utilisé ? Moi j'ai utilisé zsh, mais avec bash ça
tourne aussi. csh m'envoie chier (il ne connait pas for).

Pour info, j'ai utilisé le gnu-cut sous linux, et j'ai également
essayé avec le cut FreeBSD, qui marche bien également.

Tu es sûr que la variable $I n'a pas été déjà définie auparavant ?
En changeant la variable, ça donne quoi ?

--
Floriano veux détruire le ng , alors pour quoi ne pas le résusiter
juste après sa destruction je m'explique il ne veux plus de ce groupe
ben ont en recrée un nouveau du même nom
-+- L in GNU - Neuneu fait des miracles -+-

Avatar
Jo
"Stephane CHAZELAS" a écrit dans le message
news:
Je pense que si tu rajoutais "set -f" avant le for, tu verrais:

10.0.0.1
*
10.0.0.3

ok, quand je mets "set -f" avant le for çà marche.

Pourquoi ?

à quoi sert ce set -f ?


Jo

Avatar
Jo
"Stephane Dupille" <sdupille+ a écrit dans le message news:


Chez moi ça marche :
~> for I in `grep -v "#" monfic | cut -d: -f4 `;do echo "$I" ; done;
10.0.0.1
10.0.0.2
10.0.0.3
Le fichier que j'ai donné est extrait.

sur un petite taille je n'ai pas le problème.

Quel est le shell utilisé ? Moi j'ai utilisé zsh, mais avec bash ça
tourne aussi. csh m'envoie chier (il ne connait pas for).
bash


Pour info, j'ai utilisé le gnu-cut sous linux, et j'ai également
essayé avec le cut FreeBSD, qui marche bien également.
j'ai utilisé un cut sous linux noyau 2.4 (redhat 8)

#cut --version
cut (textutils) 2.0.21
crit par David Ihnat, David MacKenzie, and Jim Meyering.
Copyright (C) 2002 Free Software Foundation, Inc.
...


Tu es sûr que la variable $I n'a pas été déjà définie auparavant ?
oui

En changeant la variable, ça donne quoi ?
idem.


Jo

Avatar
Stephane CHAZELAS
Le Fri, 11 Jul 2003 13:26:45 +0200, Jo écrivait :
Je pense que si tu rajoutais "set -f" avant le for, tu verrais:

10.0.0.1
*
10.0.0.3

ok, quand je mets "set -f" avant le for çà marche.

Pourquoi ?

à quoi sert ce set -f ?


À désactiver la "filename generation".

echo *

affiche "*" après "set -f".

et
a='*'
echo $a
echo `echo '*'`

aussi. Sur tous les shells excepté zsh, on devrait mettre
« IFS=; set -f » en début de script pour éviter les surprises
telles que celle que tu as eue, et mettre un "set +f" ou IFS=" "
ponctuellement juste quand on veut utiliser le "word splitting"
ou la "filename generation".

--
Stéphane


Avatar
Stephane Dupille
ok, quand je mets "set -f" avant le for çà marche.
Pourquoi ?


No se, il faudrait l'extrait de la ligne qui foire pour comprendre.
Si j'arrivais à reproduire je pourrais peut-être trouver une
explication, mais là...

à quoi sert ce set -f ?


Extrait de « help set » sous bash :
-f Disable file name generation (globbing).

--
MS> A quand une hiérachie alternative en langue française??
SP> Quand vous aurez lancé les messages de contrôle idoines.
MS> Je les connais pas ? Peut-tu les publié ici même?
-+- MS in GNU : Mon neuneu est un aaaaartiste -+-