#1 Le 11/01/2024, à 12: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, à 13:10)
Hors ligne
#2 Le 11/01/2024, à 13: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.
Déconnecté jusqu’à nouvel ordre
Hors ligne
#3 Le 11/01/2024, à 13: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, à 14:46
- alduc31
Re : [Résolu] Script qui appelle un autre script
Salut,
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, à 06: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, à 06: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, à 06: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.
nouveau forum ubuntu-fr on en parle là : refonte du site / nouveau design
profil - sujets récurrents - sources du site
Hors ligne
#8 Le 12/01/2024, à 07: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, à 08: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.
nouveau forum ubuntu-fr on en parle là : refonte du site / nouveau design
profil - sujets récurrents - sources du site
Hors ligne
#10 Le 12/01/2024, à 08:11
- arvernes
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.
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, à 08:18)
Hors ligne
#11 Le 12/01/2024, à 08:16
- krodelabestiole
Re : [Résolu] Script qui appelle un autre script
je ne vois pas d'ambiguïté dans l'énoncé
ou qui proco peut-être ?
de mon côté je répondais à cette question :
Est-il possible lorsque script2 redonne la main à script1 qu'il lui passe cette variable pour que script1 puisse l'utiliser?
nouveau forum ubuntu-fr on en parle là : refonte du site / nouveau design
profil - sujets récurrents - sources du site
Hors ligne
#12 Le 12/01/2024, à 08:48
- arvernes
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.
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, à 09: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é.
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, à 09:07)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 12/01/2024, à 09: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, à 09:16
- arvernes
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.
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, à 13: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, à 13:06)
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
Hors ligne
#17 Le 12/01/2024, à 13:47
- krodelabestiole
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.
je me posais la question, merci pour cette info !
nouveau forum ubuntu-fr on en parle là : refonte du site / nouveau design
profil - sujets récurrents - sources du site
Hors ligne
#18 Le 12/01/2024, à 14:08
- krodelabestiole
Re : [Résolu] Script qui appelle un autre script
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.
nouveau forum ubuntu-fr on en parle là : refonte du site / nouveau design
profil - sujets récurrents - sources du site
Hors ligne
#19 Le 12/01/2024, à 15:20
- Watael
Re : [Résolu] Script qui appelle un autre script
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, à 15:34
- diesel
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é.
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, à 15: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, à 16: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, à 17: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, à 19: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, à 19:33)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#24 Le 12/01/2024, à 21:18
- arvernes
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.
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, à 21: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