#1 Le 21/12/2022, à 23:40
- diesel
[RÉSOLU] Sous-shell et paramètre "global"
J'ai le code suivant (avec un bon shebang ) :
#!/bin/bash
toto='non'
host ntp.ubuntu.com | grep "IPv6 address" | while read ligne_adresse
do
adresse=${ligne_adresse#*"IPv6 address "}
if [ $adresse = "2620:2d:4000:1::41" ]
then
toto='oui'
fi
done
echo $toto
exit 0
Comme la ligne "toto='oui'" est dans un sous-shell du fait des deux pipes, la dernière ligne "echo $toto" donne toujours le résultat "non".
Je ne vois pas comment coder ça autrement pour ne pas me retrouver dans un sous-shell et pouvoir modifier mon paramètre toto dans le if imbriqué.
Vous avez une idée ?
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 22/12/2022, à 08:21)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#2 Le 22/12/2022, à 00:05
- Watael
Re : [RÉSOLU] Sous-shell et paramètre "global"
avec une substitution de processus :
$ toto='non'
$ while read ntp; do [[ $ntp == *2620:2d:4000:1::41 ]] && toto='oui'; done < <(host ntp.ubuntu.com)
$ echo $toto
oui
$
Dernière modification par Watael (Le 22/12/2022, à 00:05)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#3 Le 22/12/2022, à 07:30
- diesel
Re : [RÉSOLU] Sous-shell et paramètre "global"
Bonjour Watael,
Dans ton exemple, il en manque un bout (la sélection des adresses ipv6) mais je crois que je comprends le principe et que je vais réussir à faire avec.
Je posterai le résultat définitif si j'y arrive.
[EDIT] J'arrive à ça :
#!/bin/bash
toto='non'
while read ligne_adresse
do
adresse=${ligne_adresse#*"IPv6 address "}
if [ $adresse = "2620:2d:4000:1::41" ]
then
toto='oui'
fi
done < <(host ntp.ubuntu.com | grep "IPv6 address")
echo $toto
exit 0
Merci Watael
Pour ce qui est des "if" au lieu des tests, le bout de code présenté est juste un exemple simplifié du code réel qui justifie, lui, l'emploi des "if". [/EDIT]
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 22/12/2022, à 08:19)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#4 Le 22/12/2022, à 08:20
- Watael
Re : [RÉSOLU] Sous-shell et paramètre "global"
Dans ton exemple, il en manque un bout (la sélection des adresses ipv6)
puisque tu recherches une adresse IPv6 spécifique, non.
sur aussi peu de lignes, je ne sais pas si grep améliore le fonctionnement de la boucle, ou si, comme toute commande externe, il ralentit le script ...
Dernière modification par Watael (Le 22/12/2022, à 08:23)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#5 Le 22/12/2022, à 09:33
- matrix-bx
Re : [RÉSOLU] Sous-shell et paramètre "global"
Salut,
tu peux sauver un | grep avec host -t AAAA
Utilisations des balises de mises en formes.
Hors ligne
#6 Le 22/12/2022, à 10:53
- Watael
Re : [RÉSOLU] Sous-shell et paramètre "global"
+1
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#7 Le 22/12/2022, à 12:53
- diesel
Re : [RÉSOLU] Sous-shell et paramètre "global"
Salut,
tu peux sauver un | grep avec host -t AAAA
Ça, c'est une bonne idée ! Je n'avais pas pensé à creuser les options éventuelles de la commande host. Honte à moi.
J'arrive à ça :
#!/bin/bash
toto='non'
while read ligne_adresse
do
adresse=${ligne_adresse#*"IPv6 address "}
if [ $adresse = "2620:2d:4000:1::41" ]
then
toto='oui'
fi
done < <(host -6 -t AAAA ntp.ubuntu.com)
echo $toto
exit 0
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 22/12/2022, à 13:14)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#8 Le 22/12/2022, à 13:00
- diesel
Re : [RÉSOLU] Sous-shell et paramètre "global"
diesel a écrit :Dans ton exemple, il en manque un bout (la sélection des adresses ipv6)
puisque tu recherches une adresse IPv6 spécifique, non.
sur aussi peu de lignes, je ne sais pas si grep améliore le fonctionnement de la boucle, ou si, comme toute commande externe, il ralentit le script ...
Comme je l'ai écrit plus haut, le script que je vous ai fourni est une version édulcorée d'un script beaucoup plus complet dont le seul but était de mettre en lumière mon problème de sous-shell.
Et bien évidement, dans le vrai script, j'ai des traitements sur toutes les adresses ipv6 remontées par la commande host et une condition plus complexe que simplement comparer à une adresse fixe pour déterminer si la variable "toto" (elle s'appelle autrement dans le script réel) doit passer à 'oui'. De même le nom ntp.ubuntu.com n'est pas le seul à être examiné.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#9 Le 23/12/2022, à 11:53
- diesel
Re : [RÉSOLU] Sous-shell et paramètre "global"
Salut,
tu peux sauver un | grep avec host -t AAAA
Ben..., finalement, non.
Parce que :
jean-marie@jean-marie:~$ host -6 -t AAAA pop3.live.com
pop3.live.com is an alias for outlook-live.office365.com.
outlook-live.office365.com is an alias for outlook.office365.com.
outlook.office365.com is an alias for outlook.ha.office365.com.
outlook.ha.office365.com is an alias for outlook.ms-acdc.office.com.
outlook.ms-acdc.office.com is an alias for CDG-efz.ms-acdc.office.com.
CDG-efz.ms-acdc.office.com has IPv6 address 2603:1026:c0a:1830::2
CDG-efz.ms-acdc.office.com has IPv6 address 2603:1026:c0a:853::2
CDG-efz.ms-acdc.office.com has IPv6 address 2603:1026:100:1a::2
CDG-efz.ms-acdc.office.com has IPv6 address 2603:1026:c0a:8e9::2
jean-marie@jean-marie:~$
Il faut que j'élimine les lignes contenant 'alias'.
Amica&lement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#10 Le 23/12/2022, à 12:59
- Watael
Re : [RÉSOLU] Sous-shell et paramètre "global"
while read line
do
[[ $line =~ alias ]] && continue # et hop ! plus de grep
: ...
done < <(host ...)
Dernière modification par Watael (Le 23/12/2022, à 12:59)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#11 Le 23/12/2022, à 21:22
- diesel
Re : [RÉSOLU] Sous-shell et paramètre "global"
oui.
Moi, j'élimine d'un seul coup avant de rentrer dans la boucle.
Toi, tu fais au coup pas coup dans la boucle.
Je ne sais pas lequel est le plus efficace.
Une seule chose est certaine : host -t AAAA ne règle pas tous les problèmes (dans ce cas de figure).
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 23/12/2022, à 21:22)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#12 Le 24/12/2022, à 03:20
- Watael
Re : [RÉSOLU] Sous-shell et paramètre "global"
"moi", j'évite les commandes externes autant que possible*.
si le shell peut le faire, je ne "sous-traite" pas.
--
* parfois, j'ai tort, et le seul emploi de commandes externes est la bonne solution; on a vu le cas récemment, où j'utilisais une boucle, quand paste faisait parfaitement le boulot.
mais, ici, puisque le boucle est indispensable, alors on doit pouvoir se passer de grep...
Dernière modification par Watael (Le 24/12/2022, à 03:24)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#13 Le 24/12/2022, à 18:14
- diesel
Re : [RÉSOLU] Sous-shell et paramètre "global"
Mouairf...,
La question n'est pas "moi" je fais comme ci et "toi" tu fais comme ça. Dans mon post #11, c'était juste pour faire, d'une part référence à ce que j'avais écrit dans mon post #7 et ce que tu avais écrit dans ton post #10.
Avec une boucle while et quelques tests, je pense réussir à émuler n'importe quel grep (et je pense que tu saurais le faire bien mieux que moi). Pour autant, cela veut-il dire qu'il ne faut JAMAIS utiliser la commande grep dans un script ? Je ne suis pas si ayatolesque.
Pour ce qui concerne le site pop3.live.com, il y a une dizaine de lignes à tester. Est-ce qu'un grep, codé en C, appelé une seule fois, saura faire mieux (en temps d'exécution) qu'un test suivi d'un continue interprétés répétés 10 fois ? A titre personnel, je n'ai ni la réponse ni le temps pour tester. De plus, dans le cas du host "nettoyé" par un grep, la boucle while (entière) n'est pas lancée du tout pour les lignes d'aliases.
Par ailleurs, pour des questions de clarté du code et de débogage, je préfère rentrer dans une boucle avec un jeu de données le plus "propre" possible. En l’occurrence, il n'y a, à mon sens, aucun intérêt à rentrer dans cette boucle destinée à traiter des adresses avec des lignes comportant des aliases.
Quitte à me répéter, ce n'est pas une guéguerre entre Watael et moi pour savoir qui sait le mieux coder en bash. Je connais trop bien la réponse.
Après, si tu me trouves un moyen de "nettoyer" la sortie de la commande host sans utiliser grep, je prends tout de suite.
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 24/12/2022, à 18:21)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#14 Le 24/12/2022, à 19:31
- Watael
Re : [RÉSOLU] Sous-shell et paramètre "global"
la boucle while (entière) n'est pas lancée du tout pour les lignes d'aliases.
+1
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#15 Le 24/12/2022, à 19:39
- diesel
Re : [RÉSOLU] Sous-shell et paramètre "global"
la boucle while (entière) n'est pas lancée du tout pour les lignes d'aliases.
+1
Oui, et...
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#16 Le 25/12/2022, à 06:31
- Watael
Re : [RÉSOLU] Sous-shell et paramètre "global"
et, c'est tout.
c'est un bon argument pour conserver grep.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#17 Le 25/12/2022, à 08:30
- matrix-bx
Re : [RÉSOLU] Sous-shell et paramètre "global"
Salut,
matrix-bx@laptop:~$ cat test1.sh
#!/bin/bash
toto='non'
let i=0
while read ligne_adresse
do
let i++
adresse=${ligne_adresse#*"IPv6 address "}
if [ $adresse = "2603:1026:100:1a::2" ]
then
toto='oui'
fi
done < <(host -t AAAA pop3.live.com | grep -v alias)
echo $toto
echo $i
exit 0
matrix-bx@laptop:~$
matrix-bx@laptop:~$ cat test2.sh
#!/bin/bash
toto='non'
let i=0
while read ligne_adresse
do
let i++
adresse=${ligne_adresse#*"IPv6 address "}
[[ $adresse =~ alias ]] && continue
if [ $adresse = "2603:1026:100:1a::2" ]
then
toto='oui'
fi
done < <(host -t AAAA pop3.live.com)
echo $toto
echo $i
exit 0
matrix-bx@laptop:~$
matrix-bx@laptop:~$ time ./test1.sh
non
4
real 0m0,087s
user 0m0,033s
sys 0m0,015s
matrix-bx@laptop:~$
matrix-bx@laptop:~$ time ./test2.sh
non
9
real 0m0,053s
user 0m0,028s
sys 0m0,017s
matrix-bx@laptop:~$
Vous pouvez reprendre une activité familiale normale.
Bonnes fêtes ;p
Utilisations des balises de mises en formes.
Hors ligne
#18 Le 25/12/2022, à 09:03
- Watael
Re : [RÉSOLU] Sous-shell et paramètre "global"
pour être certain que c'est grep le responsable, il faudrait, au lieu d'utiliser une connexion réseau instable (le trafic peut varier à chaque instant), utiliser un fichier dans lequel sera préalablement redirigé le résultat de la requête host.
et...
$ time /tmp/avec_grep.bash
non
4
real 0m0,013s
user 0m0,010s
sys 0m0,004s
$ time /tmp/sans_grep.bash
non
9
real 0m0,008s
user 0m0,004s
sys 0m0,004s
ben, c'est pire que ce que je croyais. 8O
l'hypothèse que le grep permette de ne pas entrer dans la boucle et améliore l'exécution du script semblait raisonnable, mais les faits la démentent.
je suis surpris.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#19 Le 25/12/2022, à 18:49
- diesel
Re : [RÉSOLU] Sous-shell et paramètre "global"
J'ai écrit le même genre de code en mettant le résultat du host dans un fichier (/usr/toto pour bénéficier d'un SSD nvme)
jean-marie@jean-marie:~$ cat /usr/toto
pop3.live.com is an alias for outlook-live.office365.com.
outlook-live.office365.com is an alias for outlook.office365.com.
outlook.office365.com is an alias for outlook.ha.office365.com.
outlook.ha.office365.com is an alias for outlook.ms-acdc.office.com.
outlook.ms-acdc.office.com is an alias for CDG-efz.ms-acdc.office.com.
CDG-efz.ms-acdc.office.com has IPv6 address 2603:1026:100:1a::2
CDG-efz.ms-acdc.office.com has IPv6 address 2603:1026:101::2
CDG-efz.ms-acdc.office.com has IPv6 address 2603:1026:c0a:851::2
CDG-efz.ms-acdc.office.com has IPv6 address 2603:1026:100:16::2
jean-marie@jean-marie:~$
Puis, j'ai écrit les deux codes suivants :
jean-marie@jean-marie:~$ cat toto.bash
#!/bin/bash
toto='non'
while read ligne_adresse
do
adresse=${ligne_adresse#*"IPv6 address "}
if [ $adresse = "2603:1026:101::2" ]
then
toto='oui'
fi
done < <(cat /usr/toto | grep -v alias)
echo $toto
exit 0
jean-marie@jean-marie:~$
jean-marie@jean-marie:~$ cat tutu.bash
#!/bin/bash
toto='non'
while read ligne_adresse
do
[[ $ligne_adresse =~ alias ]] && continue
adresse=${ligne_adresse#*"IPv6 address "}
if [ $adresse = "2603:1026:101::2" ]
then
toto='oui'
fi
done < /usr/toto
echo $toto
exit 0
jean-marie@jean-marie:~$
Et j'ai les résultats suivants :
jean-marie@jean-marie:~$ time ./toto.bash
oui
real 0m0,005s
user 0m0,004s
sys 0m0,003s
jean-marie@jean-marie:~$ time ./tutu.bash
oui
real 0m0,003s
user 0m0,000s
sys 0m0,003s
jean-marie@jean-marie:~$
Effectivement, la version avec grep est à la traîne ; enfin, de pas beaucoup, surtout dans le cas du script réel qui fait plein d'autres choses.
Et si j'ai écrit cat /usr/toto | grep -v alias au lieu de grep -v alias /usr/toto, c'est pour conserver le pipe.
Aussi, vu le peu de différence entre les deux, le fait de rentrer dans la boucle avec des données "nettoyées" vaut largement, pour moi, les 2ms perdues. Je vais donc conserver mon grep (pour cette fois).
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#20 Le 25/12/2022, à 18:54
- diesel
Re : [RÉSOLU] Sous-shell et paramètre "global"
l'hypothèse que le grep permette de ne pas entrer dans la boucle et améliore l'exécution du script semblait raisonnable, mais les faits la démentent.
je suis surpris.
Est-ce que ce n'est pas le pipe qui coûte cher (plus que le grep) ?
[EDIT] Bof, j'ai essayé sans le pipe, pas une grande différence). [/EDIT]
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#21 Le 25/12/2022, à 20:09
- MicP
Re : [RÉSOLU] Sous-shell et paramètre "global"
Bonjour
Sinon, il y a aussi :
toto="non"
grep -q 2620:2d:4000:1::40 <<< $(host -6 -t AAAA ntp.ubuntu.com) && toto="oui"
echo $toto
Dernière modification par MicP (Le 25/12/2022, à 20:12)
Hors ligne
#22 Le 25/12/2022, à 20:15
- diesel
Re : [RÉSOLU] Sous-shell et paramètre "global"
Merci MicP, mais j'ai écrit plus haut que le code présenté là est juste une version TRÈS édulcorée d'un véritable script dans lequel le traitement sur les adresses est plus complexe que juste les comparer à une adresse fixe.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#23 Le 25/12/2022, à 20:55
- Watael
Re : [RÉSOLU] Sous-shell et paramètre "global"
Bonjour
Sinon, il y a aussi :
toto="non" grep -q 2620:2d:4000:1::40 <<< $(host -6 -t AAAA ntp.ubuntu.com) && toto="oui" echo $toto
quelle horreur ! on dirait un mélange d'odeurs de beurre d'ail rance et de coquilles d'huîtres restées au chaud.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#24 Le 26/12/2022, à 12:58
- diesel
Re : [RÉSOLU] Sous-shell et paramètre "global"
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne