Processus et scripts Jean-Sébastien Coron Université du Luxembourg Contrôle des processus. Les variables shell Scripts simples. Découpage de chaines. Exécution conditionnelle. Plan du cours Le shell Un shell est un programme qui lit et exécute les commandes de l utilisateur. Un shell permet aussi : De controler les processus. De rediriger l entrée et/ou la sortie. D écrire des scripts. Script shell: Fichier texte contenant une série de commandes. Comme fichier.bat sous MS-DOS. De nombreux shell existent: sh, bash, csh, tcsh. 1 Contrôle des processus Contrôle des processus Le shell permet de contrôler les processus qui s exécutent. Un processus s exécute soit en foreground, soit en background. Foreground. Le processus reçoit les commandes du clavier et renvoie sa sortie à l écran. Un seul processus en foreground par shell. Peut être suspendu avec Ctrl-Z. Relancé en foreground par fg, en background par bg. Définitivement interrompu en tapant Ctrl-C.
Contrôle des processus Exécution d un processus en background: On utilise le caractère &. $ find -name hello.txt & [1] 2812 $ Cherche un fichier nommé hello.txt dans le répertoire courant. Le processus s exécute en tache de fond. 1 représente le numéro du processus s exécutant en background. 2812 représente son PID. jobs permet d avoir la liste de tous les processus en background. Essayez la commande sleep 5. 1) Que fait cette commande? Exécutez cette commande en background. 2) Quelle est la commande à taper? Affichage des processus La commande ps permet d avoir la liste des processus qui $ ps PID TTY TIME CMD s exécutent sur la machine. 2653 con 00:01:03 bash 3672 0 00:00:05 find 3687 0 00:00:00 ps Pour stopper un process, on utilise la commande kill. kill 3672 stoppe l exécution de la commande find. Exécutez sleep 100 en foreground, suspendez cette tache et faites continuer son exécution en background. Affichez la liste des processus en background. Affichez la liste de tous les processus. 3) Quelles sont les commandes à taper et quel est le résultat obtenu pour chacune des commandes? Exécutez sleep 100 en background, et utilisez la commande kill pour faire stopper le processus. 4) Quelle est la commande à taper? Il est possible de combiner plusieurs commandes sur une même ligne de commande en utilisant les opérateurs ;, && et. Essayez de combiner les commandes cat file (pour un fichier file qui n existe pas) et echo bonjour en utilisant chacun des 3 opérateurs. Inversez l ordre des commandes et essayez une nouvelle fois avec les 3 opérateurs. 5) Selon quelles règles les commandes sont-elles exécutées pour chacun des 3 opérateurs? 2
Les variables shell Une variable est une donnée identifiée par un nom. On accède au contenu d une variable en ajoutant $. $ var= hello world $ echo $var hello world Pour qu une variable soit visible en dehors du shell, il faut l exporter vers l environnement. export var. Exemple: la variable PAGER est utilisée par man pour déterminer comment afficher le texte. export PAGER=cat: tout s affiche à la fois. export PAGER=less: page par page. La variable PATH Variable d environnement qui donne la liste des répertoires que le shell recherche pour exécuter des commandes. Si PATH contient /bin/:/usr/bin:/usr/local/bin:. alors pour la commande cat, le shell va chercher /bin/cat, /usr/bin/cat,... Si le PATH contient., alors il cherche aussi dans le répertoire courant. On peut taper macommande au lieu de./macommande. PATH=$PATH:. Evaluation des variables Le shell substitue les valeurs des variables dans un texte avant son évaluation. Pour modifier l évaluation, on peut utiliser ou. Les guillemets : Permet de grouper des mots, supprime le remplacement des méta-caractères, sans supprimer le remplacement des variables. x=hello world world: command not found. x="hello world" est correct. y="phrase=$x"; echo $y phrase=hello world. 3
Les quotes Les quotes Groupent les mots et suppriment toute évaluation. Exemple: $ y=hello $ ls fich1 fich2 $ echo le caractère * $y le caractère fich1 fich2 hello $ echo "le caractère * $y" le caractère * hello $ echo le caractère * $y le caractère * $y Evaluation des commandes Les back-quotes ( ) permettent de substituer le résultat d une commande. $ echo the date is date the date is Tue Nov 17 15:01:44 2004 On peut stocker le résultat d une commande dans une variable. $ x= ls $ echo $x fich1 fich2 Equivalent: $ x=$(ls) Découpage des chemins Les commandes dirname et basename sont utiles pour découper un chemin en répertoire/nom de fichier. $ dirname /vers/mon/rep/fich.txt /vers/mon/rep $ basename /vers/mon/rep/fich.txt fich.txt 2 Les scripts shell Les scripts shell Un script shell est un fichier texte contenant des commandes du shell. Permet l automatisation des taches. 4
Un script simple Soit le script suivant dans le fichier simple #!/bin/bash # commentaire echo Le nombre d argument est $# echo Les arguments sont $* echo Le premier est $1 echo Le numéro du process est $$ echo Entrez un nombre: read nombre echo Le nombre entré est $nombre Pour exécuter le script, il faut rendre le fichier simple exécutable (chmod). Implémentez le script simple décrit dans le cours. Utilisez un pipe pour faire afficher par le script le nombre que vous avez entré est 5 sans que l utilisateur ne tape de nombre au clavier. 6) Quelle est la commande à utiliser? 3 Découpage des chaines Découpage des chaines Les caractères ## permettent d éliminer la plus grande chaîne en correspondance avec le motif, en partant du début. $ x= babar $ echo ${x##*ba} r $ y= hello.txt $ echo ${y##*.} txt Le caractère # élimine la plus courte. $ x= babar $ echo ${x#*ba} bar Découpage des chaînes % élimine la plus courte correspondance en partant de la fin, et %% élimine la plus longue. $ y= hello.tar.gz echo ${y%.*} hello.tar $ y= hello.tar.gz echo ${y%%.*} hello 5
Découpage des chaînes ${string:position} Extrait la sous-chaîne de string à partir de $position. $ y= bonjour echo ${y:3} jour ${string:position:length} Extrait $length caractères de la sous-chaîne de string à partir de $position. $ y= bonjour echo ${y:3:2} jo La commande cut La commande cut Permet de sélectionner certaines parties des lignes d un fichier ou de l entrée standard (si aucun fichier n est précisé). cut [-c] [-f] list [-n] [-d delim] [-s] [file] Options: -c list: spécifie les caractères à sélectionner. -c2-5 sélectionne les caractères 2 à 5 de chaque ligne. La commande cut Options: -f list: sélectionne pour chaque ligne les champs spécifiés, les champs étant délimités par un caractère délimiteur. -f1,5 sélectionne les champs 1 et 5. -d delim: spécifie le caractère délimiteur. -s: supprime les lignes sans caractère délimiteur. list: Liste de nombres séparés par une virgule, avec - pour indiquer un intervalle. 1,2,3,5 ou 1-3,5 Exemples Exemples: $ echo "hello" cut -c 2-4 ell $ echo "he ll o wo" cut -f2,3 -d ll o On souhaite écrire un script taille permettant d afficher la taille d un fichier de la façon suivante: $ ls -l monfich.c -rw-r--r-- 1 guest None 60 Oct 14 11:44 monfich.c 6
$ taille monfich.c 60 La commande cut permet de sélectionner certaines parties des lignes d un fichier ou de l entrée standard (si aucun fichier n est spécifié). Par exemple, la commande cut -c 2-5 fich sélectionne les caractères 2 à 5 de chacune des lignes du fichier fich. $ echo "hello" cut -c 2-4 ell En combinant les commandes ls -l et cut avec un pipe, on peut donc sélectionner dans le résultat de la commande ls -l les caractères correspondants à la taille du fichier. 7) Quelle est la commande à taper pour afficher seulement la taille d un fichier donné (par exemple, toto.c)? Le problème est qu il reste des espaces à éliminer avant le résultat lui-même: au lieu d avoir: $ commande 60 on voudrait avoir: $ commande 60 La commande tr -d permet d éliminer les espaces d une chaîne de caractère en entrée. $ echo "un deux trois" tr -d undeuxtrois 8) Quelle est la commande à taper (combinant ls -l, cut et tr) permettant d obtenir le résultat voulu? 9) Ecrire un script taille prenant en entrée un fichier et affichant sa taille, comme dans l exemple donné au début. 4 Exécution conditionelle Execution conditionnelle Il est possible d exécuter une suite d instruction sous une certaine condition. if [ test ] then commande-si-vrai else commande-si-faux fi Le test peut être une condition sur un fichier, ou une comparaison de chaine ou de valeur. Ne pas oublier les espaces dans if [ test ] then 7
Conditions sur les fichiers [ -s file ]: vrai si le fichier existe et est non vide. [ -f file ]: vrai si c est un fichier ordinaire. [ -d file ]: vrai si c est un répertoire. [ -r file ]: vrai si le fichier est libre en lecture. [ -w file ]: vrai si le fichier est libre en écriture. [ -x file ]: vrai si le fichier est exécutable. Exemple Afficher le contenu d un fichier s il existe. #!/bin/bash if [ -f $1 ] then cat $1 fi Créer un répertoire toto s il n existe pas déjà. #!/bin/bash if [! -d toto ] then mkdir toto fi Ecrire un script existe qui détermine si un fichier existe ou pas. $ existe toto Le fichier toto existe $ existe tata Le fichier tata n existe pas 8