Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/10/2007, 17h42   #1
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 400
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 44
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 400
Points : 4 943
Points : 4 943
Par défaut [bash]Modification de paramètres dans une boucle

Bonjour

Je ne vois pas pourquoi le passage dans ma boucle grep "/media/" /etc/mtab | grep -v floppy | grep -v cdrom | while read LINE ; do ne modifie pas les valeurs de mes paramètres !
Ou plutôt, pourquoi les modifications de mes paramètres ne sont pas retenues.

On voit bien qu'ils sont affectés, mais en fin de boucle on retrouve les valeurs d'avant !

Code :
1
2
3
4
5
6
7
8
9
10
11
drap=1
 
echo "drap=$drap => $mes"
 
grep "/media/" /etc/mtab | grep -v floppy | grep -v cdrom | while read LINE ; do
 drap=`echo $(($drap+1))`
 mes=$(echo "$mes \n$LINE")
 echo "drap=$drap => $mes"
done
 
echo "drap=$drap => $mes"
donne
Code :
1
2
3
drap=1 => 1 clef(s) rajoutée(s)
drap=2 => 1 clef(s) rajoutée(s) \n/dev/sdd1 /media/h2 vfat rw,nosuid,nodev,sync,users,umask=0022,iocharset=utf8 0 0
drap=1 => 1 clef(s) rajoutée(s)
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2007, 17h56   #2
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
Parce que le pipe crée un nouveau processus (par fork). C'est donc un processus fils qui exécute la boucle while. Les variables modifiées ne sont donc pas reportées au père.

Tu peux faire un mkfifo, rediriger la sortie dans le tube nommé et lire les infos dans le processus père.

Je ne sais pas s'il y a plus simple.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2007, 18h36   #3
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 400
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 44
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 400
Points : 4 943
Points : 4 943
man mkfifo est très peu parlant ! J'aurais besoin d'un exemple pour comprendre.
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2007, 19h49   #4
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
Ça doit le faire

Code :
1
2
3
4
5
6
7
8
9
10
11
12
drap=1
echo "drap=$drap => $mes"
mkfifo PipeLine
grep "/media/" /etc/mtab | grep -E -v "(floppy|cdrom)" > PipeLine &
while read LINE ; do
  ((drap=drap+1))
  mes=$(echo "$mes \n$LINE")
  echo "drap=$drap => $mes"
done < PipeLine
echo "drap=$drap => $mes"
rm PipeLine
__________________
Loi de Murphy:
La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
BlaireauOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2007, 19h56   #5
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 400
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 44
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 400
Points : 4 943
Points : 4 943
Ça marche !

Il me reste à comprendre...

__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2007, 22h52   #6
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 400
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 44
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 400
Points : 4 943
Points : 4 943
À tester :
Code :
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
[...]
drap=1
 
while read line; do
	drap=$((drap+1))
	mes="$mes \n$line"
        echo "$line"
done < <(grep "/media/" /etc/mtab | grep -v floppy | grep -v cdrom)
 
echo $drap
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2007, 23h01   #7
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
Oui, pas mal. La notation <( ) crée un file descriptor temporaire.
C'est donc la même logique qu'avec mkfifo, c'est plus joli, mais moins portable (ce n'est pas posix).
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2007, 23h30   #8
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
Autre solution

Code :
1
2
3
4
5
6
7
8
drap=1
echo "drap=$drap => $mes"
for LINE in $(grep "/media/" /etc/mtab | grep -E -v "(floppy|cdrom)") ; do
  ((drap=drap+1))
  mes=$(echo "$mes \n$LINE")
  echo "drap=$drap => $mes"
done 
echo "drap=$drap => $mes"
__________________
Loi de Murphy:
La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
BlaireauOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/10/2007, 23h51   #9
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
Oui, mais c'est assez différent : tout le contenu de la commande est stocké en mémoire avant d'exécuter la boucle. Sur un flux très long, c'est à déconseiller. Si l'entrée correspond au clavier, le comportement sera différent (non interactif).

Mais si la commande renvoie peu de résultats, c'est en effet une bonne alternative.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2007, 07h11   #10
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 400
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 44
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 400
Points : 4 943
Points : 4 943
Je comprends mieux cette méthode qui me montre en plus comment utiliser un grep -v avec 2 mots à virer.
C'était une question que je me posait depuis longtemps ! En plus, elle doit aussi marcher pour sélectionner les lignes qui contiennent soit un mot, soit l'autre : encore mieux que prévu !
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2007, 10h42   #11
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 400
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 44
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 400
Points : 4 943
Points : 4 943
Je corrige :
Citation:
Envoyé par BlaireauOne Voir le message
Autre solution

Code :
1
2
3
4
5
6
7
8
drap=1
echo "drap=$drap => $mes"
for LINE in "$(grep "/media/" /etc/mtab | grep -E -v "(floppy|cdrom)")" ; do
  ((drap=drap+1))
  mes=$(echo "$mes \n$LINE")
  echo "drap=$drap => $mes"
done 
echo "drap=$drap => $mes"
En effet, mes lignes contiennent plusieurs paramètres, donc je maintiens leur unité avec les ".
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2007, 11h28   #12
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 400
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 44
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 400
Points : 4 943
Points : 4 943
Et bien, ça ne marche pas non plus... Ça concatène la sortie en un seul bloc... Il faudrait concaténer uniquement les lignes. Et, là, pas d'idée !
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2007, 11h51   #13
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
Code :
1
2
3
IFS="
"
for LINE in $(grep "/media/" /etc/mtab | grep -E -v "(floppy|cdrom)") ; do
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2007, 14h38   #14
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 400
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 44
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 400
Points : 4 943
Points : 4 943
C'est quoi ce :
IFS="
"


Qu'est-ce qu'il fait au juste ? Un man ne dit rien !
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2007, 15h12   #15
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
Si, c'est expliqué dans le man (bash).

IFS = Internal Field Separator. Ca indique au shell comment découper les tokens. Par défaut, il utilise l'espace, la tabulation et le retour ligne. Ma ligne indique que le seul séparateur de mots est le retour ligne.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2007, 15h22   #16
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 400
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 44
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 400
Points : 4 943
Points : 4 943
Très fort ! Mais après l'utilisation de cet artifice, on doit le remettre comme avant ! Et là, le man bash n'est pas très parlant :
Code :
1
2
       IFS    The Internal Field Separator that is used for word splitting after expansion and to  split  lines  into  words  with  the  read
              builtin command.  The default value is ‘‘<space><tab><newline>''.
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2007, 15h26   #17
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
En général, non.
Ton script étant exécuté dans un sous-shell, la modification de l'IFS n'est pas censée être répercutée en dehors. Si tu veux le restaurer pour la suite de ton script, c'est pas compliqué :
Code :
1
2
3
IFS_OLD="$IFS"
...
IFS="$IFS_OLD"
Et le man est parlant : il te donne la valeur par défaut (espace - tabulation - retour ligne).
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2007, 16h02   #18
Rédacteur/Modérateur
 
Avatar de troumad
 
Homme Bernard SIAUD
Enseignant
Inscription : novembre 2003
Messages : 4 400
Détails du profil
Informations personnelles :
Nom : Homme Bernard SIAUD
Âge : 44
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Enseignant
Secteur : Enseignement

Informations forums :
Inscription : novembre 2003
Messages : 4 400
Points : 4 943
Points : 4 943
J'avais vu, mais je ne voyais pas comment générer moi même cet ancien IFS. C'est vrai qu'il suffisait de le mémoriser !

J'en aurais appris des choses
Et ma correction de copies n'avance pas
C'est ma femme qui va raller !

beaucoup !
__________________
Modérateur Mandriva Linux
Amicalement VOOotre
Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
Mes tutoriels
troumad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/10/2007, 16h05   #19
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 946
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 946
Points : 1 085
Points : 1 085
Voilà !
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h11.


 
 
 
 
Partenaires

Hébergement Web