!!!!!!!!!!! Interpréteur et langage de commandes UNIX Plan Introduction : rôle et fonctionnement d un interpréteur de commandes Interactivité! Divers shells! Aides à la saisie! Contrôle des tâches Langage de commande (Bourne Shell)! syntaxe d une commande! métacaractères! composition de commandes! redirections! variables! interprétation d une ligne de commande Langage de scripts Commandes avancées : filtrage et parcours récursif! find! filtrage - tubes - filtres - 1 -!!! 2 Utilisation d un interpréteur de commande Il existe de nombreux shells pour Unix (sh, bash, csh, ksh, tcsh, zsh ), offrant des fonctionnalités similaires, sous une forme plus ou moins élaborée : Aides à l interaction :! raccourcis pour la saisie des commandes - métacaractères - accès à l historique des commandes saisies - complétion automatique - alias - chemins d accès relatifs/prédéfinis! personnalisation de l environnement de travail variables d environnement, fichiers (scripts) de configuration! contrôle des traitements en cours "commande" tâche en avant-plan commandes csh/tcsh jobs fournit la liste des tâches "commande &" Langage de scripts, pour automatiser, programmer l enchaînement des commandes fg %n bg %n tâche en arrière-plan "^Z"/SIGSTOP fg %n bg %n tâche suspendue stop %n Utilisation d un interpréteur de commande - 3-1 Rôle d un interpréteur de commandes (shell) Shell = programme d interface interactive entre le système d exploitation et un utilisateur. Un shell fonctionne comme un interprète!!!!! saisie d une commande utilisateur! exécution de la commande saisie Les commandes! API Unix! sont exprimées dans un langage de commande (textuel/graphique) associé au shell! permettent d accéder aux principaux services système : gestion des traitements et des ressources (fichiers, périphériques), utilitaires! langage de programmation à gros grain ("in the large")! s appuient sur l API système sh tcsh monpg UNIX (Implantation ) Rôle d un interpréteur de commandes (shell) - 2 - Un comparatif Choix de l interpréteur fixé dans le fichier /etc/passwd défini par un commentaire en première ligne du script sous la forme #!/chemin_d_accès/shell_choisi options s : #!/bin/csh ou #!/bin/sh -x lancement comme commande sh mon_programme Shell Commande interactivité programmation C shell csh + -- Toronto C shell tcsh ++ -- Bourne shell sh - + Zero shell zsh ++ + Korn shell ksh + ++ Bourne again shell bash ++ + Utilisation d un interpréteur de commande - 4 -
3 Langage de commande Pour la syntaxe, l interpréteur présenté dans ce qui suit est le Bourne Shell (sh). d une ligne commande Une ligne de commande est une suite de mots, séparés par des espaces Le premier mot désigne la commande nom prédéfini (commande interne au shell), ou chemin d accès Les mots suivants sont les paramètres Les premiers paramètres sont souvent des options de la commande Les options sont souvent précédées d un "-" Métacaractères Le shell permet de définir des motifs pour les chemins d accès : * correspond à une suite quelconque de caractères? correspond à un caractère quelconque [liste_de_caractères] correspond à un caractère quelconque de la liste dans ce contexte c 1 -c 2 désigne l ensemble des caractères compris entre c 1 et c 2 dans le jeu ASCII \ permet de déspécialiser le métacaractère qui suit Après interprétation, le motif est remplacé par la liste (triée par ordre alphabétique) des chemins (noms de fichiers) appariés au motif Langage de commande - 5 - Composition de commandes ; (séquence) C1;C2;C3 spécifie que les C1, C2 et C3 devront s'exécuter l une après l autre (séquence ou) C1 C2 C3 exécute en séquence C1, C2, C3 jusqu'à ce qu une commande ait un retour normal && (séquence et) C1&&C2&&C3.. exécute en séquence C1,C2,C3 jusqu'à ce qu une commande ait un retour anormal (... ) (exécution par un sous-processus shell) & (lancement en arrière-plan) (couplage par tubes) C1 C2 lance en parallèle C1 et C2 et crée un tube (pipe), reliant la sortie standard de C1 à l'entrée standard de C2 Langage de commande - 7 -! Redirections Modèle (utilisateur) de l exécution d un calcul activités = processus communicant avec leur 2 environnement au moyen de flots de nnées flot = file d octets, non structurée, non limitée ressources (périphériques, fichiers ) = sources/ 1 puits pour les flots de nnées! vues et manipulées 0 comme des fichiers séquentiels un processus lancé à partir du shell dispose de 3 flots prédéfinis : entrée standard (0), sortie standard (1), sortie erreur standard (2) Gestion des flots d E/S à partir du shell générale : cde n>&m redirige le flot (descripteur) n du processus exécutant cde vers le flot m La valeur par défaut de n est 1 m peut être remplacé par un chemin d accès (fichier) C < F affecte (redirige) le fichier F à l entrée standard de la commande C C > F redirige la sortie standard de la commande C vers le fichier F. Si F existait, il est écrasé. C >> F redirige la sortie standard de la commande C vers le fichier F. Les nnées produites par C sont ajoutées en fin de fichier. Langage de commande - 6 - Variables Le shell permet de définir des variables! non typées! pas de déclaration! $V désigne la valeur de la variable V! de l affectation : variable=valeur (sans espaces) Les variables définies dans un processus peuvent être transmises à ses fils! passage par copie! les variables transmises ivent avoir été déclarées comme exportées (commande export v1 v2... du shell) Ce mécanisme est utilisé pour transmettre les variables d environnement, comme :! PS1 invite! HOME *référence absolue* du *répertoire privé*! PATH liste des *chemins* où chercher les différentes commandes! TERM type du terminal utilisé Dans le contexte des scripts (cf infra), un certain nombre de variables sont prédéfinies : paramètres d appel, code retour, identifiant du processus actif Langage de commande - 8 -
Fonctionnement de principe d un shell while (TRUE) { Lire une commande (sur stdin) ; Interpréter la commande Exécuter la commande } Etapes de l interprétation 1 - Identification des constructeurs ( ; & ( ) && ) et décomposition de la ligne de commande en commandes élémentaires 2 - Evaluation des commandes entre ``(antiquotes), (sauf à l'intérieur des '' (simples quotes)) et substitution par le résultat de l'évaluation 3 - Substitution des variables (sauf à l'intérieur des '' (simples quotes)) : les noms de variables précédés du caractère $ sont remplacés par les valeurs des variables correspondantes. 4 - Découpage de la ligne en arguments (mots séparés par des espaces)! les arguments explicitement nuls (chaînes de la forme "" ou '' ) sont conservés! les arguments implicitement nuls (variables vides ou non définies) sont éliminés 5 - Mise en place des redirections 6 - Evaluation des métacaractères! Les chaines comprises entre "" et '' (ubles et simples quotes) ne sont pas interprétées 7 - Elimination des "" et '' (ubles et simples quotes) extérieures 4 Langage de scripts Scripts Idée! Automatiser des enchaînements complexes ou répétitifs de commandes système Définir un langage de programmation (variables, structures de contrôle) permettant de spécifier ces enchaînements Les éléments de ce langage (structures de contrôle, etc) seront des commandes internes de l interpréteur de commandes Les programmes ainsi constitués sont appelés des scripts Schéma souple/langage extensible : tout programme exécutable est une commande Langage de commande - 9 - Langage de scripts - 11 - Exécution de la commande Le premier mot identifie la commande! directement, s'il s'agit d'une commande interne au shell,! par son chemin d'accès, s'il s'agit d'une commande externe. Un chemin relatif est transformé en chemin absolu, en consultant la variable PATH, si elle est non vide, ou sinon en l interprétant comme relatif au répertoire courant les mots suivants sont pris comme paramètres de la commande si la commande est! interne, elle est exécutée par le shell! externe, en tâche de fond, un processus est créé pour l exécuter, et le shell continue! externe, en avant plan, un processus est créé pour l exécuter, et le shell attend! un pipeline, les tubes, et les processus correspondant aux commandes sont créés Lancer un script Le fichier de script joue pour l interpréteur de commandes le rôle de l'entrée standard : il est exécuté.interprété ligne par ligne Le fichier listerreppriv contient la suite suivante de commandes : cd pwd ls Pour exécuter le contenu de listerreppriv : sh listerreppriv ou bien : chmod +x listerreppriv # listerreppriv devient exécutable listerreppriv # listerreppriv est appelé comme une commande Commentaires # en début de ligne d'un script définit une ligne de commentaires. Langage de commande - 10 - Langage de scripts - 12 -
Paramètres d'un script (Bourne shell) En tant que commande, un script peut accepter des paramètres d'appel (liste de mots (séparés par des espaces) suivant le chemin d accès au script) Au sein du script, les paramètres d'un script/d'une commande sont désignés par leur position (de 1 à 9) ; la commande est désignée par le chiffre 0.! par exemple, $4 désigne la valeur du 4ème paramètre! shift (commande de décalage à gauche des paramètres, interne au sh), permet d accéder aux paramètres au delà du 9ème! la variable prédéfinie * désigne l'ensemble des paramètres d'appel! la variable prédéfinie # désigne le nombre de paramètres d'appel Autres variables prédéfinie du Bourne shell $ désigne le numéro de processus courant? désigne le code retour de la dernière commande exécutée. Scripts d initialisation/terminaison Les applications utilisent souvent des scripts pour adapter leur environnement, avant/après exécution scripts exécutés en début de session :.profile pour les Bourne shells,.login pour les C shells... script exécuté en fin de session :.logout pour les C shells... script exécuté avant exécution d un C shell :.cshrc pour les C shells... Répétitions For for variable in liste liste de commandes s for i in 1 2 3 echo bonjour echo $i for rep in $* cd $rep ; pwd ; ls appel : liste. /usr/local /etc Langage de scripts - 13 - Langage de scripts - 15 - Structures de contrôle Commande test test expression ou [ expression ] Code de retour nul " test vrai Tous les éléments de <expression> ivent être séparés par des espaces Expressions Tests élémentaires! -r <fichier> : <fichier> peut être lu! -w <fichier> : <fichier> peut être écrit! -x <fichier> : <fichier> peut être exécuté! -f <chemin> : <chemin> est un fichier! -d <chemin> : <chemin> est un répertoire! -z <chaîne> : <chaîne> est vide! -n <chaîne> : <chaîne> n'est pas vide Comparaisons! Chaînes de caractères : =,!=! Nombres : -eq, -ne, -gt Composition! (non), -a (et), -o (ou), \(, \) While while liste1 de commandes liste2 de commandes Exécute liste2 tant que le résultat de liste1 est normal while test -n $1 echo $1 shift Langage de scripts - 14 - Langage de scripts - 16 -
Sélections If if liste0 de commandes then liste1 de commandes else liste2 de commandes fi Si liste0 rend un résultat normal (nul), liste1 est exécutée, sinon liste2 if rm $* then echo detruit else echo non trouve fi 5 Commandes avancées : filtres, parcours récursif Pour commencer man sujet affiche la cumentation en ligne relatifve au sujet (commande, notion ) fourni en paramètre options utiles : -f (whatis), -k (apropos), -t (formatage) s man man man ls man hier man intro Remarques La partie else est facultative En général liste0 est réduite à une commande test Langage de scripts - 17 - Commandes avancées : filtres, parcours récursif - 19 - Case case variable in modèle1) liste de commandes1 ;; modèle2) liste de commandes2 ;; esac case $2 in term) pr $1 more ;; impr) pr $1 lpr ;; fich) pr $1 > $3 ;; *) echo "erreur de parametre" ;; esac Remarques Appel : lister proj.l impr * # else/otherwise E/S : lecture de caractères sur l entrée standard read x attend la saisie d une chaîne au clavier et l affecte à x Parcours récursif : find find répertoire expression Parcourt récursivement le répertoire fourni en paramètre, et évalue expression sur chacun des fichiers rencontrés. L évaluation de l expression, lorsqu elle est trouvée vraie sur un fichier rencontré F peut comporter/entraîner l exécution de commandes portant sur F [g5:~]% find. -name core -print -exec rm {} \; /core /LANGAGES/C/TP1/core /LANGAGES/C/TP2/core recherche les fichiers core à partir du répertoire courant (.), affiche le chemin d'accès aux fichiers trouvés (-print), et exécute la commande rm (-exec) sur chacun de ces fichiers. Ici, 3 fichiers core ont été trouvés et supprimés.. Langage de scripts - 18 - Commandes avancées : filtres, parcours récursif - 20 -
Expression de recherche Attention : tous les composants de l'expression de recherche ivent être séparés par des espaces. La recherche peut porter sur différents critères parmi lesquels :! -name fich : vrai si le nom du fichier est fich fich peut comporter des métacaractères, destinés à find (fich it alors être entre ou " ")! -perm num : vrai si les droits d'accès au fichier valent num! -size [+ -]n : vrai si la taille du fichier est [+ -] de n blocs! -type d (resp -type f) : vrai si le fichier est un répertoire (resp un fichier ordinaire)! -user nom : vrai si le propriétaire du fichier est nom! -newer fich : vrai si le fichier est plus récent que le fichier fich Il est possible d'utiliser des opérateurs logiques dans l'expression :! pour la négation, -o pour la disjonction, -a pour la conjonction (connecteur par défaut) Les composants de l'expression peuvent être parenthésés par \( et \) L'expression peut comporter des actions sur les fichiers vérifiant les critères de recherche! -print : affiche les chemins d'accès aux fichiers trouvés! -exec commande : exécute commande sur les fichiers trouvés! -ok commande : demande confirmation pour exécuter commande sur chaque fichier trouvé. Dans ce cas, comme dans le précédent (-exec) : - le fichier trouvé (correspondant à l expression de recherche) peut être désigné dans commande par la chaîne {} - commande it se terminer par la chaîne \; Les expressions régulières Langage permettant de définir des motifs à distinguer dans un texte. Ce langage est commun à plusieurs commandes utiles : grep, sed, expr Motifs élémentaires. désigne un caractère quelconque ^ et $, contraignent respectivement le motif à être situé en début et en fin de ligne. Définition d'ensembles :! une liste de caractères entre crochets ([ et ]) désigne un élément quelconque de la liste.! - permet de définir des intervalles de caractères au sein d un ensemble : [f-j] désigne tous les caractères compris entre f et j, soit : {f,g,h,i,j}! ^ immédiatement après le [ signifie qu'il faut considérer le complémentaire de l ensemble : [^zf-j5] désigne tous les caractères sauf {f,g,h,i,j,z,5} Facteur de répétition it suivre immédiatement le motif nt il précise la répétition. * signifie que le motif qui précède est répété un nombre de fois quelconque (0 compris). \{n,m\}, (n et m entiers) signifie que le motif qui précède est répété entre n et m fois \{n,\}, (n entier) signifie que le motif qui précède est répété au moins n fois \{n\}, (n entier) signifie que le motif qui précède est répété exactement n fois ^[^:]*:a[4-8fk-m1][^:;]*[0-9]$ Commandes avancées : filtres, parcours récursif - 21 - Commandes avancées : filtres, parcours récursif - 23 - Plus d exemples [g5:~]% find. -newer titi -exec ls -l {} \; Recherche les fichiers créés ou modifiés plus récemment que le fichier titi et exécute ls -l sur les fichiers trouvés [g5:~]% find /users \( -name a.out -o -name "*.o" \) -exec rm {} \; Exécute la commande rm sur les fichiers nommés a.out OU suffixés par.o dans la sousarborescence /users. [g5:~]% find. \( -user marc -a -newer titi \) -exec cp {} Svgdes \; - Recherche les fichiers appartenant à l'utilisateur marc, nt la date de dernière modification est plus récente que celle du fichier titi - Copie les fichiers correspondant dans le répertoire Svgdes. La commande expr expr expression évalue des expressions (entiers/chaînes) et affiche (stut) le résultat. Expressions expression1 opérateur expression2! si opérateur est =,!=, >, >=, < ou <= renvoie le résultat de la comparaison entre entiers si les deux expressions sont des entiers, sinon renvoie le résultat de la comparaison lexicale (vrai : 1 ou faux : 0)! si opérateur est +, -, *, /ou % renvoie la somme, la différence, le produit, le quotient ou le reste des expressions (entiers) chaîne : expression régulière recherche la plus longue sous-chaîne (sc) commençant en début de chaîne et correspondant à l expression régulière! si l'expression régulière contient un sous-motif entre parenthèses (entre \( et \) ), expr affiche la sous-chaîne de sc appariée au sous-motif! sinon, expr affiche la longueur de sc Composition expression1 expression2 renvoie le résultat de expression1 si celui-ci n'est ni vide, ni zéro, sinon renvoie le résultat de expression2 expression1 & expression2 renvoie le résultat de expression1 si aucun résultat n est vide / nul, sinon renvoie zéro Les composants de l'expression peuvent être parenthésés par \( et \) Tous les composants de l'expression ivent être séparés par des espaces. Commandes avancées : filtres, parcours récursif - 22 - Commandes avancées : filtres, parcours récursif - 24 -
Exercice Au moyen de la commande expr calculer la longueur d une chaine nnée extraire la sous chaîne de taille T, commençant à la position P dans une chaîne nnée, indiquer la position de la première occurrence d un caractère d une liste nnée Quelques filtres réalisant les opérations d un SGBD relationnel grep sélection : filtre les lignes contenant un motif nné (ou ne le contenant pas : option -v) cut projection : extraction de colonnes d un fichier (définies par position ou séparateurs) sort tri des lignes d un fichier sur un champ (défini par position ou séparateurs join jointure : jointure de fichiers préalablement triés (par sort) sur le champ de jointure cat union : concaténation de fichiers ; sort (ou uniq) permet d éliminer les ublons comm intersection et différence des lignes de deux fichiers paste juxtaposition des lignes de plusieurs fichiers (cat horizontal) head extraction des premières lignes d un fichier tail extraction des dernières lignes d un fichier Commandes avancées : filtres, parcours récursif - 25 - Autres filtres wc statistiques sur le contenu d un fichier sed édition orientée ligne d un fichier tr conversion (traduction/suppression) des caractères d un fichier diff comparaison (et affichage des différences) du contenu de deux fichiers Commandes avancées : filtres, parcours récursif - 27 - Filtrage Le shell permet de construire un schéma de traitement parallèle particulier, appelé pipeline : un traitement comportant plusieurs étapes successives E1, E2, E3 it être appliqué à chacun des éléments d un ensemble le principe est de lancer autant de processus P1, P2, P3 que d étapes, chaque processus réalisant l une des étapes le traitement est alors organisé ainsi! P1 commence en traitant successivement chacun des éléments de l ensemble. Dès qu un élément a été traité, le résultat est transmis à P2, pour qu il réalise la deuxième étape! P2 fait de même vis-à-vis de P3, au fur et à mesure qu il reçoit les résultats de P1, etc! Une fois le pipeline amorcé, tous les processus tournent en parallèle Le shell permet de réaliser cette architecture avec une catégorie particulière de commandes, les filtres, qui sont écrites pour lire leurs nnées d entrée, par défaut, sur leur entrée standard, et écrire leurs résultats sur leur sortie standard les tubes qui permettent de rediriger la sortie standard d une commande vers l entrée standard d une autre commande cat *.c 1 tube 0 grep var cat *.c grep var wc -l 1 0 1 tube wc -l Commandes avancées : filtres, parcours récursif - 26 - g La commande sed (filtre) sed [-n] [-e commande] [-f fichiers de cde] [fichiers à traiter] Editeur de commandes ligne non interactif -n : pas d affichage, sauf commande explicite les commandes sont appliquées à chacune des lignes limite : pas plus de 200 arguments -e ou -f pour une même commande sed Composition syntaxe : [ligne initiale [, ligne finale]] opération [arguments] principales opérations! [l] a \texte ajout de texte [en ligne l]! [l] i \texte insertion de texte [en ligne l]! [i,f] p affichage des lignes i à l! q terminer! y/chaîne_cible/chaîne_source/ # tr chaîne_cible chaîne_source! s/expr_reg_1/expr_reg_2/options substitue expr_reg_2 à expr_reg_1 Options - g : traiter toutes les occurrences de expr_reg_1 - p : affichage seulement en cas de substitution - w fichier : écriture si substitution Commandes avancées : filtres, parcours récursif - 28 -