Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
MEMENTO ASR3
Ce mémento est fait pour vous fournir un minimum de bases nécessaires à la mise en oeuvre de
scripts sous Linux , il vous fournit les principes élémentaires nécessaires en SHELL. La distribution
Linux utilisée dans le département Informatique de Maubeuge est la Debian ETCH2. L'ouverture
d'une session sous Etch se fait de façon classique à l'aide du login et mot de passe qui vous ont été
fournis en début d'année. L'interface graphique sous Linux, n'est pas indispensable au fonctionnement
de Linux, vous vous en rendrez vite compte, nombreuses sont les choses que l'on peut faire en mode
dit «console ». On dispose ainsi de 6 consoles textes par défaut (tty1 à tty6 ), on bascule entre elles à
l'aide de la séquence de touches suivante: Alt+Ctrl+F1 à 6. Pour revenir en mode graphique c'est très
simple: Alt+Ctrl+F7. On peut également ouvrir un terminal en mode graphique qui vous permettra de
taper vos commandes
I. L'Invite de commande
En mode console vous vous retrouvez devant ce que l'on appelle « une invite de
commande »,c'est un message qui vous invite à rentrer une commande en vous donnant par la même
occasion une foule d'informations. Cette invite s'affiche avant chaque commande que vous tapez,
ex: igi1@s25pc1:~$. Les commandes sous linux sont interprétées par le « SHELL », ils en existent
plusieurs (bash, sh,csh...) ayant à quelques différences près les mêmes fonctionnalités. Si on
décortique l'invite de commande, on s'aperçoit que le premier mot est le login utilisateur et le
deuxième le nom de l'ordinateur, les deux sont reliés par le caractère @, on pourrait traduire par igi1
sur l'ordinateur s25pc1
Deux signes suivent ensuite le « ~ » et le « $ », le premier signifie signifie que nous sommes
dans notre répertoire personnel, le deuxième que nous sommes un utilisateur dit « normal », en effet
on peut être le super utilisateur que l'on nomme « root » sous linux et auquel cas le signe « ~ » sera
suivi du signe « # » ex: s25pc1:~# (le nom d'utilisateur disparaît, il n'y a qu'un seul root!).
Une autre solution pour retrouver une commande dont l'on ne se souvient plus mais que l'on a
déjà utilisée récemment est de remonter les commandes dans l'ordre à l'aide de la flèche « vers le
haut » quand on est dans une console. Si l'instruction n'est pas très récente tapez« history » en invite
de commande. Cette commande peut vous afficher les 500 dernières commandes lancées(chiffre
variant en fonction des distributions). Enfin dans le cas d'une commande compliquée comprenant de
nombreux paramètres, vous pouvez appuyer sur les touches « Ctrl » et « R » en même temps (Ctrl
+R)et l'ordinateur se mettra en mode "recherche d'une commande tapée" (R comme Recherche). Là,
vous pouvez taper n'importe quelle suite de lettres correspondant à une vieille commande. Par
exemple, faites Ctrl + R puis tapez "all". Linux retrouve la commande "ls --all" qui contenait
justement le mot "all". Vous n'avez plus qu'à taper Entrée pour relancer la commande !
V. Les fichiers
Sous Unix, les fichiers peuvent être de 5 types différents :
➢ Exécutable:Les fichiers exécutables correspondent à des programmes (écrits en langage C
généralement). Il n'est pas conseillé de tenter de les éditer à l'aide d'un éditeur de texte traditionnel
: il n'apparaîtra que des caractères bizarres et incompréhensibles. Seules les chaînes de caractères
stockées en constantes dans l'exécutable seront visibles. Mais en général la taille d'un exécutable
devrait vous en dissuader.
➢ Répertoire:Les répertoires, nous l'avons vu plus haut, sont des ensembles de fichiers et de
répertoires. Un répertoire peut ne contenir aucun fichier. Mais en revanche, un répertoire contient
toujours un répertoire parent et un répertoire courant.
➢ Les liens (ln)Les liens sont des fichiers assez spéciaux puisqu'il permettent d'associer plusieurs
noms à un seul et même fichier. Pour créer un lien, utiliser la commande « ln ». L'utilité des liens
est évidente puisqu'ils permettent à partir d'un seul fichier physiquement présent sur l'espace
disque, d'avoir plusieurs références de noms différents et localisées en des lieux différents d'un
même fichier qu'il n'est plus besoin de copier. Lorsque le fichier pointé est volumineux, l'emploi
des liens est donc très avantageux.
Chacun de ces droits sont attribués à 3 types de personnes : le propriétaire (owner ou UID), le
groupe (group ou GID) et le reste du monde (other). La commande utilisée pour lister les droits sur les
fihiers ou répertoires est la commande « ls -l ». Créons un fichier test.txt et visualisons les droits sur
ce fichier:
Les champs suivants décrivent respectivement la taille (en octets), la date et l'heure de la
dernière modification et le nom du fichier.
Nous disposons de la commande « chmod » pour changer les droits d'un fichier ou d'un
répertoire.Je veux par exemple modifier les droits du fichier « test.txt » créé précédemment , pour
donner les droits en écriture au groupe. Je vais donc faire « chmod g+w test.txt », on utilise ici le
moyen dit « littéraire » pour modifier les droits avec « u » pour user, « g » pour groupe, « o » pour
other et les opérandes « + » et « - » pour ajouter ou enlever des droits, à noter on peut aussi utiliser
« a » pour « all » si on veut modifier un droit pour tout le monde.
On peut également utiliser la méthode numérique de la façon suivante: r=4, w=2, x=1. Donc si
je veus donner les droits rwx rw-r-- au fichier « test.txt », je peux directement taper :
« chmod 764 test.txt ».
Le « setuid » et le « setgid » sont deux attributs qui permettent de modifier les droits du
processus créés par l'exécution du fichier. Si le « setuid » est activé, quand le fichier est exécuté par
un utilisateur, le processus a les mêmes droits que le propriétaire du fichier en cours d'exécution. Pour
le « setgid », vous avez donc deviné qu'il s'agissait d'un héritage des droits du groupe et non du
propriétaire du fichier.
Pour les activer, il vous suffit d'ajouter ou supprimer le flag "s" sur le propriétaire ou le groupe.
Vous voulez, par exemple, rendre un script exécutable par d'autres personnes que le propriétaire, vous
pouvez alors mettre le bit « s » sur l'utilisateur pour rendre lancer le script avec les droits de
l'utilisateur: « chmod u+s test.sh », avec les droits du groupe « chmod g+s test.sh ».
En informatique, les variables d’environnement sont des variables dynamiques utilisées par
les différents processus d’un système d’exploitation Vous pouvez les afficher par la commande
« env ». Une des plus importantes pour le lancement des commandes est la variable
« PATH »(attention les majuscules sont importantes), vous pouvez afficher celle ci avec la commande
« echo $PATH ». Cette variable renseigne le système sur le chemin des commandes que vous tapez.
Figure 4: La variable PATH
Si vous voulez rajouter un chemin où trouver des commandes à votre PATH(par exemple
l'endroit où vous stockez vos scripts) vous devez utiliser la commande suivante:
« export PATH=$PATH:/home/user/mes_prog » pour avoir le répertoire en dernier dans PATH. ou
« export PATH=/home/user/mes_prog/:$PATH » pour avoir le répertoire en premier dans PATH.
Attention ceci ne sera valable que pour la session en cours, si vous voulez configurer PATH de
façon permanente vous devez éditer le fichier de configuration de votre shell de connexion. Comme le
plus souvent c'est le shell BASH qui est utilisé, vous devez éditer votre fichier /home/user/.bashrc.
Pour ça vous utiliserez un éditeur de texte ou tout simplement une commande pour vous faciliter la
tâche. Eh oui, souvent l'utilisation de la ligne de commande rend les choses bien plus faciles que
l'utilisation de la souris, surtout dans les tâches d'administration. Voilà la commande:
« echo 'export PATH=$PATH:/home/user/mes_prog' >> /home/user/.bashrc »
Ainsi à chaque connexion votre PATH contiendra votre répertoire « /home/user/mes_prog ». Cette
opération peut être exécutée par l'utilisateur user vu qu'il s'agit de son environnement.
On peut chercher l'existence d'une commande en utilisant soit « whereis » soit « which »:
« whereis commande », « which -a commande ». Dans le cas de which l'option -a nous permet de voir
tous les chemins correspondants. Sans l'option -a ce n'est que le 1er répertoire qui contient la
commande qui sera affiché, chose qu'on ne voudra sûrement pas si la commande se trouve dans
plusieurs répertoires.
Si vous désirez ajouter du texte au fichier existant, vous devez utiliser lle caractère « >> », celui-ci
sera alors ajouté au texte existant.
Il est possible également d'exécuter plusieurs commandes sur une même ligne en séparant
celles-ci par un point-virgule. ex: « nb=3;echo "le nombre est " $nb ». Une autre manière de taper
plusieurs commandes est d'utiliser le « && » (double et commercial), dans ce cas les commandes
s'enchaînent en vérifiant au préalable que la première s'est exécutée correctement.
ex: « ls -l && echo "bonjour" »
En SHELL, on utilise également les « pipes », les tubes (en anglais «pipes", littéralement
tuyaux) constituent un mécanisme de communication propre à tous les systèmes Unix et Linux. Un
tube, symbolisé par une barre verticale (caractère «|», AltGr+6), permet d'affecter la sortie standard
d'une commande à l'entré standard d'une autre, comme un tuyau permettant de faire communiquer
l'entrée standard d'une commande avec la sortie standard d'une autre.
Ainsi dans l'exemple suivant, la sortie standard de la commande ls -al est envoyée sur le
programme sort chargé de trier le résultat par ordre alphabétique :
« ls -al | sort »
Il est possible de cette façon de chaîner un certain nombre de commandes par tubes successifs.
Dans l'exemple suivant la commande affiche tous les fichiers du répertoire courant, sélectionne les
lignes contenant l'extension « .txt »(grâce à la commande grep) et compte le nombre de lignes
total:« ls -l | grep .txt | wc -l », vous commencez ainsi à entrevoir toute la puissance du shell!
Figure 9: Le man
Pour naviguer dans la page de manuel, vous pouvez utiliser les touches [Flèches bas] (Page
Down) et [Flèches haut] (Page Up) ou utiliser la [Barre espace] pour avancer d'une page et « B » pour
reculer. Pour quitter la page de manuel, tapez « Q ».
Pour chercher des mots dans une page de manuel, tapez « / », puis un mot ou une phrase et
appuyez sur [Entrée]. Toutes les occurrences du mot seront en surbrillance dans toute la page de
manuel, vous permettant ainsi de lire rapidement le mot recherché dans son contexte.
Comme toute autre commande, man possède sa propre page de manuel. Tapez « man man » à
l'invite du shell pour obtenir de plus amples informations.
X. Les Processus
On appelle processus, un programme chargé en mémoire centrale et en cours d'exécution. Il est
géré par le système d'exploitation. Chaque processus peut créer lui-même des processus. Ces
nouveaux processus sont alors appelés processus enfants (child process). Un pseudo processus est
crée au moment du démarrage du système et a comme PID le numéro 0. Il crée lui-même un
processus enfant, avec le numéro 1. Le processus numéro 1 est appelé processus init. Ce processus
init est responsable de tous les processus en cours dans le système. Il permet d'afficher à l'écran le
login et d'utiliser le shell.
La succession de processus
Pour arrêter un processus, on peut lui envoyer différents signaux (pour en savoir plus sur les
signaux) :
kill PID : met fin normalement à la tâche
kill -9 PID : action si nécessaire encore plus radicale !
La commande "kill" permet d'envoyer un signal à un processus en cours pour l'arrêter par
exemple
➢ Kill PID: arrêt du processus
➢ Vous pouvez également lancer la commande xkill et tuez un processus avec la souris en
cliquant dessus.
Unix est un système multi-tâches, c'est-à-dire qu'il peut exécuter plusieurs programmes à la fois.
Un processus est une instance d'un programme en train de s'exécuter, une tâche. Le shell crée un
nouveau processus pour exécuter chaque commande.
Si on lance une commande qui prend beaucoup de temps (comme un calcul, ou une nouvelle
fenêtre), on peut l'interrompre par Control-C. Ceci interrompt (définitivement) la commande. On peut
aussi exécuter une commande en tâche de fond. Le shell rend alors la main avant la fin de la
commande. Pour le faire, on ajoute un « & » à la fin de la commande ; par exemple :
« chaland ~ $ cc -o grosprogramme grosfichier.c & »
« chaland ~ $ xdvi monrapport.dvi & »
Dans le premier exemple, on lance le compilateur cc en parallèle avec le shell; dans le second
exemple, on met le dvi en tâche de fond, ce qui évite d'avoir à le relancer à chaque modification.
background et foreground
Comme on vient de le voir, si vous avez pensé à terminer votre ligne de commande par une
esperluette, le programme que vous avez lancé tourne en arrière-plan (background, abrégé en
bg).
Si vous avez omis l'esperluette, le programme prend la précédence sur le shell. On dit qu'il
tourne au premier plan (foreground, abrégé en fg). Les lignes tapées au clavier sont mémorisées mais
ne seront pas exécutées par le shell avant que le programme en cours d'exécution n'ait fini son calcul.
Vous pouvez malgré tout faire passer ce programme en tâche de fond, grâce à la manipulation
suivante :
chaland ~ $ xdvi rapport.dvi
^Z (^= touche Contrôle-Ctrl)
zsh: suspended xdvi rapport.dvi
chaland ~ $ bg
[1] + continued xdvi rapport.dvi
chaland ~ $
^Z est un signal intercepté par le shell, qui suspend l'exécution du programme sans détruire le
processus correspondant. Les calculs déjà effectués par ce programme ne sont pas perdus. Dans
l'exemple précédent, si on demande à un xdvi suspendu de changer de page (SPC), il ne le fera pas,
mais il se souviendra de le faire dès qu'il aura à nouveau accès aux ressources de l'ordinateur. À partir
de l'état suspendu, on peut faire passer un programme :
➢ au premier plan, en tapant fg ;
Quand il n'y a qu'un seul programme en arrière-plan dans le terminal courant, on peut le faire
passer au premier plan en tapant fg. Cela permet en particulier d'interrompre son exécution grâce à
^C, que la plupart des programmes comprennent.^C n'affecte que l'éventuel unique programme qui
tourne au premier plan dans le terminal où il est tapé. Quand il y en a plusieurs, c'est un peu plus
compliqué, mais c'est bien sûr possible.
Vous pouvez pratiquer ^C, ^Z, fg, bg de façon visuelle et didactique en lançant la commande
« xdaliclock -seconds -geometry 500x100+0+0 -font BUILTIN » et en observant attentivement
les secondes (pensez à en laisser quelques-unes s'écouler). Vous remarquerez que ce
programme finit la transition en cours avant de se remettre à l'heure.
Résumé :
Le programme tourne au premier plan :
➢ ^Z le suspend ;
➢ ^C l'interrompt.
➢ bg le passe en arrière-plan.
Au démarrage l'éditeur est en mode ``commande'', pour passer en mode ``insertion'' il faut taper la
commande ``i'', pour en sortir appuyer sur la touche ESC.
mode commande
Les déplacements
remarque : on peut répéter N fois la plupart des commandes précédentes par exemple Nl déplace le
curseur de N caractères vers la droite. d} efface jusqu'à la fin du paragraphe, c2) supprime les 2
prochaines phrases et passe en mode insertion, 3{ remonte au début du 3ème paragraphe précédent.
exemples :
Ce fichier doit également être exécutable. Pour cela on lui attribuera ces droits à l'aide de
chmod. Si le fichier s'appelle mon_programme, on peut le faire de cette manière :
« chmod +x mon_programme » (Pour plus de détails sur les options de chmod, voir le chapitre VI)
A présent, on peut dans ce fichier mettre des commandes shell ou appeler des programmes comme on
le ferait dans une ligne de commande. Ensuite il sera invoqué en tapant son nom comme pour
n'importe quel autre exécutable. On peut insérer des commentaires dans un script. Ce sont des lignes
qui seront ignorées par le bash. A partir d'un # tout le reste de la ligne est considéré comme un
commentaire:
« #Ceci est un commentaire »
« echo ceci est affiché #Un autre commentaire »
Un script se termine lorsque la dernière ligne a été exécutée. On peut toutefois forcer sa sortie
avant en utilisant la commande exit. Le code de retour du script sera celui de la dernière commande
exécutée. Cela à moins de préciser une valeur numérique à la suite de exit. C'est alors celle-ci qui sera
renvoyée.
Lorsqu'un shell-script est exécuté, bash initialise certaines variables particulières qui sont alors
accessibles en lecture seule. C'est à dire qu'elles ne peuvent pas être directement modifiées par une
affectation.
La première pré-définie est « $$ » qui contient le PID du script. Ce Process ID, ou en français
l'identifiant de processus, est un nombre qui à un moment donné identifie de manière unique une
instance de programme en cours d'exécution sur le système. Cette valeur peut servir par exemple à
générer un nom de fichier temporaire ou pour envoyer un signal.
Il y a aussi les paramètres passés lors de l'appel au script. La variable $* contient l'ensemble de
toutes ces valeurs et $# permet de connaître leur nombre. Pour accéder à un paramètre en particulier,
on utilisera une des variables positionnelles $1, $2, $3, ... Pour celles après 9, il faut encadrer le
nombre par des accolades : ${10}, ${11}, ${12}....
La variable $0 contient le nom du script tel qu'il a été lancé, c'est-a-dire avec les spécifications
de chemin éventuelles.
Construction de test
Une construction if/then teste si l'état de la sortie d'une liste de commandes vaut 0 (car 0 indique
le « succès » suivant les conventions UNIX) et, dans ce cas, exécute une ou plusieurs commandes.Il
existe une commande dédiée appelée [ (caractère spécial crochet gauche). C'est un synonyme de test,
qui est intégré pour des raisons d'optimisation. Cette commande considère ses arguments comme des
expressions de comparaisons ou comme des tests de fichiers et renvoie un état de sortie correspondant
au résultat de la comparaison (0 pour vrai et 1 pour faux).
Avec la version 2.02, Bash a introduit la commande de test étendue [[ ... ]], réalisant des
comparaisons d'une façon familière aux programmeurs venant d'autres langages. Notez que [[ est un
mot clé, pas une commande. Bash considère « [[ $a -lt $b ]] » comme un seul élément, renvoyant un
état de sortie.
Les constructions (( ... )) et let ... renvoient aussi un état de sortie de 0 si les expressions
arithmétiques qu'elles évaluent se résolvent en une valeur non nulle. Ces constructions d'expansion
arithmétique peuvent donc être utilisées pour réaliser des comparaisons arithmétiques.
Nous allons créer un script qui teste l'existence d'un fichier d'utilisateurs
Nous le rendons ensuite exécutable, nous allons créer un fichier de test users.txt et nous lançons le
script sur users.txt
Syntaxe :
for variable in liste_de_cas
do
liste_commandes
done
Dans ce modèle, liste_de_cas est une liste de chaînes de caractères, utilisant éventuellement les
métacaractères du shell.
Exemple :
for fichier in `ls *.c`
do
chmod go-r $fichier
done
Cette séquence change les droits d'accès de tous les fichiers non cachés du répertoire courant
comprenant l'extension .c
Remarques :Dans les structures de contrôle de boucles, la commande break peut être utilisée.
La syntaxe suivante :
for i
do
...
est équivalente à :
for i in $*
do
...
La variable i prend successivement la valeur de chacun des paramètres positionnels ayant reçu une
valeur.