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 05/11/2015, à 13:53

ar barzh paour

[Résolu] réponse à ligne de commande

bonjour à tous
je ne comprends pas pourquoi (bash)

var=-2 && (( var+=2 ))
echo $? $var
1 0

var est bien calculé et vaut zéro ( -2 + 2 ==> 0 )

que

var=-2 && (( var+=6 ))
echo $? $var
0 4

var est aussi bien calculé et vaut 4 ( -2 + 6 ==> 4)

alors pourquoi dans le premier cas j'ai un retour de commande à 1 et dans le deuxième cas un retour à 0

Dernière modification par ar barzh paour (Le 05/11/2015, à 14:39)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#2 Le 05/11/2015, à 13:59

Postmortem

Re : [Résolu] réponse à ligne de commande

Bonjour,

Une expression arithmétique égale à 0 est FAUSSE, donc code retour différent de 0.
Une expression arithmétique différente de 0 est VRAIE, donc code retour égal à 0.

Rajout exemple :

$ if (( 0 ))
> then echo VRAI
> else echo FAUX
> fi
FAUX
$ if (( 1 ))
> then echo VRAI
> else echo FAUX
> fi
VRAI

Dernière modification par Postmortem (Le 05/11/2015, à 14:01)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#3 Le 05/11/2015, à 14:39

ar barzh paour

Re : [Résolu] réponse à ligne de commande

toujours réponse à tout
!! Une expression arithmétique égale à 0 est FAUSSE !!
je note ça qelquepart
merci Postmortem


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#4 Le 05/11/2015, à 15:40

MicP

Re : [Résolu] réponse à ligne de commande

Pour info à ceux qui passeraient par là :

echo $? donne la valeur du code d'erreur (exit status ou return status) retourné par le dernier processus exécuté.
echo $var donne la valeur assignée à la variable nommée var

=======
Un processus qui s'est terminé sans erreur retourne "0", sinon, un code d'erreur dont la valeur dépends de ce qui tourne dans le processus.
C'est cette valeur de code d'erreur qui permet de déterminer le message d'erreur à afficher suivant la commande utilisée

michel@debG53SW:~$ pwd
/home/michel
michel@debG53SW:~$ echo $?
0
michel@debG53SW:~$ pwwd
bash: pwwd : commande introuvable
michel@debG53SW:~$ echo $?
127
michel@debG53SW:~$ ls ~/.bashrc
/home/michel/.bashrc
michel@debG53SW:~$ echo $?
0
michel@debG53SW:~$ ls fichierPasTrouvé
ls: impossible d'accéder à fichierPasTrouvé: Aucun fichier ou dossier de ce type
michel@debG53SW:~$ echo $?
2
michel@debG53SW:~$ 

=======
&& et || permettent de chaîner les commandes en fonction du code d'erreur retourné

&& => la commande suivant le && sera exécutée seulement si la commande située avant && a retourné un code d'erreur égal à 0 (donc tout s'est bien passé)

|| => la commande suivant le || sera exécutée seulement si la commande située avant || a retourné un code d'erreur différent de 0 (donc, il y a eu une erreur),

Dernière modification par MicP (Le 05/11/2015, à 16:00)

Hors ligne

#5 Le 05/11/2015, à 16:16

erresse

Re : [Résolu] réponse à ligne de commande

Postmortem a écrit :

!! Une expression arithmétique égale à 0 est FAUSSE !!

... et pourquoi diable le résultat d'une opération arithmétique donnant zéro doit-il être considéré comme faux ???
Du coup, le code retour renvoyé à la suite d'une telle opération n'est absolument pas fiable, car si l'opération donne une résultat quelconque autre que zéro, le CR indiquera "OK", alors que si le résultat est zéro, il indiquera "ERREUR" ?
C'est carrément absurde et incohérent, non ?


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#6 Le 05/11/2015, à 16:31

Arbiel

Re : [Résolu] réponse à ligne de commande

Le code de retour d'une commande n'a rien à voir avec ce que la commande fait, mais seulement avec le fait que ce qu'elle doit faire a pu être fait correctement ou non.

Ce qui peut paraître surprenant, c'est que le code de retour d'une opération arithmétique puisse dépendre de la valeur calculée et non du fait que cette opération a été correctement exécutée ou non (division par zéro, débordement de capacité, …).

Mais c'est ainsi, et n'allons pas le changer.

Arbiel


Arbiel Perlacremaz
LDLC Aurore NK3S-8-S4 Ubuntu 20.04
Abandon d'azerty au profit de bépo, de google au profit de Lilo et de la messagerie électronique violable au profit de Protonmail, une messagerie chiffrée de poste de travail à poste de travail.

Hors ligne

#7 Le 05/11/2015, à 17:53

Postmortem

Re : [Résolu] réponse à ligne de commande

erresse a écrit :
Postmortem a écrit :

!! Une expression arithmétique égale à 0 est FAUSSE !!

... et pourquoi diable le résultat d'une opération arithmétique donnant zéro doit-il être considéré comme faux ???
Du coup, le code retour renvoyé à la suite d'une telle opération n'est absolument pas fiable, car si l'opération donne une résultat quelconque autre que zéro, le CR indiquera "OK", alors que si le résultat est zéro, il indiquera "ERREUR" ?
C'est carrément absurde et incohérent, non ?

Un code retour différent de 0 ne veut pas forcément dire "EREUR". Ça peut vouloir dire ça, mais pas forcément.
Prenons l'exemple de grep :

$ grep ok test.txt
ok
$ echo $?
0
$ grep ko test.txt 
$ echo $?
1
$ grep ok fichierquiexistepas
grep: fichierquiexistepas: Aucun fichier ou dossier de ce type
$ echo $?
2
$ grep --turlututu ok test.txt 
grep : option non reconnue « --turlututu »
Utilisation : grep [OPTION]... MOTIF [FICHIER]...
Exécutez « grep --help » pour obtenir des renseignements complémentaires.
$ echo $?
2

Pour la première commande, le motif est trouvé, on a un code retour 0.
Pour la 2ème commande, le motif n'est pas trouvé, on a un code retour 1 ; la commande n'est pas en erreur pour autant, le code retour 1 sert à indiquer que grep n'a pas trouvé le motif.
Pour la 3ème et la 4ème, là il y a bien des erreurs, on a un code retour 2.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#8 Le 05/11/2015, à 17:53

MicP

Re : [Résolu] réponse à ligne de commande

Un code de retour (return status) n'est pas un code d'erreur (error code), même s'il peut être interprété comme tel dans la plupart des cas.

Hors ligne

#9 Le 06/11/2015, à 11:48

erresse

Re : [Résolu] réponse à ligne de commande

Postmortem a écrit :

Un code retour différent de 0 ne veut pas forcément dire "EREUR". Ça peut vouloir dire ça, mais pas forcément.

C'est vrai... Et d'ailleurs, on peut vouloir tester cette valeur de retour assez finement pour en déduire plusieurs actions différentes à exécuter ensuite.
Mais dans le cas de l'opération arithmétique valant zéro, j'aurais tendance à considérer ce code retour comme piégeux.
À moins que la valeur à 1 du code retour ne soit valable QUE si le résultat de l'opération est zéro ? Si une erreur est vraiment rencontrée lors de l'opération (division par zéro, opération sur des données non numériques, etc...) est-ce qu'on obtient une valeur différente de 1 dans le code retour ?
(Dans les essais que j'ai fait, je n'ai jamais obtenu que 0 quand c'est OK et 1 dans tous les autres cas...)


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#10 Le 06/11/2015, à 16:22

Postmortem

Re : [Résolu] réponse à ligne de commande

En bash, le code retour est 1 quand la valeur de l'expression est 0 ou quand il y a une erreur.
C'est vrai qu'un code retour différent aurait été bien pour les erreurs.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#11 Le 23/12/2015, à 11:55

ar barzh paour

Re : [Résolu] réponse à ligne de commande

lu dans le manuel de Bash
http://abs.traduc.org/abs-fr/ch07.html#testconstructs

Les expressions (( ... )) et let ... renvoient un code de sortie qui dépend du fait que les expressions arithmétiques qu'elles évaluent se résolvent en une valeur non nulle

De nouveau, il faut bien remarquer que le statut de sortie d'une expression arithmétique n'est pas un code d'erreur.


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne