Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Shell Bash
-1-
Shell Bash
Dfinition
Le Shell est ce que lon appel un Interprteur de commandes . Il date de lpoque d UNIX, o le seul moyen de communiquer avec sa machine tait dcrire des lignes textes au clavier, dans un langage comprhensible la fois par lhumain et la machine. Le rle de la machine tant d'excuter les commandes de lutilisateur et dafficher le rsultat lcran. Le shell c'est un programme qui se trouve dans le rpertoire /bin. Par dfinition, il doit tre lger et rapide, et reste un service daccs privilgi aux Noyau Linux (Kernel) pour l'excution de primitives systme. Depuis, cette interface avec la machine a perdure car elle est rapide et fiable pour lutilisateur qui la maitrise. Le shell a volue aux travers des annes, plusieurs types de Shell existent : - le /bin/sh shell Bourne - le /bin/bash shell Bourne Again SHell - le /bin/csh C shell - le /bin/ksh Korn shell - le /bin/tcsh C shell amlior mais le principe de base et toujours rest le mme : Les shells sont des interprteurs, ils lisent chaque commande saisie par lutilisateur (ou lue partir dun fichier), vrifient et traitent la syntaxe pour lexcuter. Ici, nous utiliserons le Shell Bash, lun des plus couramment utilis sur les systmes GNU/Linux. Bash est un logiciel libre publi sous GNU GPL.
-2-
Shell Bash
Rappels
Avant de lancer un shell, je pense quil est ncessaire de rappeler quelques bases bien utiles. Le shell permet avant tout d'excuter des commandes, d'explorer l'arborescence du systme, de crer, d'diter et de supprimer des fichiers, etc. Au travers du Shell, vous touchez donc des parties trs importantes et sensibles de votre systme dexploitation, et excuter des commandes que lon ne comprend pas peut vraiment avoir des consquences catastrophiques sur ce dernier ! raison de plus pour faire quelques rappels et dtre laise avec ces commandes. La recommandation principale dans lutilisation du shell est la prudence ! executer des commandes en root ne doit seffectuer que pour des tches bien specifiques dadministration que lutilisateur maitrise parafaitement. Les commandes effectues dans ce cours peuvent seffectuer avec un simple compte utilisateur, pas besoin dtre en root !
/dev : C'est ici que les priphriques (rels et virtuels) sont accessibles (partitions, disques, cartes son, ports SCSI, ports USB, etc.), mais en mode "donnes brutes". Il est souvent ncessaire d'utiliser des programmes pour interprter ces contenus (par exemple, en montant la partition /dev/hda1 dans /mnt/hda1 pour accder aux fichiers). /mnt : C'est en gnral cet endroit qu'on accde aux autres systmes de fichiers (autres partitions, CD/DVD, cls USB, serveurs de fichiers...) /etc(*) : Ici sont regroups tous les fichiers de configurations des diffrents logiciels installs sur la machine ainsi que des fichiers de configuration systme utiliss au dmarrage de la machine. /media : Certaines distributions montent les priphriques amovibles cet endroit. /var : Fichiers dont le contenu varie o /var/log : On trouve ici les logs des diffrents logiciels et serveurs. Cela permet de voir ce qui s'est pass quand quelque chose ne va pas. o /var/spool : Fichiers en cours de traitement (file d'impression, mails en cours d'envoie...) o /var/tmp : Fichiers temporaires (voir aussi /tmp). /home : Chaque utilisateur possde son propre rpertoire pour y stocker ses fichiers personnels et la configuration des programmes. /usr(*) : Rpertoire contenant les fichiers du systme partageables en rseau et en lecture seule.
-3-
Shell Bash
/opt : Rpertoire contenant les applications complmentaires (dites : add-on) nappartenant pas la distribution installe. /tmp : Sont stocks ici les fichiers temporaires (fichiers crs pendant le fonctionnement des logiciels et supprims la fin). (Voir aussi /var/tmp) /boot(*) : Sont stocks ici les fichiers de dmarrage du systme (noyau du systme, etc.). On y trouve aussi certains fichiers de configuration (GRUB...) /lib(*) : Ce sont des bibliothques utilises par divers programme (C'est l'quivalent des DLL Windows). Par exemple, libjpeg.so permet tous les programme de lire et crire des fichiers JPEG. /sbin(*) : Ce rpertoire contient les programmes systmes et les outils d'administration (par exemple les outils permettant de formater un disque). /bin(*) : Ici sont situs les programmes utiliss la fois par les utilisateurs et les administrateurs. Ensemble de fichiers excutables reprsentant les commandes.
utiliser le menu du bureau (Gnome, Kde, etc.). Il s'agit de la mthode conseille. utiliser le menu lancer une application. Dans la fentre ainsi ouverte, taper le nom de terminal et valider. La fentre lancer une application peut tre ouverte avec Alt+F2 Utiliser les consoles virtuelles (il y en a 6).
La console virtuelle
La console virtuelle (tty1 tty6) est un cran noir o une invite de commande apparat, de la forme login : Depuis l'interface graphique, il est possible de se connecter une console virtuelle en utilisant la combinaison de touches Ctrl+Alt+FN, o N est un chiffre de 1 6. Pour revenir au mode graphique depuis une console virtuelle, utiliser la combinaison de touches ALT+F7.
-4-
Shell Bash
Les utilisateurs
Linux a t pens ds lorigine comme tant scuris, multi-tche et donc multi-utilisateurs (gestion de droits multiples). Rappelez-vous qu une certaine poque, les premiers utilisateurs ne disposaient que dun seul ordinateur sur lequel chacun se partageait des ressources (temps processeur, espace disque, mmoire, etc). Les utilisateurs se connectaient alors via des terminaux (cran, clavier, mme pas de souris !) pour accder lordinateur central distance via un proto-reseau (au dbut, une simple liaison srie suffisait !), do lintert dauthentifier chaque utilisateur et processus qui sy executait. Cest pourquoi lorsquun utilisateur veut utiliser le systme sous GNU/Linux, la premire tape est tout dabord de sauthentifier auprs du systme, se dernier lui attribuant les droits, des espaces propres qui lui ont t prdefinis et attribus lors de la configuration du systme : administrateur, utilisateurs, invit.
le mot de passe n'est pas affich l'cran pour des raisons de scurit. Le fait de ne pas voir l'cran ce que vous tapez, ne doit pas vous inquiter. Si le mot de passe est valide, une invite de commande comme suite doit s'afficher, indiquant que la connexion a russie.
-5-
Shell Bash
Suite la connexion, l'invite de commande (ou prompt) du shell apparat et a en gnral la forme suivante : utilisateur@machine ~ $
utilisateur - reprsente l'identifiant ou le nom de l'utilisateur connect machine- reprsente le nom de la machine sur laquelle l'utilisateur est connect ~ est un raccourci qui signifie le rpertoire personnel /home/utilisateur $ signifie que vous tes connect en tant qu'utilisateur
utilisateur@machine ~ # Si au lieu de $ le signe # apparat, alors vous tes connect en tant que superutilisateur (root). Gardez l'sprit que les systmes GNU/Linux utilisent par convention # pour root et $ pour un utilisateur autre que root. Ce comportement peut tre chang en modifiant la variable d'environnement PS1, mais cela est vivement dconseill! Rappel : root tous les droits, celui aussi de casser votre systme lors de lexecution dune commande hazardeuse pensez donc rester le maximum avec vos droits utilisateur, la simple commande exit devrait vous permettre de vous reloguer sous votre utilisateur.
Changer didentit
Depuis votre shell vous avez la possibilit de prendre l'identit d'un autre utilisateur existant sur votre systme, y compris l'utilisateur "root" (utilisateur qui dispose de tous les privilges). Pour faire cela vous avez votre disposition la commande su ou su Regarder utiliser la commande su pour plus de dtails.
-6-
Shell Bash
Excution asynchrone :
$ commande1 & commande2
Nous tudierons plus en dtails lutilisation de caractre & dans la partie Pipeline et paralllisme du cours.
-7-
Shell Bash
mv : dplacer, renommer un fichier ps : affiche les processus en cours d'excution pwd : Print name of current/working directory - affiche le chemin complet du repertoire courant rm : suppression de fichiers rmdir : Remove empty directories - suppression d'un dossier vide tail : affiche les 10 dernires lignes d'un fichier tar : cration d'archives su : Substitute User identity ou Switch User - prendre l'identit d'un utilisateur uname : Affiche des informations sur le systme. useradd : ajouter un utilisateur whereis : localiser une commande (quivalent which).
En rgle gnrale dans la partie SEE ALSO d'une page de "man", vous trouverez la liste des commandes qu'il est conseill de consulter ayant un rapport direct avec la commande dont vous lisez le manuel. Regardez la partie SEE ALSO et vous remarquerez les pages qui sont conseilles de consulter. Cela veut dire qu'on peut taper :
$ man 5 crontab $ man 8 cron
la touche "q" pour quitter la page man et revenir l'invite de commande (prompt) Pour obtenir la description succincte d'une commande, on va utiliser l'option "-f" man -f commande whatis commande Pour connatre les rubriques qui contiennent dans leur prsentation un mot cl, l'option "-k" : man -k commande
-8-
Shell Bash
HOME contient le rpertoire d'utilisateur USER contient le login d'utilisateur PWD contient le rpertoire courant SHELL contient le nom du shell de connexion PATH contient la liste des rpertoires o se trouvent les commandes que l'utilisateur peut excuter HOSTNAME contient le nom de la machine HISTSIZE contient la taille maximale des commandes excutes contenues dans le fichier historique PS1 contient les paramtres d'affichage de l'invite de commande du shell PS2 contient le prompt
Variables locales
Ici, nous allons juste voire comment bash peut se transfromer en petite calculatrice ou executer de petites commandes trs simples. Cela nous donnera un aperu de ce quest une variable locale et louverture que cela propose lorsque nous tudierons les scripts .
-9-
Shell Bash
Ici, nous effectuerons juste un affichage Hello world et laddition de 2 variables A et B : Exemples: Pour faire afficher au terminal sur lcran la chane Hello world au travers dune variable locale :
$ var=Hello world $ echo bonjour, $var
Maintenant le calcul de A + B :
$ A=1 ;B=2 $ echo $A+$B
ne donne pas ce quoi lon sattend normalement, bash traite les valeurs des variables comme des chanes de caractres. On peut effectuer des calculs sur des nombres entiers, en utilisant la syntaxe $(( ... )) pour dlimiter les expressions arithmtiques:
$ echo $(($A+$B))
- 10 -
Shell Bash
De la navigation lutilisation
Naviguer dans larborescence du systme de fichiers
Dans les systmes de la famille Unix, la racine reprsente le sommet de l'arborescence des rpertoires Elle est reprsente par le caractre / (slash) et signifie "root" (racine en franais). Tous les rpertoires de votre systme sont lis la racine de faon directe ou indirecte. Concernant les syntaxes utiliser pour naviguer dans larborescence du systme de fichiers : O suis-je ? Une chose trs importante savoir quand on est connect dans un shell, c'est de savoir o lon se trouve dans l'arborescence : La commande pwd (PrintWorkingDirectory) affiche votre localisation dans l'arborescence.
$ pwd
Le chemin absolu Le chemin absolu reprsente l'arborescence complte de fichiers, en partant de la racine Exemple : Le fichier b.txt se trouve dans /home/user/doc/text Vous vous trouvez dans /home/user/ascii Le chemin absolu vers b.txt est donc /home/user/doc/text/b.txt Quelque soit votre localisation dans l'arborescence l'utilisation du chemin absolu est le moyen le plus sr pour accder au fichier dsir. Le chemin relatif Le chemin relatif correspond laccs un fichier dans l'arborescence rapport votre localisation dans le shell. On utilise les notations . et/ou .. . nous permet de descendre dans l'arborescence du rpertoire courant : indique le rpertoire courant. .. nous permet dans un 1er temps de monter en arborescence dans le but d'atteindre d'autres rpertoires : indique le rpertoire parent.
$ cd ..
Se deplacer dans laborescence La navigation dans larborescence revient donc utiliser les commandes vues ci-dessus. Mais lcriture des chemins absolus peut tre fastidieux et souvent des erreurs se glissent dans la syntaxe, cest l que la compltion de commande nous vient en aide.
- 11 -
Shell Bash
Compltion de commandes
Tapez une commande dans un terminal ou ne serait-ce que de se rappeler de sa syntaxe n'est pas une chose toujours facile. Malgr a, il existe une touche trs pratique sous le shell qui vous permet la compltion des commandes . Supposons que jai a taper /usr/bin/tail La compltion s'obtient en utilisant la touche TAB Pour a on va commencer avec le 1er caractre...
Je tape /u et j'appuie sur TAB o Le shell va complter et il va crire /usr/ o A ce moment j'ajoute un b donc je suis avec /usr/b o J'appuie de nouveau sur TAB et j'aurai /usr/bin/ o A ce moment j'ajoute ta, donc j'aurai /usr/bin/ta o J'appuie 2 fois sur TAB Le shell sur mon systme trouve 4 correspondances tac tack tail tasksel Je vais continuer et je vais ajouter un i donc j'aurai /usr/bin/tai J'appuie de nouveau sur TAB et j'obtiens /usr/bin/tail
Ainsi, la compltion nous permet de faire des conomies en ce qui concerne l'criture de la commande et dans le mme temps la sret de la syntaxe. Donc utiliser sans modration.
n - l'option n permet d'afficher les n dernires commandes (facultatif) less - la commande "less" vous permet de naviguer dans l'historique o les flches haut et bas vous permettent de naviguer dans l'historique o !n - permet d'excuter la commande correspondant au numro "n" dans la liste sans avoir la retaper
- 12 -
Shell Bash
- 13 -
Shell Bash
Exemples:
- 14 -
Shell Bash
- envoyer le contenu de fichier1 dans le fichier2. Si le fichier2 existe son contenu d'origine sera supprim, le fichier2 est cr s'il n'existe pas
$ cat fichier1 > fichier2
- envoyer le contenu de fichier1 dans le fichier2 - mode ajout si le fichier2 existe, le contenu du fichier1 est ajout la fin de fichier2, si le fichier2 n'existe pas, il sera cr
$ cat fichier1 >> fichier2
- Recherche dans la racine le fichier appel fichier.txt, les erreurs au lieu d'tre envoyes sur STDERR ( l'cran) sont envoyes dans /dev/null (sorte de poubelle sans fin)
$ find / -name fichier.txt 2>/dev/null
- Recherche dans la racine le fichier appell fichier.txt, les erreurs au lieu d'tre envoyes sur STDERR ( l'cran) sont envoyes dans le fichiers erreur.txt
$ find / -name fichier.txt 2>erreurs.txt
Pipeline et paralllisme
Donc en plus des redirection, il existe aussi les commandes pipes ou pipe (tune en anglais), enchanes par un | et des commandes executes en parallle &. Le shell cre les processus associs chaque commande, et dtourne la sortie du premier sur l'entre du second. commande1 | commande2 - le rsultat de la commande1 est utilis par la commande2 commande1 & commande2 - les commandes sont excutes simultanment, commande1 s'excutant en arrire-plan commande1 && commande2 - si la commande1 russi la commande2 est execute commande1 || commande2 - la commande2 s'excute seulement si la commande1 choue commande1;commande2 - les commandes sont excutes dans l'ordre Le pipe : Par exemple, wc est une commande qui calcule le nombre d'octets, de mots, de lignes de son
$ cat *.pas | wc -l
Sans le savoir, cat affiche le contenu sur stdout, mais pas l'cran, sur le stdin de wc. Sans le savoir, wc lit son stdin et cumule les retours la lignes \n. Il affiche alors sur stdout le rsultat, qui est le nombre de ligne de tous les fichiers .pas d'un rpertoire. C'est simple, et pas facile faire dans d'autres environnements. Le paralllisme et la dpendance : On peut lancer une commande en parallle pendant que la principale continue son execution : Document sous licence CC (Crative Commons) - 15 -
Shell Bash
La commande2 s'excute ssi le code de sortie de commande1 vaut 0. De mme commande3 s'excute ssi le code de sortie de commande2 vaut 0.
$ commande1 || commande2 || commande3
La commande2 s'excute ssi le code de sortie de commande1 est diffrent de 0. De mme commande3 s'excute ssi le code de sortie de commande2 est diffrent de 0. Exemple :
$ echo si ok && echo reussi
Vous remarquez que dans le 1er cas les 2 commandes s'excutent. En revanche dans le 2me cas j'ai fait volontairement une erreur de syntaxe pour la 1re commande. Le shell ne regarde mme pas le 2me commande et il s'arrte en nous disant que ech n'est pas une commande connue. Pour lalternative :
$ echo si ok || echo reussi
Dans le 1er cas vous remarquez que seulement la 1re commande s'excute. Dans le 2me cas le shell affiche une erreur pour la 1re commande mais il excute quand mme la 2me.
Les scripts
Les shells ne sont pas seulement des interprteurs de commandes mais galement de vritables langages de programmation. Un script correspond une suite de commandes crite dans un fichier. Ceci permet dautomatiser certaines tches rptitives ou de faire de petits programmes adapts aux besoins de lutilisateur. Ici, nous crerons un script pour le shell bash. 3 tapes suffisent : Crer un fichier contenant comme premire ligne la syntaxe suivante: Rendre ce fichier executable en utilisant la commande:
Executer le script en utilisant la commande: $ script (ou le path s'il ne se trouve pas dans $PATH) ou
$ .\script
- 16 -
G3L Lionel JAMES Exemple : Crer le fichier test (touch Progtest) et insrer le contenu suivant :
#! /bin/bash______# interprteur commande1 commande2___# mme chose que : commande1; commande2
Shell Bash
Si on ne veut pas que le fin de ligne soit interprt, il suffit de mettre un "\ " en fin de ligne.
#! /bin/bash commande\ Suite de la commande trs longue
Ressources documentaires : http://www.bash-linux.com/unix-man-pipe-francais.html http://www.linux-france.org/article/dalox/unix04.htm http://aral.iut-rodez.fr/fr/sanchis/enseignement/bash/index.html http://www-gtr.iutv.univ-paris13.fr/Cours/Mat/Systeme/TDTP2003/tp03.html http://www.commentcamarche.net/faq/sujet-4801-guide-d-utilisation-du-shell-pour-debutant http://www.commentcamarche.net/faq/sujet-6353-l-arborescence-du-systeme-de-fichiers-delinux http://www.framasoft.net/article2425.html http://easynux.org/forum/viewtopic.php?id=389 http://www.commentcamarche.net/contents/linux/linusr.php3 http://www.tuteurs.ens.fr/unix/ http://lifc.univ-fcomte.fr/~dedu/docs/script.html#exemple
- 17 -