Beruflich Dokumente
Kultur Dokumente
Gnralits :
Le Shell est la fois un langage de commandes (shell script) et l'interprteur de ce langage. Il assure l'interface externe entre les utilisateurs et le systme, mais ne fait pas partie du noyau. Principaux langages de commandes sont disponibles sur les systmes UNIX et GNU/Linux : csh (C-Shell), ksh (Korne-Shell), bash (Bourne Again-Shell). L'interprteur du shell a la possibilit, soit d'excuter lui mme la commande demande par l'utilisateur (commande interne), soit de lancer l'excution de programmes existant par ailleurs pour ce faire (commandes externes). A chacune des commandes externes correspond un fichier excutable ayant comme nom le nom de la commande. Ce fichier se trouve souvent dans le rpertoires /bin. L'excution d'une commande externe entrane la cration d'un nouveau processus excutant le programme correspondant la commande. Une commande externe peut tre appele partir de n'importe lequel des langages de commandes disponibles, mais aussi partir d'un programme utilisateur. Chacun des langages de commandes dispose de ses propres commandes qui sont les commandes internes.
ex : pwd /home/totoaffiche le rpertoire courant de travail echo$?vrification du code de retour 0affichage du code de retour 0 : la commande s'est excute correctement lslvi ls:vi:Aucunfichierourpertoiredecetypeaffiche le message d'erreur echo$? 1affichage du code de retour : erreur d'excution ! Dans l'exemple prcdent, la commande ls ne trouve pas le fichier correspondant l'diteur de texte vi dans le rpertoire courant (ce qui est tout fait normal !) et positionne un code de retour 1. En bash, il est possible d'obtenir la ngation d'un code de retour d'une commande en plaant ! devant celle-ci. Cela signifie que si le code de retour de la commande est gal 0, alors le code de retour de ! est gal 1 : ex : !lsfichierle code de retour de lsfichier est gal 0 fichieraffiche le fichier s'il existe echo$? 1le code de retour est gal 1 car ! est plac devant la commandels Le code de retour d'une suite de commandes est le code de retour de la dernire commande excute. Le code de retour de la suite de commandes cmd1;cmd2;cmd3 est le code de retour de la commande cmd3 : ex : pwd;lsvi;echobonjour /home/toto ls:vi:Aucunfichierourpertoiredecetype bonjour echo$? 0code de retour de echobonjour Il en est de mme pour le tube (pipeline) cmd1|cmd2|cmd3. Le code de retour sera celui de cmd3 : ex : cat/etc/passwd|grepdaemon daemon:x:2:2:daemon:/sbin:/sbin/nologin echo$? 0 code de retour de grepdaemon (*) Note : un problme qui se pose au dbutant lorsqu'il utilise le code de retour d'une commande, sous les systmes UNIX : c'est que chaque commande positionne sa manire les codes de retour diffrents de 0. Ainsi, un code de retour gal 1 positionn par la commande ls n'a pas la mme signification qu'un code de retour 1 positionn par la commande grep. Il n'existe qu'une seule solution ce problme : lire le manuel correspondant la commande.
Evaluation de commandes : bash est le shell le plus utilis avec GNU/Linux. Le shell permet de donner des instructions au systme en ligne de commande. Lorsque l'on tape une instruction, le premier mot est la commande elle-mme. Ensuite viennent les paramtres ventuels. Le shell va alors essayer de trouver quoi la commande correspond dans l'ordre suivant. Tout d'abord si la commande contient une spcification d'emplacement, le programme se trouvant dans ce rpertoire est excut s'il s'y trouve et si l'utilisateur a les droits adquats. Sinon une erreur est affiche. Ensuite bash regarde quels alias sont dfinis. Un alias est un moyen d'excuter une commande par un raccourci. Pour que par exemple le fait de taper mon_alias excute ma_commande, il faudra dclarer l'alias comme ceci : ex : aliasmon_alias='ma_commande' Les guillemets ne sont utiles que si la commande a des paramtres (c'est dire qu'elle contient des espaces). Le contenu de ma_commande sera valu selon le mme schma pour trouver le programme excuter : ex : mon_aliasparamtre1paramtre2 Tout se passe comme si ma_commande avait t tap la place de mon_alias. Il va donc aussi avoir les paramtres. Si aucun alias n'est trouv, ce sont alors les fonctions qui sont examines. Une fonction est un moyen de regrouper plusieurs commandes. Et de faire des traitements plus complexe qu'avec un alias. Une fonction (function) se dclare comme ceci : ex : functionma_fonction(){ma_commande1;ma_commande2;} Pour la dfinition de la fonction (function), on peut omettre le mot-cl fonction ou les parenthses, mais au moins un des deux doit tre prsent. Le point-virgule (;) permet de sparer les commandes et aussi de les terminer. A l'intrieur de la fonction (function), des variables positionnelles ($1, $2, ...) sont dfinies automatiquement par le shell. Elles correspondent aux paramtres passs la fonction : ex : functionmon_affichage{echo"SAIT:$1";} mon_affichageBonjourappel de la fonction SAIT:Bonjouraffichage du rsultat Dans le cas o aucune fonction correspondant n'existe, le shell consulte ses commandes intgres (shell builtin commands). Avec bash, on peut citer comme exemple de commandes intgres cd (pour changer le rpertoire courant) ou echo vu prcdemment. Enfin le shell parcourt les rpertoires contenus dans la variable d'environnement $PATH pour y chercher un programme du nom tap. Si celui-ci est trouv, il est excut, sinon une erreur est affiche : ex : echo$PATH /home/toto/bin:/usr/local/bin:/usr/bin:/bin
Si deux programmes avec le mme nom se situent dans /usr/local/bin et /bin, c'est le premier qui sera excut. En rsum voici l'ordre d'valuation si la commande est excute sans spcification de chemin : alias, fonction, commandes intgres, excutables dans un des rpertoires de $PATH. Si tout cela choue, un message d'erreur sera affich. La commande type permet de savoir quelle catgorie appartient une commande. Dans les deux premiers cas, on a la correspondance de l'alias ou de la fonction (function). Les commandes intgres sont indiques par un texte gnrique et pour le dernier cas, le chemin de l'excutable est affich. Lorsque l'on excute une commande, bashcre un sous-shell pour le lancer. C'est--dire que cela se passe comme si on avait lanc une nouvelle fois bash. Pour modifier ce comportement, on peut placer un point (.) en dbut de ligne. Cela provoquera alors l'excution dans le shell courant : ex : .ma_commandeexcute la commande (ne pas oublier l'espace entre le point et la commande) Historique des commandes : bash conserve les dernires commandes tapes afin de pouvoir facilement les retrouver. Elles sont sauvegardes en mmoire pour le shell courant si plusieurs sont lancs. Et lorsque celui-ci est quitt, elles sont crites dans le fichier .bash_history qui se trouve la racine du rpertoire personnel de l'utilisateur (~). Ce fichier est celui par dfaut, son nom peut tre chang par la variable d'environnement $HISTFILE. Le nombre de prcdentes commandes sauvegardes en mmoire est dfini par la variable $HISTSIZE (par dfaut 1000) et le nombre devant tre sauvegardes dans le fichier par la variable $HISTFILESIZE (galement 1000 par dfaut). Les commandes sont sauvegardes avant la substitution ventuelle faite (si des caractres *, ? ou []sont prsents). Pour parcourir l'historique, il suffit d'utiliser les touches flches ( gauche du pav numrique). La flche vers le haut permet de parcourir les commandes dans l'ordre inverse de leur excution et la flche vers le bas dans l'autre sens. Peuvent galement tre utilises respectivement les combinaisons [CtrlP] (previous) et [CtrlN] (next). Pour les habitus de l'diteur de texte Emacs, ce sont les combinaisons de touches de ce logiciel qui peuvent tre utilises pour diter les commandes entres. De mme que dans cet diteur, on peut rechercher parmi les commandes prcdentes. Pour cela il suffit de de maintenir les touches [CtrlR]. Apparat alors une invite permettant la recherche de la forme suivante : ex : (reverseisearch)`': Qui remplace alors l'invite de commande habituelle. La recherche se fait de manire incrmentale. C'est dire qu'au fur et mesure que l'on tape des caractres, la plus rcente ligne de l'historique trouve sera affiche. Pour interrompre la recherche, on peut appuyer simutanment [CtrlG] ou une des touches flches (gauche et droite permettant alors de l'diter). La touche [Enter] permet d'excuter la commande affiche.
Condition simple :
ex : ifgrep$1/etc/profile>/dev/null2>&1;then
expression/condition entre crochets if[expression_condition]then action fi ex : if[$#=0];then echoErreur:Appel:$0Critre>&2 fi ifgrep$1/etc/profile;then echo$1trouv fi action est une suite de commandes quelconques. L'indentation (4 espaces) n'est pas obligatoire mais trs fortement recommande pour la lisibilit du code. On peut aussi utiliser la forme complte : Condition avec alternative : suite de commandes ifsuite_commandesthen commandes else commandes fi ex : ifgrepPATH/etc/profile;then echoCheminabsolu(recherchePATHexcutiondecommande):$PATH else echoAucunchemin fi
avec expression/condition entre crochets if[expression_condition]then action else action fi ex : if[$#=0];then echo"Erreur:Appel:$0Critre:aucun:Nombre:$#">&2 exit1 else echo"Succs:Appel:$0Critre:$1:Nombre:$#" exit0 fi Condition multiple :
avec expression/condition entre crochets ex : if[expression1_condition1];then action1 elif[expression2_condition2];then action2 else[expression3_condition3] action3 fi En vous inspirant du modle de la condition multipe ci-dessus simplifiez le script shell ci-dessous : #!/bin/bash if[$#=0] then echo"Erreur:Appel:$0Critre:aucun">&2 exit1 else ifgrep"$1"$2>/dev/null2>&1 then echo"$1trouvdans$2" else echo"$1nontrouv" fi exit0 fi
Oprateurs de comparaison : Le shell tant souvent utilis pour manipuler des fichiers, il offre plusieurs oprateurs permettant de vrifier diverses conditions sur ceux-ci : existence, dates, droits. D'autres oprateurs permettent de tester des valeurs, chanes ou numriques. Ci-dessous un aperu des principaux oprateurs : Oprateurs sur les fichiers : enom_fichier vrai si nom_fichier existe ex : [e/etc/shadow] dnom_fichiervrai si nom_fichier est un rpertoire ex : [d/tmp/trash] fnom_fichiervrai si nom_fichier est un fichier ordinaire ex : [f/tmp/glop] Lnom_fichiervrai si nom_fichier est un lien symbolique ex : [L/home] rnom_fichiervrai si nom_fichier est lisible (r) ex:[r/boot/vmlinuz] wnom_fichiervrai si nom_fichier est modifiable (w) ex : [w/var/log] xnom_fichiervrai si nom_fichier est excutable (x) ex : [x/sbin/halt] fichier1ntfichier2vrai si fichier1 plus rcent que fichier1 ex : [/tmp/foont/tmp/bar] fichier1ofichier2vrai si fichier1 plus ancien que fichier2 ex : [/tmp/fooot/tmp/bar] Oprateurs sur les chanes : zchainevrai si la chaineest vide ex : [z"$VAR"] nchainevrai si la chaine est non vide ex : [n"$VAR"] chaine1=chaine2vrai si les deux chanes sont gales ex : ["$VAR"="toto"] chaine1!=chaine2vrai si les deux chanes sont diffrentes ex : ["$VAR"!="titi"]
Oprateurs de comparaison numrique : num1eqnum2galit ex : [$nombreeq37] num1nenum2ingalit ex : [$nombrene37] num1ltnum2infrieur (<) ex : [$nombrelt37] num1lenum2infrieur ou gal (<=) ex : [$nombrele37] num1gtnum2suprieur (>) ex : [$nombregt37] num1genum2suprieur ou gal (>=) ex : [$nombrege37] Expressions arithmtiques : On peut facilement valuer des expressions arithmtiques avec bash. Pour cela, on utilise la notation $(()) qui sera remplace par le rsultat du calcul mathmatique. Voici les oprations pouvant tre utilises par ordre de priorit inverse (extrait de la page de manuel de bash) : +plus et moins unaire !~ngations logique et binaire */%multiplication, division, reste +addition, soustraction <<>>dcalage arithmtique gauche et droite <=>=<>comparaisons ==!=galit et diffrence &ET binaire, ^OU exclusif binaire, |OU binaire, &&ET logique, ||OU logique =*=/=%=+==<<=>>=&=^=|=assignations bash effectuera le remplacement par la valeur avant l'excution des commandes ventuelles. La commande suivante est une erreur : ex : $((variable=3+2)) bash:5:commandnotfoundla variable contiendra bien la valeur 5 la suite de cette action. Mais bash a remplac l'expression par sa valeur, donc tout se passe comme si on avait uniquement saisi 5 l'invite (qui se trouve tre un programme inconnu). Une autre notation est possible en mettant $[] autour de l'expression la place de $(()).