Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 hmm big_smile ) :

#!/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"

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. smile
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 wink


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"

matrix-bx a écrit :

Salut,
tu peux sauver un | grep avec host -t AAAA wink

Ça, c'est une bonne idée ! Je n'avais pas pensé à creuser les options éventuelles de la commande host. Honte à moi. sad lol lol

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"

Watael a écrit :
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. smile
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"

matrix-bx a écrit :

Salut,
tu peux sauver un | grep avec host -t AAAA wink

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 ...)

big_smile

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. smile

--
* 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. wink smile

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"

Watael a écrit :

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"

Watael a écrit :

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"

MicP a écrit :

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"

lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol

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