UNIX et SHELL
Transcription
UNIX et SHELL
Support de cours UNIX et SHELL Spécialité Electronique Première année Extrait du support de cours par Régis CLOUARD Table des matières I. Le langage shell..............................................................................................................................3 1. L'interpréteur de commandes.....................................................................................................3 2. Les fichiers de configuration..................................................................................................... 3 3. Éditeur de commandes...............................................................................................................4 4. Exécution des commandes.........................................................................................................4 5. Les entrées-sorties......................................................................................................................5 6. Les variables du shell.................................................................................................................6 7. Les fichiers scripts shell.............................................................................................................7 8. La commande test...................................................................................................................... 7 9. Les structures de contrôle.......................................................................................................... 8 10. Les fonctions............................................................................................................................9 11. Les méta-caractères shell......................................................................................................... 9 12. Les commandes spécifiques du shell..................................................................................... 10 13. Gestion des processus............................................................................................................ 10 II. Les commandes Unix..................................................................................................................12 1. Les dossiers de base................................................................................................................. 12 2. La documentation.................................................................................................................... 12 3. La gestion des dossiers et des fichiers..................................................................................... 12 4. La gestion des commandes...................................................................................................... 13 5. Gestion des disques..................................................................................................................14 6. La commande grep...................................................................................................................14 7. La commande find................................................................................................................... 14 8. Réseau...................................................................................................................................... 14 9. Les calculs en bash.................................................................................................................. 15 10. La commande expr.................................................................................................................15 III. Exemple 1 de script « shell ».....................................................................................................16 IV. Exemple 2 de script « shell »..................................................................................................... 17 2 I. Le langage shell 1. L'interpréteur de commandes shell est un interpréteur de commandes pour le système d'exploitation. Il permet d'écrire des programmes utilisant le système d'exploitation. Il repose un langage interprété et évolué : il possède des variables, des commandes internes et des structures de contrôle. Différentes familles (dialectes) – Famille Bourne : sh, ksh, bash, zsh (famille utilisée ici) – Famille csh (syntaxe du C) : csh, tcsh Variable d'environnement associée SHELL : exemple echo $SHELL – Lancement : $ sh ou bash – Arrêt : $ exit (ou C-d) 2. Les fichiers de configuration 2.1 Les fichiers de connexion Lus une fois à la connexion. 1. 2. 3. 4. 5. Séquence de lecture /etc/profile : commun à tous. $HOME/.bash_profile : personnel $HOME/.profile : personnel (si pas de bash-profile) $HOME/.bash_login : personnel à chaque connexion (si pas de bash_profile) $HOME/.bash_logout : personnel, à chaque déconnexion. Conséquence : la redéfinition des variables. 2.2 Contenu du fichier .profile (ou bash_profile) Les fichiers profile contiennent les configurations pour la session entière : – PATH : dossiers où trouver les exécutables. Montrer l'effet de PATH=$PATH:. – LD_LIBRARY_PATH : dossiers où trouver les bibliothèques dynamiques. – MANPATH : dossier où trouver les fichiers manuels. – PS1 et PS2 : les prompts primaire et secondaire. PS1="$ " ou PS1=`date` ou PS1="\w" chemin complet du dossier courant ou PS1="\W" unique le nom du dossier courant. – Ne pas oublier : export PATH LD_LIBRARY_PATH MANPATH PS1 PS2 – Gestion de la taille des core : ulimit -c unlimited – xset -b (suprimer le son cloche). 3 2.3 Le fichier .bashrc (bash) Exécuté à chaque invocation d'un shell. Attention: surchage de qui a été défini dans les .profile. Utilisé pour configurer le shell : les variables dépendantes du shell utilisé. Exemples : – aliases : alias ll='ls –la', alias rm 'rm –i', dir='ls -la" supprimer un alias (unalias) – set ignoreof : supprime l'effet du C-D pour sortir. – set noclobber : évite l'écrasement par redirection (cas ls > toto.txt) Exécution de bash sans le fichier de ressource .bashrc : $ bash -norc Remarque: chaque exécution de commande se fait dans un bash -norc. 3. Éditeur de commandes Nom : readline L'éditeur de commande conserve les commandes tapées dans un fichier historique. Commun à la plupart des interpréteurs de commandes … et à emacs. Ce fichier peut être réutilisé par les commandes : C-a, C-p, C-e, C-n, C-k, C-y, C-r… Taille de l'historique : variable HISTSIZE. Par exemple HISTSIZE=100 – C-c : annule la commande en cours – TAB sous bash : complétion des noms de fichiers (des commandes) – C-s / C-q : xon / xoff 4. Exécution des commandes Structure générale d’une commande : commande [-options] [arguments] [< inputfile] [>outputfile] [&] 4.1 Exécution séquentielle $ commande1 $ commande2 $ commande1 ; commande1 La commande1 doit être terminée avant d'exécuter commande2 4.2 Exécution parallèle $ commande1 & commande2 La commande1 et la commande2 sont exécutées en parallèle $ commande1 & $ commande2 La commande1 est exécutée en parallèle avec le bash : le prompt revient immédiatement et l'on peut taper des commandes, puis la commande2 est exécutée en même temps que commande1. 4.3 Exécution conditionnelle $ commande1 && commande2 conjonction : ET est exécuté si commande1 retourne 0. 4 $ commande1 || commande2 disjonction : OU est exécuté si commande1 retourne une valeur !=0. Exemple : (Rappel: La valeur de retour est la valeur retournée par le main()). $ gcc io.c; ./a.out $ gcc io.c && ./a.out $ gcc io.c || echo "erreur" $ nedit io.c & 5. Les entrées-sorties Toute entrée ou sortie est un fichier (une caméra, un robot) en lecture ou en écriture. Il y a 3 fichiers ouverts par défaut : – clavier (en entrée nommé 0 en shell; nommée stdin en C; – écran (en sortie nommé 1 en shell; nommée stdout en C. – erreur (en sortie nommé 2 en shell; nommée stderr en C. 5.1 Les redirections Exemple d'un fichier C compilé en programme a.out : int main(int argc, char *argv[]) { float f; scanf("%f", &x); printf("= %f\n",2.0f*x); return 0; } Redirection des entrées-sorties de l'exécution d'un programme : commandes > fichier # tout ce qui était affiché sur l'écran dans fichier. commande < fichier # tout ce qui était lu au clavier à partir de fichier. commande >> fichier # tout ce qui était affiché sur l'écran est ajouté au fichier En utilisant les numéros des sorties : commande 1> fichier ⇔ commande > fichier commande 0< fichier ⇔ commande < fichier commande 2> fichier : rediriger la sortie erreur (make 2>erreur.txt) Rappel d'un numéro de sortie : &x $ commande fichier 1> toto.txt $ commande 2>&1 Cas particuliers : $ commande << substitution temporaire de l'entrée standard. Affectation constante d'une entrée ou d'une sortie à un numéro : $ exec n<fichier $ exec n>fichier $ exec > &n $ exec 5<&o (lie 5 avec l'entrée standard) $ exec 6>toto.txt (lie 6 avec le fichier toto.txt) $ exec >toto.txt (lie la sortie standard avec toto.txt) en général, on utilise des numéros >=3. 5.2 Les pipelines Utiliser la sortie de l'un comme entrée de l'autre sans passer par un fichier : commande1 | commande2 5 commande1 | tee fichier | commande2 (sauvegarde intermédiaire) Exemples : $ gcc io.c && ./a.out $ $ $ make 2> error.log (récupérer les erreurs dans error.log) echo "coucou"> toto.txt (met coucou dans toto.txt) echo "ciao" >> toto.txt (ajoute ciao dans toto.txt) $ $ $ $ cat > fichier_texte << EOF <texte> EOF C-d $ $ gcc 2>&1 | more (pour récupérer les erreurs dans un more) 6. Les variables du shell 6.1 Affectation variable=valeur Exemple : variable=12 En shell il n'y a que des valeurs de type chaîne de caractères. Exemples: $ $ variable=12+3 -> 12+3 (et non 15) variable=`pwd` (voir eval) 6.2 Désaffectation unset variable 6.3 Séparateur de nom – $variable, ${variable}, mais pas $(variable), $variable, ${variable}xxx ! Ne pas confondre avec {commande} 6.4 Les variables système – $? : le code retour de la commande exécutée – $$ : le numéro du processus de la dernière commande exécutée. Remarque: $$ souvent utilisé pour les fichiers temporaires - éviter les conflits de nom. 6.5 Portée des variables : Les variables d'environnement Visibilité des variables : Les variables sont locales au shell sauf si elles sont explicitement exportées. (Par convention, mises en majuscule) export var (remarque on exporte var et $var qui est son contenu) Variable d'environnement= variable exportée d'un shell à l'autre. Variable d'environnement de base : PATH, LD_LIBRARY_PATH, MANPATH 6 6.6 Les substitutions – ${var} identique à $var (sert à la concaténation) – ${var-valeur} si var est définie rend var sinon rend valeur. – ${var=valeur} : si var n'est pas définie affecte var à valeur. Dans tous les cas rend var. – ${var?message} : si var est définie rend var sinon affiche le message. – `commande` : exécution de la commande Cas particulier de bash : $((1+2)) -> 3 uniquement des entiers. 7. Les fichiers scripts shell Script shell est un fichier texte avec les droits d'exécution. 7.1 L'entête Les commentaires en shell : # Obligatoire : sur la 1er ligne doit être indiqué le choix de l'interpréteur : #!/bin/sh, #!/bin/bash, #!/usr/bin/perl Préférer sh pour la probabilité. Ajouter –x pour lister les commandes au fur et la mesure de leur exécution.. 7.2 Arguments (de script ou de fonction) Les paramètres de position spécifiques au script shell $# : le nombre d'arguments. $* : la liste des toutes les valeurs de paramètre dans une seule chaîne. $@ : la liste de toutes les valeurs de paramètres dans une seule chaîne. Différent de $* si on utilise "$@" -> "$1", "$2" .. alors que "$*" -> "$1 $2 ..." $0 :le nom du programme ou de la fonction. $1,$2, $9 : la valeur de l'argument i. La commande 'shift' décale la numérotation $2 devient $1,… 8. La commande test C'est une commande shell nommée "test" ou par les méta-caractères [ ] : attention espace après [ et avant ]. Elle retourne 0 (succès) ou >0 pour un erreur. 8.1 Tests numériques Syntaxe : test valeur option valeur option : -eq , -ne, –gt, -ge, -lt, -le Exemple : test 5 –lt 6 retourne 0 7 8.2 Tests sur les fichiers Syntaxe : test option fichier options : – -s : le fichier n'est pas vide – -d : le fichier est un dossier (différent de fichier) – -f : le fichier est un fichier (différent de dossier) – -w : le fichier a les droits d'écriture – -r le fichier a les droits de lecture – -x : le fichier a les droits d'exécution 8.3 Tests sur les chaînes de caractères Syntaxe : test chaine option chaine* option =, != Syntaxe : test option chaîne option : -z longueur 0, -n longueur non nulle. 8.4 Les opérateurs logiques – ! test : vrai si le test est faux. – test -a test : et logique entre test – test -o test : ou logique entre test 9. Les structures de contrôle 9.1 La structure if if commande then commande else commande fi Attention : chaque partie de la structure est séparée par fin de ligne ou par un ';'. if commande; then commande; else commande; fi Le test du if porte sur le code de retour de la commande ($?). Variante : $ if then elif then fi a=1; if [ $a -eq 1 ], then echo "a vaut 1"; else echo "a ne vaut pas 1" 9.2 La boucle while while commande; do commande*; done Exécuté tant que le code de retour de la dernière commande est 0. Possibilité d'utiliser break et continue; $ a=0; while [ $a -lt 10 ]; do echo $a; a=$(($a+1)); done Remarque: boucle infinie : while : ; do … done 8 9.3 La structure case case $variable in cas1) commande* ;; casn) commande* ;; esac casi : un motif correspond à une valeur pour l'entrée : une constante ou une expression construite avec les méta-caractères, par exemple : [co]* : commence par c ou o puis n'importe quoi après. 9.4 La boucle for for <var> in <liste> do <commandes> done liste est une liste de valeur que doit prendre la variable var. $ for f in `ls`; do; echo $f; done $ for i in 1 2 3 4 5; do; echo $i; done ou Possibilité d'utiliser break et continue; Remarque: Uniquement en bash: $ for ((i=0;i<5;i++)); do; f($i); done 10. Les fonctions Rassembler une série de commandes dans le shell courant par un même nom. Syntaxe de la déclaration [function] nom_fonction(){ } 10.1 Les arguments La récupération des arguments se fait par $*, $*1, $2, $# Les variables ne sont que globales et leur portée limitée au shell qui exécute le script. Exemples : test1(){ echo "Nombre d'arguments $#" echo "Les arguments sont $*" } test1 a1 a2 a3 if [ -f $x ] then echo "Fichier" else echo "Pas de fichier" fi return n -> permet à une fonction de retourner un résultat numérique donné, sinon c'est le résultat de la dernier commande qui est retourné Le résultat est accessible par la macro $? (echo $?). 11. Les méta-caractères shell 11.1 Spécifier des ensembles de fichiers * : n'importe quelle suite de caractères même vide. 9 ? : un caractère exactement [abcde] : n'importe quel caractère à l'intérieur de l'ensemble. Attention le méta-caractère est interprété avant l'appel de la commande. ex : ls po*.c : tous les fichiers du dossier courant commençant par po et finissant par .c. "xxx" : la chaîne de caractères avec évaluation de son contenu (les variables sont remplacées et les * aussi). 'xxxx' : la chaîne de caractère sans évaluation du contenu : Exemple : echo "$HOME" -> /users/eleves/promo08/toto; echo "$HOME' -> $HOME \ empêche l'interprétation particulières du caractères qui suit \. echo "\$HOME" -> $HOME echo "\"un guillemet\"" -> "guillemet" 11.2 Exécution de commandes ` ` : le résultat de l'exécution de la commande à l'intérieur. ex : PS1=`date $` () : exécution des commandes dans un sur-shell. { } : exécution des commandes dans le même shell. Attention, ne pas confondre avec ${xx} 12. Les commandes spécifiques du shell – – – – – – – – – cd, pwd, echo, read, export, exit, ulimit, umask, set, unset. type <commande> (ou which < commande>) read <variable> echo $<variable> sleep [durée] exec <commande> : exécution du commande à la place du shell eval <commande> : évaluation de la commande (voir différence avec ``) trap (cat > toto.txt << EOF -> ^D. 13. Gestion des processus Unix est un système multi-tâche multi-utilisateur, où une tâche est en fait un processus. Un processus encapsule une commande en cours d'exécution. Plusieurs tâches (processus) peuvent être lancées en même temps : – Dans des fenêtres différentes – Dans un même fenêtre avec l'opérateur & Un processus peut être lancé : – au premier plan (1 seul à la fois par fenêtre). Il dispose du clavier et de l'écran. – en arrière plan (plusieurs à la fois) : il ne dispose ni du clavier ni de l'écran (tous les affichages sont perdus). Un processus peut être – actif : en cours d'exécution. 10 – stoppé : momentanément stoppé. – arrêté : définitivement arrêté. 13.1 Opérations de gestion des processus C-c : arrête le processus au premier plan. C-z : stoppe momentanément le processus au premier plan. jobs : liste des programmes qui tournent dans un même shell avec leur numéro bg %x : mettre en arrière plan un programme stoppé et reprendre l'exécution. (% indique le numéro du processus. Si % est absent, considère le premier processus) fg %x : mettre au premier plan un programme en arrière plan. stop %x : stopper un processus en arrière plan Remarque : la séquence <commande>, C-z, bg : correspond à <commande>&. 11 II. Les commandes Unix 1. Les dossiers de base /bin : les utilitaires Unix de base /lib : les bibliothèques des programmes dans /bin. /etc : programme d'administration du système et tables. /tmp : fichiers temporaires /usr : les programmes utilisateurs en général. /usr/local : les programmes rapatries par l'utilisateur /usr/bin : autres utilitaires plutôt dédié utilisateurs. /usr/lib : autres librairies plutôt dédié utilisateurs. /dev : les périphériques (dev/lp, /dev/null , /dev/dsk/r0s0t0d0disque). /dev/null : make 2> /dev/null /media/nom : clé USB. 2. La documentation Toute la documentation UNIX est généralement accessible en ligne : $ $ $ $ $ man man man man man commande –Mdir commande $ man -M/usr/local/bin gimp –ssection commande $ man -s1 read –k mot-clé = apropos mot-clé -a printf Toutes les pages printf.x s'il y en a plusieurs La variable d’environnement MANPATH $ $ apropos word : cherche toutes les commandes référant ce mot info commande : gnu 3. La gestion des dossiers et des fichiers 3.1 La gestion des dossiers mkdir, rmdir, cd, ls, chmod, pwd 3.2 La gestion des fichiers file fichier : Permet de connaître le type d'un fichier cat fichier : Affiche le contenu du fichier. $ cat > fichier C-d Dans un script : $ $ cat > toto.txt << EOF EOF more fichier : (less) Affiche le contenu du fichier page par page. 12 Options : h, b, !, q, n tail [–x] fichier : affiche les x dernières lignes (défaut 10) head [–x] fichier : affiche les x premières lignes (défaut 10) touch [date] fichier : actualiser la date du fichier. Manipulation du nom d’un fichier ou d’un dossier : chmod droit fichiers cp $ cp f1 f2 $ cp f1 … fn d1 $ cp –R d1 .. dn-1 dn mv $ mv f1 f2 $ mv f1 … fn dir $ mv dir1 dir2 mv files directory ; mv oldfile newfile rm –i –f –R source ln –s source destination basename fichier [suffix] : Récupère le nom d'un fichier sans le dossier [et sans le suffixe] $ basename /usr/tmp/exo.c .c exo dirname fichier : Récupère le nom du dossier d'un nom de fichier : dirname dirname /usr/tmp/exo.c->/usr/tmp Changer l’extension gif en jpg : for i in *; do; mv $i `basename $i .gif`.jpg; done diff fichier1 fichier2 : uniquement sur les fichiers textes. wc : compte le nombre de mots. sort 3.3 Conversion de format unix2dos ou $ dos2unix : conversion d'un fichier dos vers unix (vice et versa). $ unix2dos -ascii ../NEWS.txt $DOSDIR/NEWS.txt iconv : Convertir l'encodage de fichiers donnés à partir d'un encodage vers un autre $ $ iconv –f ISO-8859-1 –t UTF-8 Ingles-2006.txt –o Ingles-2006.txt.utf iconv -f ISO-8859-1 -t UTF-8 $fichier > $fichier.utf 4. La gestion des commandes time <commande> : donne la durée de l’exécution d’une commande. date : donne la date courante ps -edf (ou -aux sur certains systèmes) : Visualise tous les numéros des processus en cours d'exécution. top : uniquement les 10 processus qui prennent le plus de temps CPU. kill -9 noproc : Arrête un processus en cours. (il faut en être propriétaire) 13 $ $ kill -9 -1 kill -1 noproc {recharge le fichier init} xkill puis pointage sur une fenêtre (ne fonctionne qu'en version graphique). type commande ou which commande : afficher le nom (avec chemin) complet de la commande. whereis commande: affiche le chemin des commandes dans les répertoires binaires standards. 5. Gestion des disques df : disk space free quota -v : disk quota. du [–hs] directory : Disk Usage of directory 6. La commande grep grep pattern fichiers Recherche si la chaîne est présente dans le fichier. $ $ grep "matrice.h" *.c ps –edf | grep user egrep expression_régulière fichiers 7. La commande find find path expression : Recherche le fichier <fic> dans le dossier <path> et ses sous-dossiers et application de l'expression donnée. Exemples d'utilisation classiques $ $ $ $ find find find find . . . . -name -exec -name -name "*toto*" -print grep "chaine" {} \; -print "toto*"-exec grep "chaine" {} \; -print "*.o" -exec rm {} \; -print 8. Réseau 8.1 Connexion – slogin, ssh -X, sftp – ssh -X si les environnements graphiques sont compatibles. – scp fichier host : copie le fichier fichier sur la machine host. (scp utilise ssh). Pour copier ces fichiers localement dans un dossier on va utiliser : $ scp [email protected]:* ~/. Ou pour envoyer les fichiers du dossier local, vers le dossier tmp de la machine itane : $ scp ~/* [email protected]:/tmp – wget www.ecole.ensicaen.fr/~toto/adresse html: téléchargement non-interactif de fichiers sur le web (supporte les protocoles http et ftp). 8.2 Communication – finger user : donne les caractéristiques de l’utilisateur. 14 – – – – groups [user] : donne la liste des groupes auquel appartient l’utilisateur. users liste des utilisateurs connectés. who, rwho : sur toutes les machines du domaine. whoami : qui suis-je. 9. Les calculs en bash Bash ne connait que les chaînes de caractères. Mais, bash propose aussi des extensions pour effectuer des calculs 9.1 Opérations sur des entiers $ $ ((1+2)) a=`expr $a + 1` 9.2 Opérations sur des entiers Calculatrice en ligne (bc : basic calculator) $ a=$(echo "1.0+2.0"|bc -l); 10. La commande expr expr argument : appliquer une opération complexe. Remarque : Toutes les variables Unix sont des chaînes de caractères. Valeur de retour 0 1 2 >2 If the expression is neither NULL nor 0. If the expression is either NULL or 0. For invalid expressions. An error occurred. Exemple simple: ajoute 1 à la variable shell a: $ a=`expr $a + 1` 15 III. Exemple 1 de script « shell » #!/bin/sh -x # # examen.sh # # @author Régis Clouard <[email protected]> # # ENSICAEN # 6, boulevard Maréchal Juin # F-14050 Caen cedex # # Script shell permettant de compiler un fichier C et tant qu'il y a # des erreurs édite le fichier C pour le correction et relance la compilation. # Une fois le programme compilé exécute le fichier # et retourne son code d'erreur. if [ $# -ne 2] then echo "USAGE: $0 <fichier.c>" exit 1 fi # Construit le nom de l'exécutable à partir du nom # du fichier auquel on retire le suffixe .c nomexec=`basename $i .c` # Boucle infinie (sortie par break) while : do gcc -Wall -03 -pedantic $1 -o $nombase 2>error.log if [ $? -ne 0 ] then more error.log emacs $1 else break; fi done nomexec # Retourne le code d'erreur de l'exécution du programme. exit $? 16 IV. Exemple 2 de script « shell » #!/bin/bash # # Exemple de l'utilisation de la commande "read" # et de la structure de controle "case" # # Dossier courant PWD=`pwd` clear # Recuperer la reponse de l'utilisateur read -n 1 -p "Would you like a long list of $PWD? (Y/N/Q) " YesNo clear # Teste la valeur de la variable YesNo variable. # Si la valeur est differente de Y, N ou Q alors affiche un message d'erreur. case $YesNo in y|Y) ls -lhA --color ;; n|N) ls -A --color ;; q|Q) exit 0 ;; *) echo -e "Please enter Y, N, or Q" ;; esac # Sortie avec le code d'erreur 0 (sans erreur) exit 0 17
Documents pareils
Le système Unix - Université Grenoble Alpes
Modification du PATH (dans $HOME/.profile)
PATH=$HOME/bin:$PATH