This shows you the differences between two versions of the page.
sde2:teme:tema_fr_2_rust [2022/03/30 11:27] alexandru.radovici |
sde2:teme:tema_fr_2_rust [2023/03/31 11:41] (current) alexandru.radovici |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Devoir 3 - Rusty-shell ====== | + | ====== Devoir 2 - Rustyshell ====== |
Le but de ce thème est de créer un shell simple, compatible avec '' sh ''; | Le but de ce thème est de créer un shell simple, compatible avec '' sh ''; | ||
Line 6: | Line 6: | ||
<note important> | <note important> | ||
- | Date limite: ** Le 5 avril, 23h55 ** \\ | + | Date limite: ** Le 16 avril, 23h59 ** \\ |
Note: ** 2 points ** de la note \\ | Note: ** 2 points ** de la note \\ | ||
- | Lien: [[https://vmchecker.cs.pub.ro|vmchecker.cs.pub.ro]] \\ | + | Lien: [[https://classroom.github.com/a/5bIEjznY|Devoir 2]] \\ |
Télécharger en retard: **1 points / jour** (maximum 4 jours)\\ | Télécharger en retard: **1 points / jour** (maximum 4 jours)\\ | ||
</note> | </note> | ||
Line 56: | Line 56: | ||
* sera utilisé pour exécuter des commandes séquentiellement; | * sera utilisé pour exécuter des commandes séquentiellement; | ||
* par exemple, '' expr1; expr2 '' commencera par exécuter les commandes '' expr1 '' et les commandes '' expr2 '' seulement après l'exécution de //expr1//; | * par exemple, '' expr1; expr2 '' commencera par exécuter les commandes '' expr1 '' et les commandes '' expr2 '' seulement après l'exécution de //expr1//; | ||
+ | <hidden> | ||
* Opérateur de parallélisme '' & '' | * Opérateur de parallélisme '' & '' | ||
* sera utilisé pour exécuter les commandes en parallèle; | * sera utilisé pour exécuter les commandes en parallèle; | ||
* par exemple, '' expr1 & expr2 '' entraînera l'exécution de '' expr1 '' et des commandes '' expr2 '' en parallèle; | * par exemple, '' expr1 & expr2 '' entraînera l'exécution de '' expr1 '' et des commandes '' expr2 '' en parallèle; | ||
* dans l'implémentation de votre programme, il est ** INTERDIT** de rappeler le propre exécutable. <code> execv ("./rustyshell", "command"); </code> | * dans l'implémentation de votre programme, il est ** INTERDIT** de rappeler le propre exécutable. <code> execv ("./rustyshell", "command"); </code> | ||
+ | </hidden> | ||
* opérateurs d'exécution conditionnelle '' && '' et '' || '' | * opérateurs d'exécution conditionnelle '' && '' et '' || '' | ||
* seront utilisés pour exécuter des commandes en fonction du code d'erreur; | * seront utilisés pour exécuter des commandes en fonction du code d'erreur; | ||
Line 70: | Line 72: | ||
- opérateur pipe | - opérateur pipe | ||
- opérateurs d'exécution conditionnelle | - opérateurs d'exécution conditionnelle | ||
- | - opérateur de parallélisme | + | - opérateur de parallélisme (pas utilise) |
- opérateur de séquençage | - opérateur de séquençage | ||
Line 86: | Line 88: | ||
* '' exit '' et '' quit '' pour terminet le shell | * '' exit '' et '' quit '' pour terminet le shell | ||
* '' cd directory '' pour changer le répertoire actuel | * '' cd directory '' pour changer le répertoire actuel | ||
- | * ** ATTENTION **: Le rusty-shell doit toujours fonctionner a l'utilisation de la commande '' cd '' sans paramètre, remplacer le répertoire en cours par le répertoire //home// de l'utilisateur courant (variable %%$%%HOME) | + | * ** ATTENTION **: Le rustyshell doit toujours fonctionner a l'utilisation de la commande '' cd '' sans paramètre, remplacer le répertoire en cours par le répertoire //home// de l'utilisateur courant (variable %%$%%HOME) |
Le shell doit aussi supporter les sous-commandes: | Le shell doit aussi supporter les sous-commandes: | ||
Line 94: | Line 96: | ||
==== Remarques générales ==== | ==== Remarques générales ==== | ||
- | * Pour simplifier la mise en oeuvre du devoir, vous pouvez utiliser l' [[https://ocw.cs.pub.ro/courses/sde/teme/tema_ro_3_python#parcurgearea_linii_de_comanda | analyseur]] mis en œuvre par nous. Pour plus de détails sur l’analyseur, lisez le fichier README dans l’archive. Des exemples d'utilisation de l'analyseur peuvent être trouvés dans la source '' cmd.py '', qui peut etre utilisée comme un support pour le devoir. | + | * Vous n'avez pas besoin d'écrire l'analyseur de ligne de commande, vous pouvez utiliser celui du modèle de devoir. |
- | * Le prompt affiché par le shell est requis pour faciliter les tests automatiques et est %%$%% (c'est-à-dire qu'il affichera le caractère %%$%% suivi d'un espace blanc). | + | |
- | * Le nom de l'exécutable du devoir doit être '' cmd.py ''. | + | |
==== Suggestions ==== | ==== Suggestions ==== | ||
Line 103: | Line 103: | ||
- Lancer des commandes simples ('' ls '', '' ls -l '') | - Lancer des commandes simples ('' ls '', '' ls -l '') | ||
- | - Exécuter des commandes internes ('' cd '', '' exit '', 'quit' ') | + | - Exécuter des commandes internes ('' cd '', '' exit '', ''quit'') |
- mise en place de redirections (opérateurs '' < '', '' > '', '' 2> '', '' &> '', '' >> '', '' 2>> '') | - mise en place de redirections (opérateurs '' < '', '' > '', '' 2> '', '' &> '', '' >> '', '' 2>> '') | ||
- séquencement des commandes (opérateurs ''&&'', ''||'', '';'') | - séquencement des commandes (opérateurs ''&&'', ''||'', '';'') | ||
- | - implémentation des opérateurs '' & '' (parallèle) | + | - implémentation des opérateurs '' & '' (parallèle, pas utilise) |
- '' | '' | - '' | '' | ||
Line 182: | Line 182: | ||
Laboratoires utiles: | Laboratoires utiles: | ||
- | *[[sde2:laboratoare:01]] | + | *[[sde2:laboratoare:00_rust]] |
- | *[[sde2:laboratoare:02]] | + | *[[sde2:laboratoare:01_rust]] |
- | *[[sde2:laboratoare:03]] | + | *[[sde2:laboratoare:02_rust]] |
- | *[[sde2:laboratoare:04]] | + | *[[sde2:laboratoare:03_rust]] |
- | *[[sde2:laboratoare:05]] | + | *[[sde2:laboratoare:04_rust]] |
- | Ressources: | + | |
- | * L'analyseur de commandes, le modèle de code et les tests sont disponibles dans [[https://github.com/upb-fils/sde/tree/master/tema3 | tema3]] sur le [[https://github.com/upb-fils/sde|repository de Github]]. | + | |
===== Traitement de la ligne de commande ===== | ===== Traitement de la ligne de commande ===== | ||
Pour traiter la ligne de commande, nous avons déjà écrit un analyseur que vous pouvez utiliser. | Pour traiter la ligne de commande, nous avons déjà écrit un analyseur que vous pouvez utiliser. | ||
- | Lancez le devoir dans le fichier 'cmd.py' du modèle. | ||
- | Pour voir à quoi ressemble la structure de données à partir de l'analyseur, exécutez le script cmd.py et apres introduisez une commande du clavier. | + | Pour voir à quoi ressemble la structure de données à partir de l'analyseur, exécutez le modèle et apres introduisez une commande du clavier. |
- | <note warning> | ||
- | Pour pouvoir exécuter le fichier cmd.py, il faut intaller la bibliotheque bashlex (''pip3 install bashlex %%--%%target=.''). | ||
- | </note> | ||
<code bash> | <code bash> | ||
- | $ pip3 install bashlex --target=. | + | $ cargo run |
- | $ python3 cmd.py | + | |
$ ls | $ ls | ||
- | ls | + | Command "ls" |
- | {'op': 4, 'com1': None, 'com2': None, 'commands': [<parse.SimpleCommand object at 0x100b4bfd0>], 'input': None, 'output': None, 'err': None, 'append_err': False, 'append_out': False} | + | SimpleCommand { |
- | commands | + | assignments: [], |
- | ls | + | parameters: [ |
+ | [ | ||
+ | Word( | ||
+ | "ls", | ||
+ | ), | ||
+ | ], | ||
+ | ], | ||
+ | redirects: [], | ||
+ | } | ||
+ | $ ls && echo "folder exists" | ||
+ | Command "ls && echo \"folder exists\"" | ||
+ | AndCommand( | ||
+ | SimpleCommand { | ||
+ | assignments: [], | ||
+ | parameters: [ | ||
+ | [ | ||
+ | Word( | ||
+ | "ls", | ||
+ | ), | ||
+ | ], | ||
+ | ], | ||
+ | redirects: [], | ||
+ | }, | ||
+ | SimpleCommand { | ||
+ | assignments: [], | ||
+ | parameters: [ | ||
+ | [ | ||
+ | Word( | ||
+ | "echo", | ||
+ | ), | ||
+ | ], | ||
+ | [ | ||
+ | Quotes( | ||
+ | [ | ||
+ | [ | ||
+ | Word( | ||
+ | "folder", | ||
+ | ), | ||
+ | ], | ||
+ | [ | ||
+ | Word( | ||
+ | " ", | ||
+ | ), | ||
+ | ], | ||
+ | [ | ||
+ | Word( | ||
+ | "exists", | ||
+ | ), | ||
+ | ], | ||
+ | ], | ||
+ | ), | ||
+ | ], | ||
+ | ], | ||
+ | redirects: [], | ||
+ | }, | ||
+ | ) | ||
</code> | </code> | ||
- | ===== La structure retournée en cmd.py ===== | + | ===== La structure afichee en rustyshell ===== |
- | En appelant parse.parse(line), on va renvoyer un objet de type **Command**. | + | Pour comprendre comment utiliser la structure renvoyée par l'analyseur, exécutez la commande ''cargo doc --open'' et examinez le module //parser::ast//. |
- | + | ||
- | ==== Classe Command ==== | + | |
- | + | ||
- | Propriétés: | + | |
- | + | ||
- | * op - le type d'opération de la commande (les types sont définis en bas) | + | |
- | * com1 - contient un objet de type Command, la premiere commande de la liste, si op est OP_NONE, com1 sera égal a None | + | |
- | * com2 - contient un objet de type Command, la deuxieme commande de la liste, si op est OP_NONE, com2 sera égal a None | + | |
- | * commands - contient la liste des commandes et argumens ( seulement si op est OP_NONE), si l'un des arguments est de la forme '' $(cmd_list) '', l'contient un objet de type Command, la premiere commande de la liste, si l'élément sera du type Command; sinon, l'élément sera du type SimpleCommand | + | |
- | + | ||
- | <note> | + | |
- | Pour vérifier le type d'on objet, utilisez la structure **isinstance (obj, class)**. | + | |
- | </note> | + | |
- | * input - comprend le fichier d'input, si l'entrée est redirigée ('' < '') | + | |
- | * output - contient le fichier d'output, si la sortie est redirigée ('' > '', ''>>'') | + | |
- | * err - contient le fichier d'error_output, si la sortie d'erreur standars est redirigée (''2>'', ''2>>'', ''&>'', ''&>>'') | + | |
- | * append_err - a la valeur True si la sortie d'erreur fait un appned (''2>>'', ''&>>'') | + | |
- | * append_out - a la valeur true si la sortie fait un append (''>>'', ''&>>'') | + | |
- | + | ||
- | ==== Classe SimpleCommand ==== | + | |
- | L'objet de type SimpleCommand est utilisé dans les commandes ayant op égal a OP_NONE (commande simple). Celles-ci se trouvent dans la liste **commands** est sont soit des commandes, soit des parametres pour des commandes. | + | |
- | + | ||
- | Propriétés: | + | |
- | * word - le texte de la commande ou du parametre | + | |
- | + | ||
- | ==== Types d'opérations ==== | + | |
- | + | ||
- | Le module **parse** expose les suivantes types d'opérations (la valeur de command.op): | + | |
- | + | ||
- | * OP_CONDITIONAL_NZERO - l'opération des de type ( '' cmd1 && cmd2 '' ) | + | |
- | * OP_CONDITIONAL_ZERO - l'opération des de type ( '' cmd1 || cmd2 11 '') | + | |
- | * OP_SEQUENTIAL - l'opération est de type ( ''cmd1 ; cmd2 '' ) | + | |
- | * OP_PARALLEL - l'opération est de type ( '' cmd1 & cmd2 '' ) | + | |
- | * OP_NONE - l'opération est de type ( '' commande params '' ) | + | |
- | * OP_PIPE - l'opération est de type ( '' cmd1 | cmd2 '' ) | + | |
- | ===== FAQ ===== | + | |
- | + | ||
- | *** Q: ** Le devoir 3 peut être réalisé en Python 2? | + | |
- | *** A: ** Non. | + | |
- | + | ||
- | *** Q: ** Le nombre de fors doit-il être optimisé? Par exemple, pour la commande '' a | b | c '', j'ai 3 fourchettes ou puis-je en avoir 4 ou 5? | + | |
- | *** A: ** Il n'est pas nécessaire d'optimiser le nombre de fourches. Cependant, il est généralement conseillé de considérer l'efficacité des ressources plus efficacement. | + | |
- | + | ||
- | *** Q: ** Le Shell doit se comporter comme un vrai shell (sh, bash) dans la situation ...? | + | |
- | *** A: ** La fonctionnalité minimale requise est celle indiquée dans la déclaration. Si vous implémentez quelque chose de plus, veuillez spécifier dans le fichier README Exemples de fonctionnalités non requises: mise à jour des variables d’environnement (comme '' $ OLDPWD '' et '' $ PWD ''), historique, etc. - (voir [[http://linux.die.net / man / 1 / bash | man bash]] pour une idée de la fonctionnalité d'un shell complet :-)) | + | |
- | + | ||
- | *** Q: ** Puis-je utiliser l'analyseur si je veux écrire un autre équivalent? | + | |
- | *** A: ** Oui. | + | |
- | + | ||
- | *** Q: ** Nous sommes autorisés à utiliser: | + | |
- | <code> | + | |
- | args = ["/bin/bash", "-c", command]; | + | |
- | os.execv(args[0], args); | + | |
- | </code> | + | |
- | *** A: ** Non. | + | |
- | + | ||
- | *** Q: ** Puis-je faire '' os.execv '' sur mon devoir pour exécuter une partie de l'arbre indépendamment? | + | |
- | *** A: ** Non. | + | |
- | + | ||
- | + | ||
- | ===== Télécharger les devoirs ===== | + | |
- | Le devoir sera téléchargé sur [[https://vmchecker.cs.pub.ro | vmchecker]]. Connectez-vous au site à l'aide de l'utilisateur moodle, sélectionnez // Systemes d'Explotation (FILS) // et chargez [[#archive-devoir | archive de devoir]]. | + | |
- | + | ||
- | ====Readme ==== | + | |
- | Le fichier readme a le format suivant: | + | |
- | + | ||
- | <code> | + | |
- | Votre nom entier | + | |
- | La groupe | + | |
- | + | ||
- | Description de la résolution du devoir, pourquoi vous avez choisi des solutions, etc. | + | |
- | </code> | + | |
- | + | ||
- | + | ||
- | ==== Archivage de devoir ==== | + | |
- | Pour télécharger le devoir, suivez les étapes suivantes: | + | |
- | + | ||
- | - Créez une archive zip (pas rar, ace, 7zip ou autre format) contenant: | + | |
- | * tous Python (*.py) | + | |
- | * le fichier principal ayant le nom cmd.py | + | |
- | * Fichier Readme - connectez-vous sur [[https://vmchecker.cs.pub.ro | vmchecker]] | + | |
- | - sélectionnez le cours // Systemes d'Explotation (FILS) // | + | |
- | - sélectionnez // 3. Mini-Shell // | + | |
- | - téléchargez l'archive | + | |
- | + | ||
- | + | ||
- | <note> | + | |
- | L'archive doit contenir tous les fichiers (principaux) à la racine, pas dans les sous-répertoires. NE PAS archiver le répertoire du devoir, archiver les fichiers DIRECT. | + | |
- | + | ||
- | N'incluez PAS les directoires spécifiques a la bibliotheque bashlex (pycache, bashlex, bashlex-0.14.dist-info). | + | |
- | </note> | + | |
- | + | ||
- | Après avoir chargé l'archive, vmchecker s'exécutera: | + | |
- | <code bash> | + | |
- | unzip archive.zip homework | + | |
- | cd homework | + | |
- | python3 cmd.py | + | |
- | </code> | + | |