Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 ​Rusty-shell ​======+====== Devoir ​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 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 commandevous 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'analyseurexé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'​outputsi 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>​+
  
sde2/teme/tema_fr_2_rust.1648628851.txt.gz · Last modified: 2022/03/30 11:27 by alexandru.radovici
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0