Portée variable des scripts shell et des fonctions du script

Je suis un peu confondu avec mon script concernant les fonctions, la scope des variables et, éventuellement, les sous-couches. J’ai vu dans un autre post que les pipes généraient un sous-shell et que le shell parent ne pouvait pas accéder aux variables du sous-shell. Est-ce le même cas avec les cmds exécutés dans les backticks aussi?

Pour ne pas ennuyer les gens, j’ai raccourci mon script de plus de 100 lignes, mais j’ai essayé de me rappeler de laisser les éléments importants (p. Ex., Punaises, tuyaux, etc.). J’espère que je n’ai rien laissé de côté.

global1=0 global2=0 start_read=true function testfunc { global1=9999 global2=1111 echo "in testfunc" echo $global1 echo $global2 } file1=whocares file2=whocares2 for line in `cat $file1` do for i in `grep -P "\w+ stream" $file2 | grep "$line"` # possible but unlikely problem spot do end=$(echo $i | cut -d ' ' -f 1-4 | cut -d ',' -f 1) # possible but unlikely spot duration=`testfunc $end` # more likely problem spot done done echo "global1 = $global1" echo "global2 = $global2" 

Donc, lorsque je lance mon script, la dernière ligne indique global1 = 0. Cependant, dans ma fonction testfunc, global1 est défini sur 9999 et les msgs de débogage impriment que dans la fonction au moins, il s’agit de 9999.

Deux questions ici:

  1. Est-ce que les backticks génèrent un sous-shell et que mon script ne fonctionne pas?
  2. Comment puis-je contourner ce problème?

Merci d’avance pour votre aide.

Vous pouvez essayer quelque chose comme

 global1=0 global2=0 start_read=true function testfunc { global1=9999 global2=1111 echo "in testfunc" echo $global1 echo $global2 duration=something } file1=whocares file2=whocares2 for line in `cat $file1` do for i in `grep -P "\w+ stream" $file2 | grep "$line"` # possible but unlikely problem spot do end=$(echo $i | cut -d ' ' -f 1-4 | cut -d ',' -f 1) # possible but unlikely spot testfunc $end # more likely problem spot done done echo "global1 = $global1" echo "global2 = $global2" 

Do the backticks spawn a subshell and thus making my script not work? :

Oui, ils le font et toute modification apscope à variable dans un sous-shell n’est pas visible dans le shell parent.

How do I work around this issue?

Vous pouvez probablement essayer cette boucle pour éviter de créer un sous-shell:

 while read line do while read i do end=$(echo $i | cut -d ' ' -f 1-4 | cut -d ',' -f 1) duration=$(testfunc "$end") done < <(grep -P "\w+ stream" "$file2" | grep "$line") done < "$file1" 

PS: Mais testfunc sera toujours appelé en sous-processus.