Bonjour à tous,
J'ai un souci avec la compréhension de cet exercice.
Il nous demande d'écrire une commande qui lancera un processus, puis en lancera un second si le premier a réussi. Par exemple mon-if 'true' 'echo reussi' affichera reussi alors que mon-if 'false' 'echo raté' n'affichera rien et demande de prévoir le cas où les commandes contiennent plusieurs mots, comme dans mon-if 'echo foo' 'echo bar'.
De quoi s'agit-il de faire au juste ? si quelqu'un peut m'éclaircir.
Merci d'avance.
# ton cours ?
Posté par BAud (site web personnel) . Évalué à 3.
regarde du côté de ton cours :
&&
et||
de bash[^] # Re: exercice d'entrainement
Posté par roger91 . Évalué à 1.
Bonjour BAud,
Merci pour ta réponse.
Justement le cours ne me dit rien par rapport à cela. Ce n'est pas un exercice du cours mais juste un exercice d’entraînement que je fais.
Comment faudrait il l'écrire ?
Merci
[^] # Re: exercice d'entrainement
Posté par chimrod (site web personnel) . Évalué à 2.
Déjà, est-ce tu peux écrire un script du genre :
?
[^] # Re: exercice d'entrainement
Posté par roger91 . Évalué à 1.
Oui chimrod je pense.
Je l'écrirai de la sorte:
./commandecrire
if [ $? -eq 0 ]; then
echo réussi
else
echo raté
fi
[^] # Re: exercice d'entrainement
Posté par totof2000 . Évalué à 2.
Est-ce que tu sais récupérer les paramètres passées à la ligne de commande (variables $1, *, …) ?
[^] # Re: exercice d'entrainement
Posté par roger91 . Évalué à 1.
Merci totof2000 pour toutes ces explications.
Non je ne sais pas récupérer les paramètres passées à la ligne de commande. Comment cela fonctionne ? Devrais je en avoir besoin pour cet exo ?
Merci
[^] # Re: exercice d'entrainement
Posté par totof2000 . Évalué à 3.
Si j'en crois l'énoncé :
tu dois appeler la commande mon-if avec le paramètre 'true' ou mon-if avec les 2 paramètres 'false' 'echo raté'.
Pour récupérer les paramètres passés à ton script, tu disposes :
- des variables $1 à $9 qui contiennent respectivement ,e 1er jusqu'au 9eme paramètre passé à ton script.
- la variable $* contenant tous les paramètres passés à ton script
- la variable ~# qui contient le nombre d'arguments passés à ton script.
Pour info, tu peux utiliser la commande shift qui te décalera tous tes paramètres : la valeur de $2 est passée ) $1, la valeur de $3 est passée à $2, etc … et le $1 d'origine est perdu.
Exemple :
A l'exécution :
sans paramètres :
avec 1 paramètre :
avec 2 paramètres :
avec 2 paramètres toujours :
[^] # Re: exercice d'entrainement
Posté par totof2000 . Évalué à 2. Dernière modification le 28 décembre 2015 à 11:50.
Hello.
Quand tu exécutes une commande en shell, le système te retourne un code retour. La convention sous Unix veut qu'un processus qui a réussi retourne le code 0. Ce code retour est accessible via la variable d'environnement $?
Exemple :
Quand une commande échoue, elle retourne un code différent de 0 (le code retour est en général documenté dans les pages man). Exemple : je vais lister un fichier/repertoire qui n'existe pas :
En ce qui concerne les tests avec if, voir ce cours qui est assez bien fait. En testant le code de retour de la variable d'environnement $?, tu devrais pouvoir t'en sortir.
Ah, petit détail : j'ai pour habitude dans mes scripts de sauvegarder le code retour de la commande à tester juste après que celle-ci ait été exécuté. En effet, la variable $? est mise à jour à chaque exécution de commande. en gros, je fais un truc du genre :
Sinon, il faut tester de suite la variable $? et être sur que personne n'ajoutera de commande entre la commande que tu veux tester et le test if.
[^] # Re: exercice d'entrainement
Posté par roger91 . Évalué à 0.
Merci totof2000 pour toutes ces explications.
Non je ne sais pas récupérer les paramètres passées à la ligne de commande. Comment cela fonctionne ? Devrais je en avoir besoin pour cet exo ?
Merci
[^] # Re: exercice d'entrainement
Posté par roger91 . Évalué à 1.
Merci totof2000 pour toutes ces infos.
Mais avec l’énoncé de mon exercice je ne vois pas trop comment l'adapter pour le résoudre si tu pourrais m'aider…
Merci d'avance.
[^] # Re: exercice d'entrainement
Posté par totof2000 . Évalué à 2.
Ben c'est simple:
"écrire une commande qui lancera un processus, puis en lancera un second si le premier a réussi"
mon-if 'true' 'echo reussi' affiche 'réussi'
mon-if 'false' 'echo raté' n'affichera rien
tu edites le script mon-if.
Tu récupères le premier argument, tu l'exécutes.
S'il réussit (test du code retour), tu exécutes le second argument.
Petite précision, si tu as une variable qui contient une commande à exécuter (par exemple VAR='echo Réussi'), tu l'exécutes en mettant $VAR en début de ligne (en shell, le premier terme d'une ligne correspond à une commande à exécuter, en dehors des cas d'affectation)
Exemple :
$ VAR='echo Ca marche'
$ $VAR
Ca marche
Essaie de faire quelque chose avec tout ça, et montre le nous si tu n'y arrives pas.
[^] # Re: exercice d'entrainement
Posté par roger91 . Évalué à 1.
Ce que j'ai essayé de faire,pour le premier cas je déclare 2 variables:
var1='true' et var2='echo reussi'
Puis j'écris la première fonction:
if $var1 -eq 0; then $var2; fi
Pour le deuxième cas je pense que c'est le meme principe à la différence que la variable 'faux' doit etre différente de 0 et echo ne retourne rien.
Mais il y a un truc que je ne comprends pas, pourquoi s'il ne doit rien affiche, on a une variable 'echo faux' ?
S'il y a quelque chose à ajouter ou c'est bon ?
Merci d'avance
[^] # Re: exercice d'entrainement
Posté par totof2000 . Évalué à 3. Dernière modification le 29 décembre 2015 à 14:04.
true et 'echo réussi' doivent être passé en paramètre sur la ligne de commande.
Sinon on pourrait faire un truc très condensé mais je ne suis pas sur que tu comprennes, alors il vaut mieux découper les diverses choses à faire. Il faut que tu exécutes ton script de la façon suivante :
Ton script doit :mon-if 'true' 'réussi'.
* récupérer les paramètres de la ligne de commande
* exécuter la première commande
* si elle réussit, exécuter la seconde
Commence par écrire un script qui récupère 'true' et 'echo reussi' sur la ligne de commande et qui l'affiche.
Poste ici. Ensuite on passe à l'étape suivante.
Une fois que tu auras compris, je te montrerai un moyen de faire plus condensé.
[^] # Re: exercice d'entrainement
Posté par roger91 . Évalué à 1. Dernière modification le 29 décembre 2015 à 16:02.
Voilà mon script pour récuperer la ligne de commande:
[^] # Re: exercice d'entrainement
Posté par NeoX . Évalué à 2.
alors deja ca ce N'est PAS un script, c'est un programme,
en effet il a besoin d'etre compilé pour etre executer
alors qu'un script va simplement etre lu puis executer dans la foulée par l'interpreteur
perl, python, shell sont des langages de script
C, C++, Java sont des langages de programmation
[^] # Re: exercice d'entrainement
Posté par roger91 . Évalué à 1.
Et comment je fais donc pour récupérer les arguments passés sur la ligne de commande sans écrire un programme ? En le compilant je l'exécute après avec ./mon programme 'vrai' 'echo reussi' et il m'affiche bien:
vrai
echo reussi
Ce qui me permet de récupérer les arguments.
Je suis pas sur la bonne voie ?
[^] # Re: exercice d'entrainement
Posté par NeoX . Évalué à 2.
faut voir, l'exercice est-il d'ecrire un SCRIPT ou un PROGRAMME ?
le but est-il d'apprendre les bases du shell ou un langage de programmation ?
d'apres l'enoncé du depart, c'est plutot un cours de shell donc il n'est pas utile de faire un programme,
un simple script doit pouvoir faire ce que tu souhaites.
evidemment il faut avoir lu le cours sur :
- definir une variable
- lire/ecrire dans une variable
- tester une variable et agir en fonction du resultat
- recuperer les arguments de la ligne de commande
si tu ecris un script sh (monscript.sh)
tu peux recuperer les parametres de la ligne de commande avec $1 $2 $3 …
monscript.sh 'premiere info' '2eme info'
verra donc $1 contenir 'premiere info' et $2 contenir '2e info'
à toi de faire ce que tu as à faire avec ca dans le script monscript.sh
[^] # Re: exercice d'entrainement
Posté par totof2000 . Évalué à 3.
J'avais expliqué ça dans un de mes message avec un exeple. J'ai l'impression de l'avoir fait pour rien.
[^] # Re: exercice d'entrainement
Posté par totof2000 . Évalué à 2.
Ca ça a l'air bon. Tu dois juste récupérer les commandes passées en paramètre à ton script.
[^] # Re: exercice d'entrainement
Posté par benja . Évalué à 1. Dernière modification le 29 décembre 2015 à 16:03.
Nope, ça ne veut rien dire. "if" ne fait que lancer une commande et comparer son code retour à zero, rien de plus. le "-eq" et le "0" seront passés comme arguments à la commande qui est contenue dans $var, à supposer var contient le nom d'une commande valide ou d'une fonction du shell.
NB "-eq 0" ressemble à la syntaxe du programme test… "test" et "expr" quant à eux ne lancent rien, ils se contentent d'interprèter l'expression qui leur est transmise et de retourner 0 ou pas zero ou d'afficher le résultat pour le cas de expr. Spécifiquement, ils ne font pas d'expansion (ou interpolation ou substitution appellons ça comme on veut) de variable. La seule fonction du shell qui fait ça c'est "eval".
[^] # Re: exercice d'entrainement
Posté par totof2000 . Évalué à 2. Dernière modification le 29 décembre 2015 à 17:24.
Oups, au temps pour moi, j'ai lu/répondu trop vite …
J'avais testé chez moi avec :
if $var1; then $var2; fi
Et ça, ça marche.
[^] # Re: exercice d'entrainement
Posté par roger91 . Évalué à 1.
Après le programme pour récuperer les arguments sur la ligne de commande que dois je faire maintenant ?
[^] # Re: exercice d'entrainement
Posté par totof2000 . Évalué à 2.
Ce n'est pas un programme qu'il te faut mais un script.
Je t'ai donné toutes les infos (variables $1, $2, … avec des exemples).
tu écris le script mon-if qui t'affiche les paramètres passé sur la ligne de commande. Quand tu exécutes mon-if param1 'param 2', il doit t'afficher premier paramètre : param1, 2eme paramètre : param 2.
[^] # Re: exercice d'entrainement
Posté par totof2000 . Évalué à 2.
Question : tu dois faire un script shell ou un programme en C? parce que là je n'y comprends plus rien: tu postes dans le forum Programmation.shell, donc j'en ai déduit que tu devais le faire en shell … Si ce n'est pas le cas, dis-le de suite parce que là j'ai l'impression d'avoir tout fait pour rien.
[^] # Re: exercice d'entrainement
Posté par roger91 . Évalué à 1.
Non c'est bien du shell et non du C ….
[^] # Re: exercice d'entrainement
Posté par totof2000 . Évalué à 2.
Si c'est du C, je laisse la main : ça fait trop longtemps que je n'ai pas fait ce genre de truc. Mais en gros, une fois que tu as récupéré tes commandes à lancer :
- tu forkes (man fork, et plein d'exemples sur le net pour comprendre ce que tu fais).
Après le fork, tu vas te retrouver avec 2 processus : un processus père, et un processus fils. Le processus fils aura une copie des variables du processus père. Pour savoir si tu es dans le processus fils ou le processus père, il faut tester le code retour de fork.
- si tu es dans le processus fils, tu lances la première commande à l'aide de l'appel système exec (man exec + plein d'exemples sur le net).
- lors du second fork, si tu es dansle processus fils, tu lances la seconde commande, et normalement c'est fini.
- Si tu es dans le processus père, tu attends la fin d'exécution du procesus fils. Une fois qu'il a fini, tu ne fais plus rien.
[^] # Re: exercice d'entrainement
Posté par NeoX . Évalué à 2.
cela peut arriver à tout le monde
ca c'est le role des conditions AND (&&) et OR (||) dans le shell et il n'y a pas besoin de script pour gerer cela.
scriptA && scriptB
lancera scriptB uniquement si scriptA a reussi
maintenant tu veux faire plus compliqué, c'est possible.
il faut alors reprendre les bases de la programmation, l'algoritmie, qui decortique un probleme, en trouve les elements, redige des conditions/actions, que tu traduiras ensuite en code.
Trois Elements dans l'enoncé :
lescript : mon-if
variableA : true ou false
variableB : 'echo reussi' ou 'echo raté'
ton script doit donc :
[^] # Re: exercice d'entrainement
Posté par benja . Évalué à 1.
À ce que j'ai compris, il doit exécuter le contenu de la variable A.
Genre, sous la forme d'une fonction:
mon-if () {
if $1 ; then $2; fi
}
Les mots séparés par des espaces contenus dans $1 seront correctement séparés, c.-à-d. interprêté comme commande, premier argument, deuxième arguments, etc. que si et seulement si la variable IFS contient un charatère espace (ce qui est le cas par défaut…). Tester ensuite avec IFS="".
[^] # Re: exercice d'entrainement
Posté par roger91 . Évalué à 1.
Merci pour ta réponse NeoX mais comment traduire tout cela ? dans une programme à exécuter ? en ligne de commande directement ? Si tu peux illustrer cela pour une meilleur comprehension ça aiderait …
[^] # Re: exercice d'entrainement
Posté par NeoX . Évalué à 2.
cf ton enoncé :
Il nous demande d'écrire une commande qui lancera un processus, puis en lancera un second si le premier a réussi.
illustrer plus que ce que totof2000 et moi t'avons donné serait faire l'exercice à ta place.
on t'a donné des infos, des exemples.
à toi de t'approprier tout ca pour repondre à ton exercice.
# if
Posté par méqueline . Évalué à 0.
Faut utiliser le fork() pour répondre
[^] # Re: if
Posté par roger91 . Évalué à 1.
Utiliser la commande fork() de quelle manière ? Si tu pourrais l'illustrer pour une bonne compréhenson ça aiderait…
[^] # Re: if
Posté par NeoX . Évalué à 1.
illustration :
man fork
# if
Posté par méqueline . Évalué à 0.
pour créer un processus qui doit appelé deux on n'est bien obligé d'utiliser le fork() fait des recherches sur le proccessus enfant et parents
[^] # Re: if
Posté par NeoX . Évalué à 2.
meme pas besoin l'enoncé par juste de lancer le second, quand le premier a reussi :
ca ressemble quand meme bien à
processusA && processusB
[^] # Re: if
Posté par BAud (site web personnel) . Évalué à 2.
c'est un peu ce que j'avais répondu en tout premier commentaire ;-) 'fin bon, si on avait l'énoncé complet et le cours en train d'être vu (ou à préparer), cela permettrait de mieux cerner la teneur de la réponse et les indications pouvant être utiles (plutôt que de donner une réponse pré-mâchée).
[^] # Re: if
Posté par NeoX . Évalué à 2.
100% d'accord avec toi la dessus
# solution
Posté par delio . Évalué à 0.
mon-if:
example:
$ ./mon-if true "echo reussi!"
reussi!
$ ./mon-if false "echo reussi!"
$
hopla :-)
[^] # Re: solution
Posté par roger91 . Évalué à 0.
Merci dello pour ton aide c'est gentil.
Problème finalement résolu ;-)
[^] # Re: solution
Posté par totof2000 . Évalué à 2. Dernière modification le 30 décembre 2015 à 12:06.
Ce n'est pas t'aider que de résoudre les problèmes à ta place : -1 pour celui qui t'a donné la réponse.
[^] # Re: solution
Posté par NeoX . Évalué à 3.
resolu oui, mais ca ne t'aidera pas :
# if
Posté par méqueline . Évalué à 0.
C'est faux la réponses c'est un cours qui parle sur les processus donc fork() ….
Faut crée un fichier exemple spawn.c qui va appellé le ./mon-if
anssi spawn-main.c qui contient le code de spawn
t = spawn("./mon-if", mes_argv);
il faut au moins 3 code un de spawn et l'autre de spawn-main et le dernier de mon-if
[^] # Re: if
Posté par totof2000 . Évalué à 2.
N'importe quoi.
On parle de script shell, pas de programme C.
En C, tu es obligé d'utiliser l'appel système fork. Mais en shell tu ne l'utilises pas directement, c'est le shell qui le fait pour toi.
[^] # Re: if
Posté par roger91 . Évalué à 1. Dernière modification le 30 décembre 2015 à 15:16.
mequeline doit etre hors sujet, elle n'a rien compris de tout le discours. Pourtant c'est mentionné en amont qu'on est dans la section shell et non C …
[^] # Re: if
Posté par NeoX . Évalué à 3.
pourtant c'est bien toi, ici : http://linuxfr.org/nodes/107718/comments/1636540
qui a posté un exemple en C
[^] # Re: if
Posté par roger91 . Évalué à 1.
Quand j'ai dit que c'était mentionné je faisais allusion à totof2000 qui a fait la remarque et non à moi …
# if
Posté par méqueline . Évalué à 1. Dernière modification le 02 janvier 2016 à 22:59.
eh bin justement j'avais le même exercices l'année dernière oui c'est un cours de système d'exploitation mais faut voir le cours et les questions avant cette question la le prof je vous mis une copie comme je possède encore le pdf de l'année dernière
Je sais trop bien de quoi je parles il te demande pour cette exercice de résoudre avec ce que tu as aprit en cours c'est a dire avec le fork et excev et wait ;)
[^] # Re: if
Posté par totof2000 . Évalué à 2.
OK, donc le posteur initial n'aurait pas compris le sujet de l'exercice (et a posé sa question dans le mauvais forum), ou alors, cette année, le sujet a changé ;)
Tu aurais pu le préciser de suite : ça m'aurait éviter d'étaler une tartine sur les processus shell pour rien.
[^] # Re: if
Posté par roger91 . Évalué à 1.
Tout à fait totof2000…
méqueline donne nous alors des explications toi qui a bien compris ce qu'il fallait faire au lieu de tourner en rond en étalant tous les exos ou publier des codes sans interet ce qui n'apportera rien …
[^] # Re: if
Posté par totof2000 . Évalué à 2.
Je te trouve plutôt gonflé sur ce coup : si il/elle n'avait pas publié ça, on n'aurait jamais compris que tu t'étais planté. Personnellement, j'arrête là. Tu as tout ce qu'il te faut ici pour faire toi-même. Je ne ferai pas tes exos à ta place.
[^] # Re: if
Posté par roger91 . Évalué à 2.
Non totof2000, le problème pour moi normalement il était déjà résolu et je t'en suis très reconnaissant au vue de toutes tes explications qui m'ont beaucoup servi. Je ne sais meme pas pourquoi à partir de l'intervention de mequeline tout à tourné au vinaigre voilà pour j'ai dit qu'elle était hors sujet car mon problème je ne voulais pas le résoudre avec sa logique. C'est moi le posteur donc c'est moi qui connaissais mieux mon problème et ce problème n'a rien à avoir avec sa logique car je ne sais meme pas de quoi elle parle. Pour moi tous ceux qui ont donné des explications l'ont parfaitement fait selon mes attentes y compris toi.
Le pire c'est qu'elle intervient pour rien apporter mais juste pour faire des remarques sans fondements en changeant meme le but de mon post alors que seul le posteur sait ce qu'il cherche.
Merci encore totof2000 pour ton aide et les autres c'est gentil. Et je répète encore les points clés de mes préoccupations ont été résolues par vos explications.
[^] # Re: if
Posté par totof2000 . Évalué à 2.
tu aurais du écrire autre chose que "Tout à fait totof2000…" : j'ai cru que par cette phrase, tu indiquais que tu t'étais ttrompé de sujet … J'imagine que le sujet a changé par rapport à ce que mequeline a indiqué. toutes mes excuses pour le "gonflé" dans ce cas. Celà dit, à l'avenir, essaie d'être un peu plus précis quand tu réponds, ça évitera les malentendus.
[^] # Re: if
Posté par roger91 . Évalué à 1.
Il n'y a pas de soucis d'accord c'est compris t'inquiete ;-)
# if
Posté par méqueline . Évalué à 1.
C'est à toi de trouver ;)
le cours est bien expliqué
[^] # Re: if
Posté par roger91 . Évalué à 0.
Voilà la réponse qu'elle donne.
"le cours est bien expliqué" sans connaitre ma vrai préoccupation.
D'abord son intervention n'est meme pas fondé. Puis elle fait tout tourner au vinaigre et va jusqu'à changer l'objet de mon post pour créer la confusion totale ce qui n'est pas le but d'un forum.
Le pire elle balance une telle réponse en fin de compte…
Tu es satisfaite maintenant qu'on m'ait traité de gonflé à cause de ton intervention ??
# if
Posté par méqueline . Évalué à 1.
Ce n'est pas mon but ce que vous dites juste je le dis pour vous faut bien comprendre le cours pour pouvoir répondre
[^] # Re: if
Posté par roger91 . Évalué à -1. Dernière modification le 30 décembre 2015 à 19:15.
Le post est déjà clot avant que tu ne sèmes encore la confusion combien de fois je dois te le répéter qu' ils ont déjà répondu à mes attentes et de la meilleure manière. Toi qui a bien compris le cours et qui m'envoie balader c'est bien tu peux garder tes explications; déjà je ne comprends rien de ce que tu voulais dire jusque là. Le but des forums c'est l'entraide. Salut !
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.