1 Le shell Principales commandes 2 Qu’est-ce que le shell ? Le shell est un pr

1 Le shell Principales commandes 2 Qu’est-ce que le shell ? Le shell est un programme exécutable en mode terminal, dont la principale fonction est de permettre à l’utilisateur d’interagir avec le système via un terminal. Il est parfois appelé interpréteur de commandes. Deux modes d’utilisation : Interactif : l’utilisateur saisit et exécute ses lignes de commandes une par une dans un terminal ; Non interactif : le shell lit un ensemble de commandes à partir d’un fichier appelé shell script. Il existe aujourd’hui plus d’une trentaine de shells différents, mais deux grandes familles dominent : Csh, tcsh : shells orientés administration, avec une syntaxe inspirée du langage C 3 Qu’est-ce que le shell ? Sh (à l’origine: ash), bsh (Bourne shell), bash (Bourne again shell) : shells orientés utilisateur, majoritaires aujourd’hui. La plupart des scripts shell sont écrits en sh, ou au moins compatibles sh. Le shell UNIX standard est sh. Nous n’étudierons que lui cette année. Bash supplante de plus en plus souvent sh (c’est le cas sur Linux). Il consiste en un mélange de sh, de quelques fonctions du csh, et d’autres du Korn shell (ksh), mais il est 100% compatible sh. 4 Principe d’exécution Principe général d’exécution : le shell 1) Lit une ligne de commande soit à partir du terminal, soit à partir d’un fichier script 2) Effectue une première analyse qui détermine quels sont les mots de cette ligne, et quels en sont les délimiteurs (espace, ‘, ", tabulations). 3) Catégorise les mots trouvés en : opérateurs, chaînes de caractères, et mots ordinaires. 4) Compile la ligne de commande en commandes simples, en appliquant un jeu de priorités fixé sur les opérateurs identifiés 5) Evalue chaque commande simple en attendant (exécution séquentielle) ou en n’attendant pas (exécution parallèle) sa terminaison pour évaluer suivante selon la présence de l’opérateur &. 5 Grammaire Les mots (comme les opérateurs) sont soit des suites ininterrompues de caractères, soit des chaînes de caractères délimitées par ‘ ou ". Deux types d’opérateurs :  Contrôle : ils servent à séparer deux commandes ou deux listes. Ce sont: & && () {} ; ;; | ||  Redirection : ils servent à rediriger les entrées/sorties et portent sur une seule commande. Ce sont: < > >| << >> <& >& <<- <> 6 Grammaire Une ligne de commande est : simple si elle ne comporte aucun opérateur de contrôle ; composée dans le cas contraire. Priorités des opérateurs de contrôle : () {} | && || ; & ;; Priorités croissantes (priment sur les priorités horizontales) Priorités égales (*) (*) L’opérateur rencontré le premier remporte la priorité 7 Grammaire Un exemple : traitement de la ligne de commande test -d ’/sw’ 2>/dev/null <tab> && cat $FIC | wc -l || echo "/sw inexistant" Etapes 1 à 3 : après identification des mots (ordinaires, chaînes de caractères) et des opérateurs, on obtient : test -d ’/sw’ 2> /dev/null && cat $FIC | wc -l || echo "/sw inexistant" 8 Grammaire Etape 4 : arbre compilé : || && echo "/sw inexistant" test -d ’/sw’ | 2> /dev/null cat $FIC wc -l (commandes simples) 9 Commandes simples Une commande simple a la forme suivante: [assign] [com] [args…] [redir] • assign consiste en aucune, une ou plusieurs affectations de variables portant sur la commande qui suit (et seulement elle) • com est la commande elle-même. Il s’agit soit d’un nom de commande interne, soit d’un nom de fichier exécutable accessible par la variable d’environnement PATH. • args sont les arguments optionnels de la commande • redir consiste en aucune, une, ou plusieurs redirections de fichiers 10 Commandes simples Evaluation d’une commande simple : ce qui se passe (dans l’ordre) 1. Les assignations [assign] sont provisoirement retirées de la ligne de commande 2. Ce qui reste subit le processus de développement du shell 3. Les redirections [redir] sont appliquées, puis retirées de la ligne de commande 4. Les assignations sont replacées sur la ligne de commande. Deux cas de figure peuvent se produire: 1. [nom] est vide → les variables affectées par [assign] sont celles du shell courant. 2. [nom] n’est pas vide → les variables affectées par [assign] sont celles de la commande [com] qui va être lancée 11 Commandes simples Exemple DISPLAY=10.0.0.3:0.0 xterm -name $XTNAME > /tmp/log 2>&1 1. Assignations: DISPLAY=10.0.0.3:0.0 est retiré xterm -name $XTNAME > /tmp/log 2>&1 2. Développement : une seule substitution à faire ici, $XTNAME qui est une variable, valant myterm par exemple xterm -name myterm > /tmp/log 2>&1 3. Redirections : > /tmp/log indique que la sortie standard doit être redirigée vers le fichier /tmp/log, 2>&1 que la sortie d’erreur standard et la sortie standard doivent être unifiées xterm -name myterm 4. Assignations : DISPLAY=10.0.0.3:0.0 assigne 10.0.0.3:0.0 à la variable DISPLAY, et le reste de la ligne est lancé avec cette valeur : xterm -name myterm assign com args redir 12 Variables Le shell connaît deux types de variables : ordinaires et d’environnement. Une variable ordinaire n’est connue que par le shell : aucun des programmes que le shell lancera ne pourra la consulter/modifier. A l’inverse, une variable d’environnement est une variable ordinaire dont les processus lancés par le shell recoivent une copie. On peut assigner une valeur à une variable avec l’opérateur ‘=‘ (attention: pas d’espace) $ mavariable=3 $ echo $mavariable 3 Pour faire une variable d’environnement d’une variable ordinaire, on utilise la commande export : $ sh -c 'echo $mavariable’ # lance la com. dans un sous-shell $ export mavariable $ sh -c 'echo $mavariable' 3 13 Développement C’est une technique de réécriture très puissante durant laquelle les variables, les noms de fichiers, et certains caractères sont substitués soit par leur propre valeur, soit par un traitement sur cette valeur. Développement de variables Forme générale: ${expression} Forme var définie var indéfinie ${var} ou $var Substitue var Substitue null ${var:-mot} Substitue var Substitue mot ${var:+mot} Substitue mot Substitue null ${var:?[mot]} Substitue var Erreur + substitue mot si spécifié ${var:=mot} Substitue var Assigne mot à var; substitue mot 14 Développement Forme Substitution ${#var} Longueur de la chaîne var ${var%motif} var privée de la plus courte occurrence droite de motif ${var%%motif} var privée de la plus longue occurrence droite de motif ${var#motif} var privée de la plus courte occurrence gauche de motif ${var##motif} var privée de la plus longue occurrence gauche de motif va: test $ echo ${va:?} va: parameter null or not set $ echo ${va:=mot} mot $ echo $va mot $ echo ${#var} 7 $ echo ${var%e} aaabccc $ echo ${var%c} aaabcc $ echo ${var%%c} aaabcc $ echo ${var%c*} aaabcc $ echo ${var%%c*} aaab $ var=aaabccc $ echo $var aaabccc $ echo ${va:-mot} mot $ echo ${var:-mot} aaabccc $ echo ${var:+mot} mot $ echo ${va:?test} 15 Développement Variables spéciales (utilisables seulement dans un script) : Nom Substitué par * L’ensemble des paramètres concaténés en une seule chaîne @ L’ensemble des paramètres en autant de chaînes que nécessaire # Nombre de paramètres passés - Option courante 0,1,2… Chaque paramètre, y compris le nom de la commande (0) Variables spéciales toujours utilisables : Nom Substitué par $ Numéro de processus (PID) du shell courant ! PID de la dernière commande d’arrière-plan terminée ? Code de retour du dernier processus terminé 16 Développement Développement arithmétique entière Forme générale: $((expression)) où expression est une expression arithmétique entière $ echo $((3+1)) 4 $ echo $((3+2*6)) 15 $ echo $((3-(1+1)*6)) -9 $ i=2 $ i=$((i+1)) $ echo $i 3 $ echo $((3+(1+1.5)*6)) sh: 3+(1+1.5)*6: missing `)' (error token is ".5)*6") 17 Développement Développement des noms de fichiers Tout mot contenant les métacaractères ‘*’, ‘?’, ‘[‘, et ‘]‘ est développé par le shell pour concorder avec un nom de fichier existant s’il en existe un. Le shell génère alors autant de chaînes qu’il peut trouver de correspondances. S’il n’en trouve pas, le mot est laissé tel quel. Le tilde ‘~’ seul, suivi de / ou d’un nom de login est toujours développé, et en premier. ? Remplace un seul caractère * Remplace un nombre quelconque de caractères (y compris aucun) [p] Remplace un seul caractère parmis ceux indiqués dans p (même syntaxe que pour les expressions régulières) ~nom Substitué par la variable $HOME de l’utilisateur nom 18 Développement $ echo ~ /Users/xavier $ echo $HOME /Users/xavier $ ls cap1.tiff cap2.tiff test $ echo cap?.tiff capi*.tiff cap1.tiff cap2.tiff capi*.tiff $ echo *es* test $ echo /??? /bin /dev /etc /lib /tmp /usr /var $ echo /???/?? /bin/cp /bin/dd /bin/df /bin/ed /bin/ln /bin/ls /bin/mv /bin/ps /bin/rm /bin/sh /dev/fd /etc/rc /var/at /var/db /var/vm /var/yp $ echo /???/[a-c]?? /bin/cat /bin/csh /usr/bin 19 Développement Chaînes de caractères • Tous les mots non délimités par des " et des ' subissent le développement de variables, arithmétique, et de noms de fichiers • Les chaînes encadrées par des " subissent le développement de variables et le développement arithmétique, mais pas le développement des noms de fichiers • Les chaînes de caractères encadrées par des ' ne subissent aucune développement ni aucune autre transformation • Un caractère précédé de ‘\’ ne subit uploads/Industriel/ shell.pdf

  • 51
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager