cours-shell

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 "123456789truc";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