#1 Le 06/07/2022, à 07:02
- bird12358
Valeur de retour d'un script dans une dpkg
Bonjour,
J'ai developpé un dpkg et je cherche à avoir une valeur en retour d'un script que j'execute dans mon postint.
Voici mon script d'exemple et mon postint:
Script:
#!/bin/bash
exit 22
dpkg postint:
#!/bin/bash
./script1.sh
return_value=$?
echo "$return_value"
Je recois visiblement une valeur vide.
Quelqu'un pourrait m'expliquer ce que j'ai mal fait ?
Hors ligne
#2 Le 06/07/2022, à 07:18
- iznobe
Re : Valeur de retour d'un script dans une dpkg
Bonjour , je ne suis pas certain du truc , mais pour ma part , le contexte du script et donc la portée des variables qu ' il contient ne sont pas accessibles via le terminal .
De mon point de vue , du coup , il faut integrer les 2 dernieres commandes dans le script lui-meme pour que cela fonctionne .
cette commande :
return_value=$?
fonctionne si tu passes dans le terminal une commande prealable renvoyant une valeur . mais pas celle d ' un script .
idem , si c' est dans un autre script , tu ne peux recuperer la derniere variable d ' un script , si tu n' es pas dans le script lui-meme .
ou alors , il faut passer par un return dans le script appellé et stocker le retour dans une variable du script appellant .
en esperant etre relativement clair
Dernière modification par iznobe (Le 06/07/2022, à 07:27)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#3 Le 06/07/2022, à 08:17
- bird12358
Re : Valeur de retour d'un script dans une dpkg
Merci pour la réponse @iznobe
Alors j'ai essayé de comprendre.
Voici mon script2:
#!/bin/bash
export return_value_script2=10
./script1.sh
echo $return_value_script2
Et mon script1:
#!/bin/bash
echo "in"$return_value_script2
return_value_script2=22
echo "in"$return_value_script2
exit 2
L'execution de ./script2.sh me donne ca:
./script2.sh
in10
in22
10
Hors ligne
#4 Le 06/07/2022, à 09:17
- iznobe
Re : Valeur de retour d'un script dans une dpkg
"$? " indique le status de la derniere commande .
si dans un script , tu passes : " une_commande " , puis " echo $? " , alors tu auras pourra retour le code status de cette deniere commande .
idem , si tu passes une commande dans le terminal , puis " echo $? " .
exemple :
pi@raspberrypi:~ $ ls -l ~
total 744
drwxr-xr-x 3 pi pi 4096 26 juin 2019 Arduino
-rw-r--r-- 1 pi pi 397324 17 juil. 2019 audiodump.wav
-rw-r--r-- 1 pi pi 0 2 juin 18:33 '^C'
-rwxr-xr-- 1 pi pi 354 15 févr. 15:14 convert_.txt_2_.pdf.sh
drwxr-xr-x 2 pi pi 4096 5 janv. 09:43 Desktop
drwxr-xr-x 3 pi pi 4096 2 mai 10:46 Documents
drwxr-xr-x 2 pi pi 16384 12 avril 10:42 Downloads
-rw-r--r-- 1 pi pi 0 2 juin 18:33 echo
-rw-r--r-- 1 pi pi 0 2 juin 18:33 exit
-rw-r--r-- 1 pi pi 115 3 juin 10:37 file
-rw-r--r-- 1 pi pi 131372 18 sept. 2019 helloworld.wav
-rw-r--r-- 1 pi pi 123220 1 janv. 2019 libttspico0_1.0+git20130326-9_armhf.deb
-rw-r--r-- 1 pi pi 9208 1 janv. 2019 libttspico-utils_1.0+git20130326-9_armhf.deb
drwx------ 7 pi pi 4096 9 mai 2019 Mail
-rwxr-xr-x 1 pi pi 23 6 juil. 10:13 mon_script.sh
drwxr-xr-x 2 pi pi 4096 24 avril 2019 Music
drwxr-xr-x 2 pi pi 4096 17 sept. 2019 Pictures
drwxr-xr-x 2 root root 4096 13 mai 17:22 poutrelle
drwxr-xr-x 6 pi pi 4096 2 nov. 2021 projets_auto
drwxr-xr-x 2 pi pi 4096 24 avril 2019 Public
drwxr-xr-x 3 pi pi 4096 3 oct. 2019 rpi-clone
-rwxr-xr-x 1 pi pi 145 6 juil. 09:56 script1.sh
-rwxr-xr-x 1 pi pi 84 6 juil. 09:52 script2.sh
-rw-r--r-- 1 pi pi 0 2 juin 18:33 stock_log_files
drwxr-xr-x 2 pi pi 4096 24 avril 2019 Templates
lrwxrwxrwx 1 pi pi 26 2 mai 10:48 TEST -> /home/pi/Documents/testeur
-rw-r--r-- 1 pi pi 0 15 juin 18:17 verif_apache.html
drwxr-xr-x 2 pi pi 4096 24 avril 2019 Videos
pi@raspberrypi:~ $ echo $?
0
pi@raspberrypi:~ $ ls -l /repertoire_qui_nexiste_pas
ls: impossible d'accéder à '/repertoire_qui_nexiste_pas': Aucun fichier ou dossier de ce type
pi@raspberrypi:~ $ echo $?
2
pi@raspberrypi:~ $
Si c ' est bien ce que tu desires obtenir , dans ton message 1 , tu comprends bien que tu ne peux pas obtenir le status d ' une commande que tu n' as pas " passée " dans le terminal par exemple .
il en est de meme a l' interieur d ' un script .
partons sur 2 script : script1.sh et script2.sh .
je simplifie au maximum : si tu fais dans script1.sh " une_commande " et " echo returnvalue; "
puis dans script2.sh :
"./script1.sh
echo $?;"
il est evident que tu ne peux recuperer le status de la commande passée dans script1.sh puisque dans le script en question ( le 2 ) , tu n' as passé en realité aucune commande ( returnvalue est une variable standard et ne correspond pas du tout a $? ) .
c ' est ce qu ' on apelle la portée des variables .
on a la meme chose au sein d ' un meme script .
tu definis par exemple une variable dans une fonction , si tu essaies d ' utiliser cette variable en dehors de la fonction , tu obtiendras une erreur .
D ' apres ce que je comprends tu cherches a obtenir un resultat que tu veux transmettre a un autre script .
ce n' est donc pas " $? " qu ' il faut que tu utilises .
un exemple de ce que tu cherches a faire a mon avis :
si tu fais un script1.sh contenant :
blablabla
returnvalue=22
./script1.sh "$returnvalue"
et dans script2.sh :
echo "$1";
alors a l ' execution tu obtiendras la meme valeur en sortie de script1.sh et de returnvalue de script2.sh .
exemple concret :
pi@raspberrypi:~ $ cat script1.sh
#!/bin/bash
return_value=22;
./script2.sh "$return_value";
echo return_value originale = "$return_value";
pi@raspberrypi:~ $ cat script2.sh
#!/bin/bash
echo valeur de variable 1 : return__value transmise de script1.sh : "$1";
pi@raspberrypi:~ $ ./script1.sh
valeur de variable 1 : return__value transmise de script1.sh : 22
return_value originale = 22
pi@raspberrypi:~ $
Remarque : on peut transmettre autant de variable que l' on desire d ' un script a un autre avec cette technique .
Dernière modification par iznobe (Le 06/07/2022, à 09:59)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#5 Le 06/07/2022, à 09:33
- Tawal
Re : Valeur de retour d'un script dans une dpkg
Hello,
Toute commande (passée ou non dans un terminal) renvoie un code de retour qui indique le succès ou le type d'erreur rencontrée.
Exemple :
test.sh :
#!/bin/bash
echo -n "Code retour de la commande echo : "
echo $?
exit 1
test1.sh :
#!/bin/bash
./test.sh
echo "Code retour du script test.sh appelé par test1.sh : $?"
Et l'appel du script test1.sh :
$ ./test1.sh
Code retour de la commande echo : 0
Code retour du script test.sh appelé par test1.sh : 1
$
Edit:
Il va de soi que les scripts test.sh et test1.sh doivent être exécutables (dans ce cas).
Dernière modification par Tawal (Le 06/07/2022, à 09:34)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#6 Le 06/07/2022, à 13:07
- bird12358
Re : Valeur de retour d'un script dans une dpkg
Hello,
Toute commande (passée ou non dans un terminal) renvoie un code de retour qui indique le succès ou le type d'erreur rencontrée.
Exemple :
test.sh :#!/bin/bash echo -n "Code retour de la commande echo : " echo $? exit 1
test1.sh :
#!/bin/bash ./test.sh echo "Code retour du script test.sh appelé par test1.sh : $?"
Et l'appel du script test1.sh :
$ ./test1.sh Code retour de la commande echo : 0 Code retour du script test.sh appelé par test1.sh : 1 $
Edit:
Il va de soi que les scripts test.sh et test1.sh doivent être exécutables (dans ce cas).
Dans mon cas, le problème se passe quand j'utilise le script dans un dpkg. Le comportement ne semble pas le même.
Hors ligne
#7 Le 06/07/2022, à 13:09
- bird12358
Re : Valeur de retour d'un script dans une dpkg
"$? " indique le status de la derniere commande .
si dans un script , tu passes : " une_commande " , puis " echo $? " , alors tu auras pourra retour le code status de cette deniere commande .
idem , si tu passes une commande dans le terminal , puis " echo $? " .
exemple :pi@raspberrypi:~ $ ls -l ~ total 744 drwxr-xr-x 3 pi pi 4096 26 juin 2019 Arduino -rw-r--r-- 1 pi pi 397324 17 juil. 2019 audiodump.wav -rw-r--r-- 1 pi pi 0 2 juin 18:33 '^C' -rwxr-xr-- 1 pi pi 354 15 févr. 15:14 convert_.txt_2_.pdf.sh drwxr-xr-x 2 pi pi 4096 5 janv. 09:43 Desktop drwxr-xr-x 3 pi pi 4096 2 mai 10:46 Documents drwxr-xr-x 2 pi pi 16384 12 avril 10:42 Downloads -rw-r--r-- 1 pi pi 0 2 juin 18:33 echo -rw-r--r-- 1 pi pi 0 2 juin 18:33 exit -rw-r--r-- 1 pi pi 115 3 juin 10:37 file -rw-r--r-- 1 pi pi 131372 18 sept. 2019 helloworld.wav -rw-r--r-- 1 pi pi 123220 1 janv. 2019 libttspico0_1.0+git20130326-9_armhf.deb -rw-r--r-- 1 pi pi 9208 1 janv. 2019 libttspico-utils_1.0+git20130326-9_armhf.deb drwx------ 7 pi pi 4096 9 mai 2019 Mail -rwxr-xr-x 1 pi pi 23 6 juil. 10:13 mon_script.sh drwxr-xr-x 2 pi pi 4096 24 avril 2019 Music drwxr-xr-x 2 pi pi 4096 17 sept. 2019 Pictures drwxr-xr-x 2 root root 4096 13 mai 17:22 poutrelle drwxr-xr-x 6 pi pi 4096 2 nov. 2021 projets_auto drwxr-xr-x 2 pi pi 4096 24 avril 2019 Public drwxr-xr-x 3 pi pi 4096 3 oct. 2019 rpi-clone -rwxr-xr-x 1 pi pi 145 6 juil. 09:56 script1.sh -rwxr-xr-x 1 pi pi 84 6 juil. 09:52 script2.sh -rw-r--r-- 1 pi pi 0 2 juin 18:33 stock_log_files drwxr-xr-x 2 pi pi 4096 24 avril 2019 Templates lrwxrwxrwx 1 pi pi 26 2 mai 10:48 TEST -> /home/pi/Documents/testeur -rw-r--r-- 1 pi pi 0 15 juin 18:17 verif_apache.html drwxr-xr-x 2 pi pi 4096 24 avril 2019 Videos pi@raspberrypi:~ $ echo $? 0 pi@raspberrypi:~ $ ls -l /repertoire_qui_nexiste_pas ls: impossible d'accéder à '/repertoire_qui_nexiste_pas': Aucun fichier ou dossier de ce type pi@raspberrypi:~ $ echo $? 2 pi@raspberrypi:~ $
Si c ' est bien ce que tu desires obtenir , dans ton message 1 , tu comprends bien que tu ne peux pas obtenir le status d ' une commande que tu n' as pas " passée " dans le terminal par exemple .
il en est de meme a l' interieur d ' un script .partons sur 2 script : script1.sh et script2.sh .
je simplifie au maximum : si tu fais dans script1.sh " une_commande " et " echo returnvalue; "
puis dans script2.sh :
"./script1.sh
echo $?;"il est evident que tu ne peux recuperer le status de la commande passée dans script1.sh puisque dans le script en question ( le 2 ) , tu n' as passé en realité aucune commande ( returnvalue est une variable standard et ne correspond pas du tout a $? ) .
c ' est ce qu ' on apelle la portée des variables .
on a la meme chose au sein d ' un meme script .
tu definis par exemple une variable dans une fonction , si tu essaies d ' utiliser cette variable en dehors de la fonction , tu obtiendras une erreur .D ' apres ce que je comprends tu cherches a obtenir un resultat que tu veux transmettre a un autre script .
ce n' est donc pas " $? " qu ' il faut que tu utilises .un exemple de ce que tu cherches a faire a mon avis :
si tu fais un script1.sh contenant :blablabla returnvalue=22 ./script1.sh "$returnvalue"
et dans script2.sh :
echo "$1";
alors a l ' execution tu obtiendras la meme valeur en sortie de script1.sh et de returnvalue de script2.sh .
exemple concret :pi@raspberrypi:~ $ cat script1.sh #!/bin/bash return_value=22; ./script2.sh "$return_value"; echo return_value originale = "$return_value"; pi@raspberrypi:~ $ cat script2.sh #!/bin/bash echo valeur de variable 1 : return__value transmise de script1.sh : "$1"; pi@raspberrypi:~ $ ./script1.sh valeur de variable 1 : return__value transmise de script1.sh : 22 return_value originale = 22 pi@raspberrypi:~ $
Remarque : on peut transmettre autant de variable que l' on desire d ' un script a un autre avec cette technique .
J'ai testé dans le dpkg. Dans mon cas entre le echo et la sortie du programme, j'ai un break. Est ce que cela pourrait etre la source du problème?
Hors ligne
#8 Le 06/07/2022, à 13:17
- iznobe
Re : Valeur de retour d'un script dans une dpkg
il faudrait d' abord repondre a cette question pour qu ' on soit au clair :
desires tu passer une variable d' un script a un autre , ou bien , obtenir le status d' une commande puis le passer dans un autre script ?
si le break est placé avant que la valeur de la variable soit assigné c ' est possible .
Normalement c ' est a toi de t ' assurer qu ' une variable ne soit pas vide .
Mais sans voir le code , c ' est pas facile de dire ...
Dernière modification par iznobe (Le 06/07/2022, à 13:19)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#9 Le 06/07/2022, à 14:32
- MicP
Re : Valeur de retour d'un script dans une dpkg
Bonjour
Il faudrait aussi savoir quel sera le shell utilisé, parce que pour un script lancé depuis un postinst, c'est pas sûr du tout que ce soit /bin/bash ou que ce shell soit accessible
Dernière modification par MicP (Le 06/07/2022, à 14:32)
Hors ligne
#10 Le 07/07/2022, à 08:39
- bird12358
Re : Valeur de retour d'un script dans une dpkg
il faudrait d' abord repondre a cette question pour qu ' on soit au clair :
desires tu passer une variable d' un script a un autre , ou bien , obtenir le status d' une commande puis le passer dans un autre script ?si le break est placé avant que la valeur de la variable soit assigné c ' est possible .
Normalement c ' est a toi de t ' assurer qu ' une variable ne soit pas vide .
Mais sans voir le code , c ' est pas facile de dire ...
En fait je veut faire ca dans le script postinst :
arduino-cli board list | awk -F ' ' '{print $1,$6}' |while read var1 var2
do
if [ "$var2" == "Arduino" ];then
echo " Arduino-cli return in" "$var2"
break
fi
done
Mais visiblement ca se passe pas bien dans le script postinst alors que la même commande dans un script externe fonctionne. Donc je me suis mis dans un script externe mais il me faut une valeur de retour.
Hors ligne
#11 Le 07/07/2022, à 08:40
- bird12358
Re : Valeur de retour d'un script dans une dpkg
Bonjour
Il faudrait aussi savoir quel sera le shell utilisé, parce que pour un script lancé depuis un postinst, c'est pas sûr du tout que ce soit /bin/bash ou que ce shell soit accessible
Je ne sais pas trop effectivement.
Hors ligne
#12 Le 07/07/2022, à 08:58
- MicP
Re : Valeur de retour d'un script dans une dpkg
Je pense qu'en ajoutant dans le script un :
echo $0
ça devrait afficher le shell utilisé par le script
qui je pense pourrait être /bin/sh
qui est un lien vers l'interpréteur de commandes /bin/dash (avec un D et pas un B)
Il manque peut-être aussi dans la variable PATH
des chemins d'accès à certaines commandes
EDIT :
En lisant cette page web, j'ai confirmation qu'il vaut mieux utiliser des chemins absolus,
étant donné que certains chemins d'accès ne seront effectivement pas dans le PATH
Dernière modification par MicP (Le 07/07/2022, à 09:12)
Hors ligne
#13 Le 07/07/2022, à 11:57
- jplemoine
Re : Valeur de retour d'un script dans une dpkg
C'est bizarre : le même code qu'au post#1 fonctionne chez moi..
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
#14 Le 07/07/2022, à 12:29
- MicP
Re : Valeur de retour d'un script dans une dpkg
Ça fonctionne aussi chez moi,
mais je ne l'ai testé que dans une fenêtre de terminal, pas dans un script postinst
Hors ligne
#15 Le 07/07/2022, à 13:19
- bird12358
Re : Valeur de retour d'un script dans une dpkg
Je pense qu'en ajoutant dans le script un :
echo $0
ça devrait afficher le shell utilisé par le script
qui je pense pourrait être /bin/sh
qui est un lien vers l'interpréteur de commandes /bin/dash (avec un D et pas un B)Il manque peut-être aussi dans la variable PATH
des chemins d'accès à certaines commandesEDIT :
En lisant cette page web, j'ai confirmation qu'il vaut mieux utiliser des chemins absolus,
étant donné que certains chemins d'accès ne seront effectivement pas dans le PATH
Quand je lance la commande la commande "echo $0" dans mon postint j'ai le nom de mon script en relatif et quand je lance cette commande dans mon script (que je lance dans le postint) j'ai le path absolu de mon script.
Hors ligne
#16 Le 07/07/2022, à 13:21
- MicP
Re : Valeur de retour d'un script dans une dpkg
Rhaaa ! Désolé, je me suis trompé de nom de variable,
et pourtant, son nom est évident, il te faut plutôt faire :
echo $SHELL
Hors ligne
#17 Le 07/07/2022, à 14:05
- bird12358
Re : Valeur de retour d'un script dans une dpkg
Rhaaa ! Désolé, je me suis trompé de nom de variable,
et pourtant, son nom est évident, il te faut plutôt faire :echo $SHELL
Dans les deux le résultat est "/bin/bash"
Hors ligne
#18 Le 07/07/2022, à 17:02
- jplemoine
Re : Valeur de retour d'un script dans une dpkg
Quand je lance la commande la commande "echo $0" dans mon postint j'ai le nom de mon script en relatif et quand je lance cette commande dans mon script (que je lance dans le postint) j'ai le path absolu de mon script.
Je pense que si tu veux le chemin absolu, il faut faire :
echo $(pwd)$(basename $0)
mais je ne sais pas comment faire pour le postinst (si ça ne fonctionne pas), je crois que c'est particulier, car tu ne connais pas nécessairement l'emplacement.
A voir s'il y a des variables particulières.
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
#19 Le 07/07/2022, à 19:19
- Watael
Re : Valeur de retour d'un script dans une dpkg
bird12358 a écrit :Quand je lance la commande la commande "echo $0" dans mon postint j'ai le nom de mon script en relatif et quand je lance cette commande dans mon script (que je lance dans le postint) j'ai le path absolu de mon script.
Je pense que si tu veux le chemin absolu, il faut faire :
realpath "$0"
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#20 Le 08/07/2022, à 09:43
- bird12358
Re : Valeur de retour d'un script dans une dpkg
Dans mon cas, je pense pas que le soucis vienne du path absolu ou relatif de mon executable.
Surtout dans mon cas, le script que j'utilise est indiqué avec un chemin absolu.
Où puis-je trouve un exemple d'execution d'un script avec un retour dans un script dpkg.
Hors ligne