10.07.2015 Views

Le Shell: les tubes, les filtres, écriture de scripts

Le Shell: les tubes, les filtres, écriture de scripts

Le Shell: les tubes, les filtres, écriture de scripts

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Formation Unix/Linux (5)<strong>Le</strong> <strong>Shell</strong>: <strong>les</strong> <strong>tubes</strong>, <strong>les</strong> <strong>filtres</strong>, écriture <strong>de</strong> <strong>scripts</strong>Olivier BOEBIONMars 20041 Définition1.1 <strong>Le</strong>s <strong>tubes</strong><strong>Le</strong> symbole |, appelé encore ”tube” ou ”pipe”, est utilisé pour relier 2 comman<strong>de</strong>s entre el<strong>les</strong>.La sortie standard <strong>de</strong> la comman<strong>de</strong> à gauche du symbole sera utilisée comme entrée standard<strong>de</strong> la comman<strong>de</strong> <strong>de</strong> droite comme le montre la figure 1.Fig. 1 – Utilisation <strong>de</strong>s <strong>tubes</strong><strong>Le</strong>s redirections d’entrée/sortie semblent similaires à l’emploi <strong>de</strong>s <strong>tubes</strong>. Pourtant, une différenced’importance existe. <strong>Le</strong>s redirections créent un canal <strong>de</strong> communication entre un fichieret un processus alors qu’un tube crée ce canal entre <strong>de</strong>ux processus.1.2 <strong>Le</strong>s <strong>filtres</strong>Certains processus peuvent utiliser à la fois l’entrée STDIN et <strong>les</strong> sorties STDOUT etSTDERR. Un processus qui lit <strong>de</strong>s données sur l’entrée standard et produit <strong>de</strong>s données surla sortie standard est appelé filtre. Vous connaissez le programme more qui permet d’afficherle contenu d’un fichier page par page. Cette comman<strong>de</strong> est un filtre et vous pourrez l’utilisercomme une simple comman<strong>de</strong> ou l’associer à d’autres comman<strong>de</strong>s en utilisant un tube. Deuxexemp<strong>les</strong> <strong>de</strong> l’emploi <strong>de</strong> more vous sont donnés dans le tableau 1Comman<strong>de</strong>Action$ more .profile utilisation <strong>de</strong> more comme une comman<strong>de</strong> simple$ cat .profile | more le résultat <strong>de</strong> la comman<strong>de</strong> cat est dirigé dans lacomman<strong>de</strong> more qui l’affiche à l’écran page parpage.Tab. 1 – Exemp<strong>les</strong> d’utilisation <strong>de</strong> more1


2 <strong>les</strong> comman<strong>de</strong>s <strong>filtres</strong> courants2.1 La comman<strong>de</strong> sortLa comman<strong>de</strong> sort permet d’effectuer <strong>de</strong>s tris sur <strong>de</strong>s lignes <strong>de</strong> texte dans l’ordre numérique(-n), lexicographique (par défaut) ou selon le dictionnaire (-d). <strong>Le</strong>s champs sont délimités pardéfaut par le caractère <strong>de</strong> tabulation mais il est possible <strong>de</strong> spécifier un autre caractère avecl’option ”-t”. Il est également possible <strong>de</strong> trier sur un champs particulier avec l’emploi <strong>de</strong> l’option-k. L’option ”-r” permet d’inverser l’ordre <strong>de</strong> tri. <strong>Le</strong> tableau 2 donnent quelques exemp<strong>les</strong>.Comman<strong>de</strong>Action$ sort -n < /etc/passwd tri le fichier /etc/passwd par ordre numérique$ sort -nt : -k 3 < /etc/passwd tri le fichier passwd par ordre numérique sur le3ème champ avec : comme délimiteur <strong>de</strong> champs$ sort -nrt : -k 3 < /etc/passwd même type <strong>de</strong> tri en présentant <strong>les</strong> résultats inversésTab. 2 – Exemp<strong>les</strong> d’utilisation <strong>de</strong> sort2.2 La comman<strong>de</strong> grepLa comman<strong>de</strong> grep permet la recherche dans <strong>de</strong>s fichiers d’une expression particulière. <strong>Le</strong>soptions basiques sont -n qui permet d’afficher <strong>les</strong> numéros <strong>de</strong> ligne, -i qui permet <strong>de</strong> ne pas tenircompte <strong>de</strong>s majuscu<strong>les</strong> et minuscu<strong>les</strong> et -v qui affiche <strong>les</strong> lignes ne contenant pas l’expression.Comman<strong>de</strong>Action$ grep -i ”home” < /etc/passwd affiche <strong>les</strong> lignes contenant home sans tenir compte<strong>de</strong>s majuscu<strong>les</strong> et minuscu<strong>les</strong>$ grep -v ”home” < /etc/passwd affiche <strong>les</strong> lignes ne contenant pas homeTab. 3 – Exemp<strong>les</strong> d’utilisation <strong>de</strong> grep2.3 La comman<strong>de</strong> wcLa comman<strong>de</strong> wc permet <strong>de</strong> compter le nombre <strong>de</strong> lignes, <strong>de</strong> mots et <strong>de</strong> caractères dans unfichier. Parmi <strong>les</strong> options, il y a -l qui affiche le nombre <strong>de</strong> lignes, -w qui affiche le nombre <strong>de</strong> motset -c qui affiche le nombre <strong>de</strong> caractères. <strong>Le</strong> tableau 4 vous donne <strong>de</strong>ux exemp<strong>les</strong> d’utilisation<strong>de</strong> cette comman<strong>de</strong>.Comman<strong>de</strong>Action$ wc -l < /etc/passwd compte le nombre <strong>de</strong> lignes dans /etc/passwd$ wc -c < /etc/passwd compte le nombre <strong>de</strong> caractère dans /etc/passwdTab. 4 – Exemp<strong>les</strong> d’utilisation <strong>de</strong> wc2


2.4 La comman<strong>de</strong> cutCette comman<strong>de</strong> extrait <strong>de</strong>s colonnes (option -c) ou <strong>de</strong>s champs (option -f) <strong>de</strong>s lignes d’unfichier ou <strong>de</strong> l’entrée standard. Dans le cas <strong>de</strong> l’option -f, il est possible <strong>de</strong> lui spécifier ledélimiteur à chercher en utilisant l’option -d. <strong>Le</strong> délimiteur par défaut est la tabulation. Quelquesexemp<strong>les</strong> figurent dans le tableau 5.Comman<strong>de</strong>Action$ cut -f3,7 -d : /etc/passwd filtre <strong>les</strong> champs 3 et 7 <strong>de</strong> chaque ligne <strong>de</strong> passw<strong>de</strong>n considérant le caractère : comme délimiteur$ date | cut -c1-3 filtre <strong>les</strong> caractères 1 à 3Tab. 5 – Exemp<strong>les</strong> d’utilisation <strong>de</strong> cut2.5 La comman<strong>de</strong> headCette comman<strong>de</strong> permet d’éditer le début d’un fichier (ou <strong>de</strong> l’entrée standard) en spécifiantle nombre <strong>de</strong> lignes (option -n) ou le nombre <strong>de</strong> caractères (option -c) souhaités.Comman<strong>de</strong>Action$ head -c 1000 /etc/passwd édite à l’écran <strong>les</strong> 1000 premiers caractères du fichier$ head -n 10 /etc/passwd édite <strong>les</strong> 10 premières lignes du fichierTab. 6 – Exemp<strong>les</strong> d’utilisation <strong>de</strong> head2.6 La comman<strong>de</strong> tailCette comman<strong>de</strong> permet <strong>de</strong> donner la fin d’un fichier ou <strong>de</strong> l’entrée standart. Comme avecla comman<strong>de</strong> head, il est possible <strong>de</strong> spécifier un nombre <strong>de</strong> caractères (option -c) ou <strong>de</strong> lignes(option -n). Il est aussi possible <strong>de</strong> donner un nombre <strong>de</strong> blocs (512 octets) avec l’option -b.Comman<strong>de</strong>Action$ tail -c 15 /etc/passwd édite <strong>les</strong> 15 <strong>de</strong>rniers caractères <strong>de</strong> /etc/passwd$ tail -n 5 /etc/passwd édite <strong>les</strong> 5 <strong>de</strong>rnières lignes <strong>de</strong> /etc/passwd$ tail +5 -n /etc/passwd édite la fin <strong>de</strong> /etc/passwd à partir <strong>de</strong> la 5ème ligneTab. 7 – Exemp<strong>les</strong> d’utilisation <strong>de</strong> tail3


2.7 La comman<strong>de</strong> trCette comman<strong>de</strong> permet <strong>de</strong> substituer ou <strong>de</strong> supprimer <strong>de</strong>s éléments pris dans l’entrée standard.Deux chaînes <strong>de</strong> caractères sont données en argument et précisent <strong>les</strong> substitutions ou<strong>les</strong> suppressions à effectuer. La première chaîne <strong>de</strong> caractères concerne <strong>les</strong> caractères recherchésalors que la secon<strong>de</strong> donne <strong>les</strong> éléments qui viendront en remplacement.Trois options sont principalement utilisées. Pour <strong>les</strong> substitutions, l’option -c inverse la recherchealors que l’option -s indique qu’une seule occurence sera traitée. La suppression estactivée par l’option -d.Comman<strong>de</strong>Action$ cat /etc/passwd | tr : ”\t” remplace <strong>les</strong> caractères : par une tabulation$ cat /etc/passwd | tr -d [A-Z] supprime tous <strong>les</strong> caractères majuscule <strong>de</strong> A à Z$ last | tr [:lower:] [:upper:] remplace toutes <strong>les</strong> minuscu<strong>les</strong> par <strong>de</strong>s majuscu<strong>les</strong>Tab. 8 – Exemp<strong>les</strong> d’utilisation <strong>de</strong> tr2.8 La comman<strong>de</strong> teeLa comman<strong>de</strong> tee permet une dérivation à l’intérieur d’un tube vers un fichier. Par exemple,si vous souhaitez obtenir un fichier ”f1” contenant la liste <strong>de</strong> votre répertoire et un autre fichier”f2” contenant cette même liste triée, vous taperez :ls | tee f1 | sort > f2La sortie <strong>de</strong> la comman<strong>de</strong> ls sera copiée dans f1 et dirigée dans la comman<strong>de</strong> sort. L’option-a permet d’écrire dans le fichier en concaténant (mo<strong>de</strong> append).4


3 <strong>Le</strong>s <strong>scripts</strong> shell3.1 IntroductionDans <strong>les</strong> précé<strong>de</strong>nts travaux pratiques, <strong>les</strong> différentes comman<strong>de</strong>s ont été exécutées sur laligne <strong>de</strong> comman<strong>de</strong>. Il est possible <strong>de</strong> créer <strong>de</strong>s fichiers contenant un ensemble d’instructions et<strong>de</strong> réaliser ainsi <strong>de</strong> véritab<strong>les</strong> programmes : <strong>les</strong> <strong>scripts</strong> shell.3.2 Co<strong>de</strong> retour d’un shell<strong>Le</strong> co<strong>de</strong> retour d’un shell est généré par la comman<strong>de</strong> exit suivi <strong>de</strong> la valeur <strong>de</strong> retour. Cettevaleur peut ensuite être visualisée dans le shell par la variable $ ?.3.3 Passage d’argumentsUn script shell peut prendre <strong>de</strong>s arguments sur sa ligne <strong>de</strong> comman<strong>de</strong>. Ces paramètres sontaccessib<strong>les</strong> par <strong>de</strong>s variab<strong>les</strong> internes : la variable $0 représente le nom <strong>de</strong> votre script, $1 lepremier argument, $2 le second... La comman<strong>de</strong> shift permet <strong>de</strong> décaler la numérotation <strong>de</strong> cesvariab<strong>les</strong>. <strong>Le</strong> nombre <strong>de</strong>s paramètres peut être obtenu grâce à $# alors que $* permet d’obtenirl’ensemble <strong>de</strong>s paramètres.3.4 <strong>Le</strong>s fonctionsAfin <strong>de</strong> pouvoir réutiliser le co<strong>de</strong> dans vos script shell, il est possible <strong>de</strong> définir <strong>de</strong>s fonctions.Cel<strong>les</strong>-ci <strong>de</strong> définissent grâce au mot réservé function :oufunction nom_fonction {comman<strong>de</strong>;}nom_fonction() {comman<strong>de</strong>;}Une fonction traite <strong>de</strong>s arguments en respectant <strong>les</strong> mêmes principes que le passage <strong>de</strong>paramètres d’un script shell. <strong>Le</strong> co<strong>de</strong> retour d’une fonction est retourné par le mot clef returnsuivi <strong>de</strong> la valeur retournée.5


ExercicesUtilisation <strong>de</strong>s arguments <strong>de</strong> la lignes <strong>de</strong> comman<strong>de</strong>Créez un script shell qui vous affiche <strong>les</strong> informations sur la ligne <strong>de</strong> comman<strong>de</strong>. <strong>Le</strong> programmeaffichera ce qui suit :$ ./exo1 arg1 22 3################################################Information sur la ligne <strong>de</strong> comman<strong>de</strong>La ligne <strong>de</strong> comman<strong>de</strong> comporte 3 paramètresExecution <strong>de</strong> la comman<strong>de</strong>: ./exo1Avec <strong>les</strong> paramètres: arg1 22 3################################################Informations sur la connexion d’un utilisateurComplétez le script précé<strong>de</strong>nt afin qu’il prenne votre nom <strong>de</strong> login en paramètre et qu’ilaffiche grâce à 2 fonctions :– le nombre <strong>de</strong> vos connexion sur le système ;– <strong>les</strong> dates <strong>de</strong>s 3 <strong>de</strong>rnières connexions.L’affichage généré sera le suivant :################################################Information sur la ligne <strong>de</strong> comman<strong>de</strong>La ligne <strong>de</strong> comman<strong>de</strong> comporte 1 paramètresExecution <strong>de</strong> la comman<strong>de</strong>: ./exo1Avec <strong>les</strong> paramètres: boebion################################################L’utilisateur boebion s’est connecté 100 fois sur moogli.<strong>de</strong>ss.univ-tours.frCes 3 <strong>de</strong>rnieres connexions ont été aux dates suivantes:Sun Nov 25 18:17Sun Nov 25 17:25Sun Nov 25 14:32Vous obtiendrez <strong>les</strong> informations sur <strong>les</strong> connexions grâce aux comman<strong>de</strong>s last et hostname.6

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!