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 06/07/2022, à 08: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, à 08: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 roll

Dernière modification par iznobe (Le 06/07/2022, à 08:27)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#3 Le 06/07/2022, à 09: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, à 10: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, à 10:59)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#5 Le 06/07/2022, à 10: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, à 10: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, à 14:07

bird12358

Re : Valeur de retour d'un script dans une dpkg

Tawal a écrit :

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, à 14:09

bird12358

Re : Valeur de retour d'un script dans une dpkg

iznobe a écrit :

"$? " 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, à 14: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, à 14:19)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#9 Le 06/07/2022, à 15: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, à 15:32)

Hors ligne

#10 Le 07/07/2022, à 09:39

bird12358

Re : Valeur de retour d'un script dans une dpkg

iznobe a écrit :

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, à 09:40

bird12358

Re : Valeur de retour d'un script dans une dpkg

MicP a écrit :

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, à 09: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, à 10:12)

Hors ligne

#13 Le 07/07/2022, à 12: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.

Hors ligne

#14 Le 07/07/2022, à 13: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, à 14:19

bird12358

Re : Valeur de retour d'un script dans une dpkg

MicP a écrit :

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


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, à 14: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, à 15:05

bird12358

Re : Valeur de retour d'un script dans une dpkg

MicP a écrit :

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, à 18:02

jplemoine

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

Hors ligne

#19 Le 07/07/2022, à 20:19

Watael

Re : Valeur de retour d'un script dans une dpkg

jplemoine a écrit :
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"

wink


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

Hors ligne

#20 Le 08/07/2022, à 10: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