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 11/01/2024, à 13:43

arvernes

[Résolu] Script qui appelle un autre script

Bonjour,
J'ai fait deux scripts bash. Ils sont assez longs, ils ont des prompts auxquels on doit répondre, etc.
Mon problème est que je voudrais que le script 1 s'exécute pour partie, puis appelle le script 2 qui va s'exécuter, et que le script 2 redonne la main au script 1 pour qu'il puisse finir ce qu'il a à faire.
J'ai essayé avec la commande "source script2", mais ça ne redonne pas la main au script1. Est-ce possible ? et si oui, comment ? Merci beaucoup.

Dernière modification par arvernes (Le 17/01/2024, à 14:10)

Hors ligne

#2 Le 11/01/2024, à 14:41

jplemoine

Re : [Résolu] Script qui appelle un autre script

Attention : de mémoire, source concatène le script 2 à l'endroit du script 1.
En fait, pour appeler le script, il suffit de mettre son nom avec le chemin.
S'il est dans le même répertoire, il faut mettre ./ devant
Contenu du script1

...
...
./script2
...
...

Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#3 Le 11/01/2024, à 14:44

pingouinux

Re : [Résolu] Script qui appelle un autre script

Bonjour,

$ cat ./script1.sh
echo "Début du script1"
echo "Dans le script1 avant appel du script2"
./script2.sh
echo "Dans le script1 après appel du script2"
$ cat ./script2.sh
echo "Dans le script2"
$ ./script1.sh
Début du script1
Dans le script1 avant appel du script2
Dans le script2
Dans le script1 après appel du script2

Hors ligne

#4 Le 11/01/2024, à 15:46

alduc31

Re : [Résolu] Script qui appelle un autre script

Salut,

arvernes a écrit :

Mon problème est que je voudrais que le script 1 s'exécute pour partie, puis appelle le script 2 qui va s'exécuter, et que le script 2 redonne la main au script 1 pour qu'il puisse finir ce qu'il a à faire.

Tu veux que script2 redonne la main à script1 immédiatement alors qu'il est en train de s'exécuter ? Si oui :

...
...
./script2  &
...
...

Asus UX325EA oled (i5-1135G7,16Go) avec Lunar 23.04 (base xubuntu modifiée)

Hors ligne

#5 Le 12/01/2024, à 07:16

arvernes

Re : [Résolu] Script qui appelle un autre script

Merci à tous pour vos réponses. Ca marche nickel. Une question encore, mais je pense que ce n'est pas possible. Le script2 va récupérer une variable, qui comme son nom l'indique n'est pas toujours la même. Est-il possible lorsque script2 redonne la main à script1 qu'il lui passe cette variable pour que script1 puisse l'utiliser? Merci

Hors ligne

#6 Le 12/01/2024, à 07:39

Watael

Re : [Résolu] Script qui appelle un autre script

c'est tout à fait possible, de la même manière qu'avec n'importe quelle commande.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 12/01/2024, à 07:51

krodelabestiole

Re : [Résolu] Script qui appelle un autre script

si tu suis la réponse #4, pas forcément : les 2 scripts sont exécutés en parallèle.
tu devrais peut-être donner plus d'explication sur ce que tu cherches à faire.

Hors ligne

#8 Le 12/01/2024, à 08:22

Watael

Re : [Résolu] Script qui appelle un autre script

je ne vois pas d'ambiguïté dans l'énoncé :

je voudrais que le script 1 s'exécute pour partie, puis appelle le script 2 qui va s'exécuter, et que le script 2 redonne la main au script 1


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 12/01/2024, à 09:08

krodelabestiole

Re : [Résolu] Script qui appelle un autre script

non, il n'y a pas d'ambiguïté. si je propose de donner le contexte c'est parce qu'en n'ayant connaissance que d'un détail de la problématique il se peut qu'on ait affaire à un problème x-y, ou qu'il existe des moyens plus simples et efficaces de résoudre le problème. chacun peut aussi avoir différentes méthodes. je pense que ça peut toujours être utile et constructif, il n'y a évidemment rien d'obligatoire.

Hors ligne

#10 Le 12/01/2024, à 09:11

arvernes

Re : [Résolu] Script qui appelle un autre script

Watael a écrit :

c'est tout à fait possible, de la même manière qu'avec n'importe quelle commande.

Dans script2, j'ai 4 variables $CHEMIN1, $CHEMIN2, $VARIABLE1 et $VARIABLE2 qui ont été utilisées par script2, et que je veux passer dans script1.
Dans script1, je lui mets par exemple :

    if [ -f $CHEMIN1/$VARIABLE1 ]; then
      echo "$CHEMIN1/$VARIABLE1"
    else
      echo ""
    fi

ben il ne m'affiche rien, donc j'ai du louper quelque chose car ma solution est trop simple. j'ai lu un post dans le forum, mais malheureusement je ne le comprends pas
J'ai essayé des solutions que j'ai trouvées avec "export", et une autre avec "set -a et set +a", mais je n'ai pas réussi à comprendre comment ça fonctionnait. J'en suis là.
Je pense que mon pb avec "export", est qu'il faudrait que ce soit script1 qui exporte vers script2, mais là, vu que c'est script1 qui appelle script2, une fonction "export" dans script2 ne sert à rien, car script2 n'appelle pas script1.

Dernière modification par arvernes (Le 12/01/2024, à 09:18)

Hors ligne

#11 Le 12/01/2024, à 09:16

krodelabestiole

Re : [Résolu] Script qui appelle un autre script

Watael a écrit :

je ne vois pas d'ambiguïté dans l'énoncé

ou qui proco peut-être ?
de mon côté je répondais à cette question :

arvernes a écrit :

Est-il possible lorsque script2 redonne la main à script1 qu'il lui passe cette variable pour que script1 puisse l'utiliser?

Hors ligne

#12 Le 12/01/2024, à 09:48

arvernes

Re : [Résolu] Script qui appelle un autre script

krodelabestiole a écrit :

si tu suis la réponse #4, pas forcément : les 2 scripts sont exécutés en parallèle.
tu devrais peut-être donner plus d'explication sur ce que tu cherches à faire.

Comme je le disais, j'ai deux scripts, script1 et script2.

script1 et script2 contiennent des variables différentes, en plus script2 fait des trucs dont le résultat est mis dans des variables (ces variables ne sont donc pas fixes d'une fois sur l'autre que je le lance bien sûr).

Script1 se lance, il passe la main à script2, script2 s'exécute, et à la fin de script2, script1 reprend la main.
Je voudrais que script2 (script2 n'appelle pas script1) puisse passer certaines variables à script1. Certaines de ces variables sont fixes, mais la plupart ont été calculées par script2 et je voudrais que script1 reprennent ces variables car il en a besoin dans la suite de son exécution.

Voilà, voilou..... J'ai vu des solutions avec "export", et aussi avec set -a et set +a, mais elles ne pourraient s'appliquer dans ce que j'ai compris que si c'était des variables de script1 que je voulais passer à script2
Merci

Hors ligne

#13 Le 12/01/2024, à 10:05

Watael

Re : [Résolu] Script qui appelle un autre script

le script2 est un processus enfant (il est appelé par script1 dans un sous-environnement), qui ne peut pas changer l'environnement de son "appelant"/parent; un export ne fonctionnera donc pas.
une solution est de faire afficher le contenu des variables pour qu'elles soient lu dans le script parent.

script1 :

#!/bin/bash

cmd1
cmdN
IFS='§' read -r varScript2_1 varScript2_2  varScript2_3 varScript2_4 < <(./script2) #ou bien IFS='§' read -ra tabloVar < <(./script2); varScript2_1=${tabloVar[0]} ...
cmdN+1 "$varScript2_?"
...

script2 :

#!/bin/bash

printf '%s§' "$var1" "$var2" "$var3" "$var4" #où § est un caractère quelconque, dont tu est sûr à 100% qu'il ne figurera jamais dans le contenu des variables

une autre solution est de sourcer le script2 dans le script1, mais ça implique que tout l'environnement du script2 sera exécuté dans le script1 avec le risque d'écrasement de l'environnement  de ce dernier; c'est plutôt déconseillé. tongue

NB: il n'est pas recommandé de numéroter des variables; donne-leur un nom évocateur de ce qu'elles contiennent, et/ou utilise un tableau.

Dernière modification par Watael (Le 12/01/2024, à 10:07)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 12/01/2024, à 10:13

pingouinux

Re : [Résolu] Script qui appelle un autre script

Une autre solution est d'écrire tes variables dans des fichiers temporaires (à partir de script2) : /tmp/tmp_CHEMIN1 /tmp/tmp_CHEMIN2 /tmp/tmp_VARIABLE1 /tmp/tmp_VARIABLE2
et de relire ces fichiers (puis de les détruire) dans script1.

Hors ligne

#15 Le 12/01/2024, à 10:16

arvernes

Re : [Résolu] Script qui appelle un autre script

pingouinux a écrit :

Une autre solution est d'écrire tes variables dans des fichiers temporaires (à partir de script2) : /tmp/tmp_CHEMIN1 /tmp/tmp_CHEMIN2 /tmp/tmp_VARIABLE1 /tmp/tmp_VARIABLE2
et de relire ces fichiers (puis de les détruire) dans script1.

Oui, j'avais trouvé cette solution, mais elle m'oblige à faire des modifs en dur si j'ose dire dans mes scripts, qui m'embêtent un peu. J'avais trouvé ça sur stackoverflow

A.bash:

#!/bin/bash
msg="The Message"
echo $msg > A.pipe

B.bash:

#!/bin/bash
msg=`cat ./A.pipe`
echo "message from A : $msg"

Hors ligne

#16 Le 12/01/2024, à 14:05

Sciensous

Re : [Résolu] Script qui appelle un autre script

je soumets ma proposition aux spécialistes  Watael et pingouinux
et un mkfifo ?

Dernière modification par Sciensous (Le 12/01/2024, à 14:06)


antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )

Hors ligne

#17 Le 12/01/2024, à 14:47

krodelabestiole

Re : [Résolu] Script qui appelle un autre script

Watael a écrit :

le script2 est un processus enfant (il est appelé par script1 dans un sous-environnement), qui ne peut pas changer l'environnement de son "appelant"/parent; un export ne fonctionnera donc pas.

je me posais la question, merci pour cette info !

Hors ligne

#18 Le 12/01/2024, à 15:08

krodelabestiole

Re : [Résolu] Script qui appelle un autre script

arvernes a écrit :

Comme je le disais, j'ai deux scripts, script1 et script2.

j'avais compris, je demandais plutôt la finalité générale. je me dis que bash n'est peut-être pas le langage le plus adéquat à ce projet.

Hors ligne

#19 Le 12/01/2024, à 16:20

Watael

Re : [Résolu] Script qui appelle un autre script

Sciensous a écrit :

je soumets ma proposition aux spécialistes  Watael et pingouinux
et un mkfifo ?

oui, un fifo sera plus rapide qu'une écriture sur disque, puisque tout "reste" en mémoire vive.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#20 Le 12/01/2024, à 16:34

diesel

Re : [Résolu] Script qui appelle un autre script

Watael a écrit :

le script2 est un processus enfant (il est appelé par script1 dans un sous-environnement), qui ne peut pas changer l'environnement de son "appelant"/parent; un export ne fonctionnera donc pas.
une solution est de faire afficher le contenu des variables pour qu'elles soient lu dans le script parent.

script1 :

#!/bin/bash

cmd1
cmdN
IFS='§' read -r varScript2_1 varScript2_2  varScript2_3 varScript2_4 < <(./script2) #ou bien IFS='§' read -ra tabloVar < <(./script2); varScript2_1=${tabloVar[0]} ...
cmdN+1 "$varScript2_?"
...

script2 :

#!/bin/bash

printf '%s§' "$var1" "$var2" "$var3" "$var4" #où § est un caractère quelconque, dont tu est sûr à 100% qu'il ne figurera jamais dans le contenu des variables

une autre solution est de sourcer le script2 dans le script1, mais ça implique que tout l'environnement du script2 sera exécuté dans le script1 avec le risque d'écrasement de l'environnement  de ce dernier; c'est plutôt déconseillé. tongue

NB: il n'est pas recommandé de numéroter des variables; donne-leur un nom évocateur de ce qu'elles contiennent, et/ou utilise un tableau.

Ben..., si les 4 variables de script2 qui ont vocation à être échangées avec script 1 sont déclarées dans script1 ?

[EDIT]Je viens d'essayer. Mauvaise idée.[/EDIT]

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 12/01/2024, à 16:39)


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 12/01/2024, à 17:12

Watael

Re : [Résolu] Script qui appelle un autre script

en effet, les variables déclarées dans le script1 ne sont pas modifiées dans ce script; les valeurs attribuées dans le script2 disparaissent avec son extinction.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#22 Le 12/01/2024, à 18:48

arvernes

Re : [Résolu] Script qui appelle un autre script

Pour le moment, j'en suis là :
dans script1, juste avant de lancer script2, j'ai créé un fichier sémaphore, par un ls > fichier_semaphore_pour_script2.sem
Dans script2, j'ai fait un truc comme ça :

# Si ce script a été lancé par le biais de l'autre script, on va exporter des variables
if [ -f fichier_semaphore_pour_script2.sem ]; then
  echo $EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES > /home/mapomme/0.a_effacer.bak
  echo $NOM_VARIABLE1 > $EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES/11.a_effacer.bak
  echo $NOM_VARIABLE2 > $EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES/12.a_effacer.bak
  echo $NOM_VARIABLE3 > $EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES/13.a_effacer.bak
  echo $NOM_VARIABLE4 > $EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES/21.a_effacer.bak
  echo $NOM_VARIABLE5 > $EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES/22.a_effacer.bak
  echo $NOM_VARIABLE6 > $EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES/23.a_effacer.bak
  echo $NOM_VARIABLE7 > $EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES/24.a_effacer.bak
  echo $NOM_VARIABLE8 > $EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES/25.a_effacer.bak
  echo $NOM_VARIABLE9 > $EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES/81.a_effacer.bak
  rm -f fichier_semaphore_pour_script2.sem
else
  echo ""
fi

J'ai fait ça, car script2 n'est pas toujours lancé par script1, donc j'avais besoin de dire à script2 si il doit ou non me créer tous ces semaphores qui vont être repris par script1

Dans mon script, je n'ai pas mis VARIABLE1, etc, mais des noms qui pour moi veulent dire quelque chose bien sûr. et mon login ce n'est pas "mapomme", comme je l'indique ici.

Maintenant, dans script1 j'en suis là :

EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES=`cat /home/mapomme/0.a_effacer.bak`
NOM_VARIABLE1=`cat $EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES/11.a_effacer.bak`
etc...

if [ -f $EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES/$NOM_VARIABLE1 ]; then
      cd $EMPLACEMENT_TEMPORAIRE_DES_FICHIERS_CREES
      mv -f $NOM_VARIABLE1 /home/mapomme/tmp
      rm -f 11.a_effacer.bak
else
      echo ""
fi

C'est peut être pas très catholique, mais pour le moment, ça marche. Je continue mes essais.

Hors ligne

#23 Le 12/01/2024, à 20:32

Watael

Re : [Résolu] Script qui appelle un autre script

- il faut toujours mettre des guillemets autour des noms de variables. TOUJOURS !
à moins de savoir pourquoi.

- on ne cd pas dans un script, sauf cas très rares.

- mv/rm -f ? t'es sûr ?!

- évidemment, tous ces fichiers temporaires, c'est dégueu.

Dernière modification par Watael (Le 12/01/2024, à 20:33)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#24 Le 12/01/2024, à 22:18

arvernes

Re : [Résolu] Script qui appelle un autre script

Watael a écrit :

- il faut toujours mettre des guillemets autour des noms de variables. TOUJOURS !
à moins de savoir pourquoi.

OK, je vais les rajouter

- on ne cd pas dans un script, sauf cas très rares.

ah, je le fais assez souvent. pourquoi ? c'est vrai que parfois on ne sait pas trop où l'on est, je le reconnais

- mv/rm -f ? t'es sûr ?!

ben je veux être sûr que le fichier sera au bon endroit, ou qu'il sera bien effacé, sans avoir besoin d'un prompt de confirmation. Comme je mets des noms de variables assez compliquées, ça ne peut pas se confondre avec d'autres fichiers à priori

- évidemment, tous ces fichiers temporaires, c'est dégueu.

oui, c'est vraiment pas top mon histoire mais je ne sais pas comment faire différemment. En plus la mise au point, tout au moins pour moi, est longue et compliquée.

Hors ligne

#25 Le 12/01/2024, à 22:34

Watael

Re : [Résolu] Script qui appelle un autre script

tant qu'on ne saura pas ce que exactement ce que fait script2, et pourquoi son contenu est détaché de script1...


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne