Un rapide cours de shell pour Commown - retour accueil
git clone git://bebou.netlib.re/cours-shell
Log | Files | Refs |
prez.slides (7115B)
1 2 3 4 5 6 Manier le shell : 7 8 Aller au delà du copier/coller de 9 Stack Overflow 10 11 12 13 14 15 16 17 › Objectifs 18 19 Être : 20 21 * une rampe de lancement pour une personne utilisant déjà le shell mais ne 22 sachant pas vraiment ce qu'elle fait avec. 23 * un cours collant à la norme POSIX + quelques trucs (vraiment) pratiques 24 * un cours démystifiant certaine parties du shell pour montrer que c'est un 25 langage "comme les autres" dans le sens qu'il est étudiable comme les 26 autres. 27 28 Ne pas être : 29 30 * une description exhaustive de ce que fait le shell 31 * un cours de shell pas POSIX (bash, zsh etc) 32 * un cours pour débutant·es 33 › Documents de références 34 35 Le manuel de dash 36 37 man sh 38 39 Le manuel de ksh élagués de ses parties pas POSIX 40 41 man ksh 42 43 44 › Vocabulaire 45 46 POSIX 47 48 Un ensemble de standards proposés fin des années 80 pour uniformiser les 49 éléments fondamentaux des Unix de l'époque. Ils partaient tous un peu trop 50 dans leurs coins. Détaille l'arbo de fichier, ce qu'est un thread, l'appel 51 système pour créer un fichier, le format des regex mais aussi : le 52 fonctionnement du shell et les outils que l'on utilise habituellement 53 dedans. 54 55 Attention, si la plupart des Unix se conforment plutôt bien à la norme 56 aucun ne le fait strictement et il peut y avoir des surprises. 57 58 › Vocabulaire 59 60 Shell 61 62 À la fois le langage de commandes des Unix et les programmes qui l'interprête. 63 Il y a un seul langage shell POSIX mais plusieurs interpréteurs pour (dash, 64 busybox sh, bash etc). 65 66 Puisque le shell est fait pour appeler d'autre programme on entend parfois 67 ces autres programmes être inclus dans ce que l'on appelle du shell. Par exemple 68 un script avec un seul appel à grep est du shell mais c'est surtout grep. 69 Cette distinction peut prêter confusion puisque l'on nomme parfois "shell 70 pur" un script ne contenant pas d'autre langage de programmation et 71 d'autres fois un programme shell n'appelant strictement aucune commande 72 extérieure à l'interpréteur de shell (rarement utile). 73 74 Tous les scripts shell ne sont pas du bash. Ces deux mots ne sont pas 75 synonymes. 76 › Vocabulaire 77 78 Terminal (ou tty) 79 80 La machine à travers laquelle on communique avec l'ordinateur. 81 Historiquement une machine physique principalement composée d'un clavier et 82 d'un périphérique permettant de voir les résultats de nos commandes 83 (imprimante + papier ou écran). Aujourd'hui on utilise des "émulateurs de 84 terminaux" qui pour la plupart simule et étendent le VT100, un terminal très 85 populaire et influent. 86 87 88 › La navigation 89 90 La plupart du temps on script en shell POSIX (du moins je recommande) mais on 91 interagit en shell plus sophistiqués. Ces shells permettent : 92 93 De naviguer dans l'historique de commandes ctrl+r 94 Revenir au début de la ligne ctrl+a 95 De supprimer un mot en arrière ctrl+w 96 D'utiliser les arguments de la cmd prec !* 97 Ou juste le dernier $_ 98 99 D'avoir de l'autocomplétion très sympa (surtout zsh) : 100 101 zsh 102 103 104 › Séquences d'échappement 105 106 Les shells ont deux modes, interactifs et pas interactifs. Dans le mode 107 interactifs les terminaux interprêtent des caractères spéciaux nommés "séquences 108 d'échappement". 109 110 Elles permettent par exemple de mettre de la couleur ou de déplacer le curseur. 111 C'est comme ça que fonctionnent des applications comme vim. 112 113 printf "1234\033[91men rouge\033[0m5678";read 114 printf "123456789[4Dtruc";read 115 116 vim | vim - 117 118 119 120 › C'est quoi une commande ? 121 122 On créé un dossier non lisible et non parcourable par d'autres que root 123 124 sudo mkdir -p dir1 125 sudo chmod -rx dir1 126 sudo touch dir1/a 127 128 Et maintenant on essaye de regarder dedans ou d'entrer dedans 129 130 ls -l dir1 131 cd dir1 132 133 Normal, et pourtant 134 135 sudo ls -l dir1 136 sudo cd dir1 137 138 › C'est quoi une commande ? 139 140 Le shell va passer par trois étapes dans cet ordre : 141 142 1. Est-ce que c'est une fonction ? 143 2. Est-ce que c'est une commande "builtin" ? 144 3. est-ce que c'est un programme externe ? 145 146 Une fonction : 147 148 fonction() { 149 seq 10 150 } 151 fonction 152 153 Un builtin : 154 155 Une commande implémentées directement dans l'interpréteur shell. 156 Historiquement l'un des buts était d'éviter de forker trop souvent pour des 157 commandes habituelles. C'est pour ça que `echo` ou `test` sont généralement 158 des builtins. 159 160 Les fonctions et les buitlin ont la particularité d'être exécutés dans le même 161 processus que le shell courant. Il n'y a pas de fork. 162 163 strace sh -c 'echo truc' 2>&1 | grep fork 164 165 strace sh -c 'ls' 2>&1 | grep fork 166 167 Au passage cette explication explique également pourquoi on ne peut pas 168 169 sudo echo "truc" > dir1/a 170 171 › Et les alias ? 172 173 Encore une autre histoire : 174 175 Réécriture directe de la commande avant de faire toute chose avec 176 177 › Les descripteurs de fichier 178 179 Pourquoi est-ce que : 180 181 cat 182 183 Les descripteurs de fichier sont des entiers qui, dans le contexte du 184 processus, désignent des fichiers du système. Par défaut les processus en ont 185 trois : 186 187 * 0 : Entrée standard 188 * 1 : Sortie standard 189 * 2 : Sortie d'erreur 190 191 Les shells connectent ces trois entrées/sorties au terminal. Le shell lit ce 192 que l'on insère dans le terminal et met les résultats (standards et erreurs) 193 dans le terminal. Tout se passe au même endroit. 194 195 Quand un programme fork il hérite de ses descripteurs fichiers de son parent. 196 197 › Les redirections 198 199 Vous connaissez les bases. 200 201 Positionnement : 202 203 redir cmd redir 204 205 Donc ces commandes sont équivalentes : 206 207 seq 10 > a 208 > a seq 10 #très rare 209 210 < a tac 211 tac < a 212 213 › Les globs 214 215 Ne sont pas des regex ! parfois appelés "shell patterns" (dans le manuel de 216 dash du moins). 217 218 Une syntaxe rapide et pratique pour écrire une méta chaîne de caractère. 219 220 * `*` n'importe quel caractère 221 * `?` un ou zéro caractère 222 * `[]` ouvre et ferme une classe de caractère 223 224 Supprimera tous les fichiers commençant par un chiffre et un tiret puis 225 n'importe et terminant par `.jp` suivant d'un caractère ou pas, suivi de `g`. 226 227 rm [0-9]-*.jp?g 228 229 Match le fichier `9-truc.jpg.jpag`. 230 231 On les retrouve parfois dans d'autres commandes, par exemple find : 232 233 find -name '*.pdf' 234 find -regex '.*\.pdf$' 235 236 237 238 239 240 › xargs 241 242 L'une de mes commandes préféré, utile pour scripter et de manière interactive. 243 244 Admettons que vous sachiez retrouver les gros pdf de votre home : 245 246 find $HOME -maxdepth 4 -name '*.pdf' -size +10M 247 248 Et que vous voulez les ouvrir pour les consulter. Il faudrait pouvoir mettre le 249 résultat de cette commande en argument d'une autre. C'est pour ça qu'xargs existe. 250 251 find $HOME -maxdepth 4 -name '*.pdf' -size +10M | xargs -I{} zathura "{}" 252 253 Les globs !!! 254 La redirection qui nécessite root 255 Les coreutils gotchas 256 Les différentes syntaxes de redir (< cmd ou cmd <) 257 Les heredoc 258 Les enchainements && et || 259 Les conditionnels (diff test [, valeur de retour des cmd) 260 Grouper les commandes pour grouper leurs stdout 261 Xargs 262 Différences alias, builtins, fonctions, cmd 263 Subshell et ce que ça fait 264 Les erreurs de bases (gestion noms de fichiers, les boucles quifont n'imp, les conditions un peu difficiles à écrire) 265