Petit precis de shell » Historique » Version 9
Julien Enselme, 09/08/2013 22:41
Divers ajouts
1 | 3 | Julien Enselme | {{toc}} |
---|---|---|---|
2 | 2 | Julien Enselme | |
3 | 6 | Florent Torregrosa | Le shell est un langage assez particulier qu'on ne connait pas forcément en arrivant à centrale et qu'on a pas forcément l'occasion de beaucoup pratiquer. Le but de ce document est de rappeler les quelques bases du langage et de fournir quelques solutions standard à des problèmes courants afin que le nouveau membre du club Drupal ne soit pas désemparé et puisse comprendre les scripts. Il ne se veut en aucun cas un cours/tuto complet et exhaustif. |
4 | 1 | Julien Enselme | |
5 | 3 | Julien Enselme | h1. Quelques rappels d'Unix |
6 | 3 | Julien Enselme | |
7 | 3 | Julien Enselme | Le langage shell est le langage de script qui vient par défaut avec _tous_ les Unix. En effet, même si désormais d'autres interpréteurs plus modernes sont désormais répandus (bash, csh, zsh, etc.), ils ont tous conservé la compatibilité avec le shell. |
8 | 3 | Julien Enselme | |
9 | 3 | Julien Enselme | Comme pour la plupart des langages de script, il existe deux façons d'exécuter des instructions shell : |
10 | 3 | Julien Enselme | |
11 | 3 | Julien Enselme | * directement dans l'interpréteur |
12 | 3 | Julien Enselme | * dans un script shell |
13 | 3 | Julien Enselme | |
14 | 3 | Julien Enselme | Pour lancer un interpréteur shell, rien de plus simple : lancer un terminal (graphique ou tty). Et oui, le shell comprend toutes les commandes Unix que vous avez vues en début d'année (pwd, cd, cp). Vous pouvez donc les réutiliser _telles quelles_ dans vos scripts et utiliser son bon terminal pour faire des boucles, des conditions et j'en passe. |
15 | 3 | Julien Enselme | |
16 | 1 | Julien Enselme | h1. Les bases du shell |
17 | 3 | Julien Enselme | |
18 | 4 | Julien Enselme | Il est très important de comprendre et de garder à l'esprit qu'en shell tout est : |
19 | 4 | Julien Enselme | |
20 | 4 | Julien Enselme | * chaîne de caractères (y compris les nombres) ! Entrez @echo 1 + 1@ dans le terminal pour vous en convaincre. |
21 | 4 | Julien Enselme | * commande et que donc elles peuvent prendre des arguments (cela s'éclaircira plus tard) |
22 | 4 | Julien Enselme | |
23 | 4 | Julien Enselme | h2. Syntaxe de base |
24 | 4 | Julien Enselme | |
25 | 4 | Julien Enselme | Les commandes s'écrivent soit : |
26 | 4 | Julien Enselme | |
27 | 6 | Florent Torregrosa | * les unes à la suite des autres séparées par ; (peu recommandé) |
28 | 4 | Julien Enselme | * séparées les unes des autres par un saut de ligne |
29 | 4 | Julien Enselme | |
30 | 4 | Julien Enselme | Chaque commande peut prendre des arguments de deux types : |
31 | 4 | Julien Enselme | |
32 | 4 | Julien Enselme | * les arguments courts (l, r, h pour @ls@ par exemple) qui sont passés comme suit : @CMD -ARG@ |
33 | 4 | Julien Enselme | * les arguments longs (recursive pour @rsync@ par exemple) qui se passent comme ceci : @CMD --ARGUMENT@ |
34 | 4 | Julien Enselme | |
35 | 4 | Julien Enselme | Il est évidement possible de passer plusieurs arguments à une même commande. |
36 | 4 | Julien Enselme | |
37 | 6 | Florent Torregrosa | {{tip(Certains arguments existent sous une forme courte et une forme longue. Consulter le manuel de la commande pour plus de détails. Le manuel contient également la liste complète des arguments supportés par une commande.)}} |
38 | 4 | Julien Enselme | |
39 | 4 | Julien Enselme | {{note(Certains commandes ne respectent pas la convention énoncée ce-dessus. Leurs arguments long se passent avec un seul - (find en est un exemple))}} |
40 | 4 | Julien Enselme | |
41 | 5 | Julien Enselme | h2. Valeurs de retour des commandes et exception |
42 | 5 | Julien Enselme | |
43 | 6 | Florent Torregrosa | Une fois qu'une commande s'est exécutée, elle renvoie une valeur de retour afin "d'informer" l'utilisateur. Cette valeur permet en effet de savoir si la commande s'est exécutée correctement. Voici les valeurs de retour possibles et leur signification : |
44 | 5 | Julien Enselme | |
45 | 5 | Julien Enselme | * 0 : tout va bien |
46 | 5 | Julien Enselme | * 1 : erreur |
47 | 5 | Julien Enselme | * 2 : erreur grave |
48 | 5 | Julien Enselme | |
49 | 6 | Florent Torregrosa | Vous pouvez vous aussi utiliser ces valeurs de retour. Par défaut, un script qui se complète correctement retourne 0. Mais vous pouvez (par exemple si un utilisateur tente d'exécuter un script qui nécessite un argument sans) retourner un autre code d'erreur avec la commande @exit@. Il suffit de lui passer le code qu'elle doit retourner. Votre script s'arrêtera alors avec le code d'erreur spécifié. |
50 | 5 | Julien Enselme | |
51 | 4 | Julien Enselme | h2. Conditions et itérations |
52 | 7 | Julien Enselme | |
53 | 7 | Julien Enselme | h3. Conditions @if ... else ...@ |
54 | 7 | Julien Enselme | |
55 | 7 | Julien Enselme | La structure générale d'une condition est la suivante : |
56 | 7 | Julien Enselme | |
57 | 7 | Julien Enselme | <pre> |
58 | 7 | Julien Enselme | <code> |
59 | 7 | Julien Enselme | if QQC |
60 | 7 | Julien Enselme | then |
61 | 7 | Julien Enselme | CMDS |
62 | 7 | Julien Enselme | else |
63 | 7 | Julien Enselme | CMDS |
64 | 7 | Julien Enselme | fi |
65 | 7 | Julien Enselme | </code> |
66 | 7 | Julien Enselme | </pre> |
67 | 7 | Julien Enselme | |
68 | 7 | Julien Enselme | Le @else@ est facultatif. Il est aussi possible de regrouper @if@ et @then@ en une seule ligne comme ceci : @if QQC ; then@. |
69 | 7 | Julien Enselme | |
70 | 7 | Julien Enselme | La question que vous devriez avoir est que mettre à la place de @QQC@. Il y a deux possibilités : |
71 | 7 | Julien Enselme | |
72 | 7 | Julien Enselme | * la fonction @test@ |
73 | 7 | Julien Enselme | * une commande |
74 | 7 | Julien Enselme | |
75 | 7 | Julien Enselme | h4. La fonction @test@ |
76 | 7 | Julien Enselme | |
77 | 7 | Julien Enselme | {{important(Dans toute la suite, il faudra faire très *attention aux espaces*)}} |
78 | 7 | Julien Enselme | |
79 | 7 | Julien Enselme | La fonction @test@ s'utilise en général comme suit : @if [ ARGS ]@ |
80 | 7 | Julien Enselme | |
81 | 7 | Julien Enselme | *IMPORTANT* : La syntaxe *@if [[ ARGS ]]@* n'est valide qu'avec *bash*. Voir [[Petit_precis_de_shell#Différences notables avec bash|Différences notables avec bash]] |
82 | 7 | Julien Enselme | |
83 | 7 | Julien Enselme | h4. Test avec une commande |
84 | 7 | Julien Enselme | |
85 | 7 | Julien Enselme | Comme indiqué précédement, |
86 | 7 | Julien Enselme | |
87 | 8 | Julien Enselme | h1. Les fonctions |
88 | 8 | Julien Enselme | |
89 | 8 | Julien Enselme | Parler de @local@ pour que les arguments soient internes à la fonction. |
90 | 8 | Julien Enselme | |
91 | 8 | Julien Enselme | h1. Les redirections de flux |
92 | 8 | Julien Enselme | |
93 | 8 | Julien Enselme | >, >>, 2>&1, &>, |& |
94 | 8 | Julien Enselme | |
95 | 9 | Julien Enselme | h1. Paramètres de scripts |
96 | 9 | Julien Enselme | |
97 | 9 | Julien Enselme | * $1, $2, …, $9 |
98 | 9 | Julien Enselme | * $# |
99 | 9 | Julien Enselme | * $* |
100 | 9 | Julien Enselme | * $? |
101 | 9 | Julien Enselme | |
102 | 9 | Julien Enselme | h1. Exécuter une commande |
103 | 9 | Julien Enselme | |
104 | 9 | Julien Enselme | `` vs $(…) |
105 | 9 | Julien Enselme | |
106 | 8 | Julien Enselme | h1. Importer une configuration |
107 | 8 | Julien Enselme | |
108 | 8 | Julien Enselme | @. config-file.sh@ |
109 | 8 | Julien Enselme | |
110 | 8 | Julien Enselme | h1. Mode debug |
111 | 8 | Julien Enselme | |
112 | 8 | Julien Enselme | @sh -x SCRIPT@ |
113 | 8 | Julien Enselme | |
114 | 7 | Julien Enselme | h1. Différences notables avec bash |
115 | 9 | Julien Enselme | |
116 | 9 | Julien Enselme | h1. Divers |
117 | 9 | Julien Enselme | |
118 | 9 | Julien Enselme | h2. Différences entre la sortie de ls et de find |
119 | 9 | Julien Enselme | |
120 | 9 | Julien Enselme | ls : chemin relatif ; find auei : chemin absolu |