--- bash-1.tex.orig	2009-07-08 15:07:34.000000000 +0200
+++ bash-1.tex	2009-07-08 16:29:13.000000000 +0200
@@ -54,7 +54,7 @@
 \chapter{Interaction d'une commande avec son shell}
 
 \section{Entrées et sorties}
-Sous UNIX chaque commande utilisateur lancée est attachée à  un shell. Démarrez un terminal, démarrez un programme, fermez le terminal, votre programme se fermera également. 
+Sous UNIX chaque commande utilisateur lancée depuis un shell est attachée à ce même shell. Démarrez un terminal, démarrez un programme, fermez le terminal, votre programme se fermera également (à moins qu'il ne se soit détaché ;)). 
 Le programme fait plusieurs choses :
 \begin{itemize}
 \item ce pour quoi il est prévu ;
@@ -63,24 +63,67 @@
 
 \sautligne
 
-Pour écrire et lire en utilisant le terminal, on utilisant 3 pseudo fichiers particuliers (appelés descripteurs de fichiers) :
-\begin{itemize}
-\item \emph{stdin} (entrée standard, généralement le clavier), également noté 0 ;
-\item \emph{stdout} (sortie standard, généralement l'écran), également noté 1 ;
-\item \emph{stderr} (sortie d'erreur, qui utilise en général l'écran comme \emph{stdout}, et sert à  diffuser des messages d'erreur), également noté 2.
-\end{itemize}
+Pour écrire et lire en utilisant le terminal, on utilise 3 pseudo fichiers particuliers (appelés descripteurs de fichiers):
+\begin{description}
+\item[stdin] entrée standard, généralement le clavier, également noté 0;
+\item[stdout] sortie standard, généralement l'écran, également noté 1;
+\item[stderr] sortie d'erreur, qui utilise en général l'écran comme \emph{stdout}, et sert à  diffuser des messages d'erreur), également noté 2.
+\end{description}
 
 \sautligne
 
-Suivant les systèmes d'exploitation ou les distributions (Linux ou BSD) vous pouvez voir ces fichiers à  l'aide de la commande :
-\begin{lstlisting}[lastline=1]
-$ ls /dev/pts/ 
-$
+% Suivant les systèmes d'exploitation ou les distributions (Linux ou BSD) vous pouvez voir ces fichiers à  l'aide de la commande :
+%% /dev/pts/ n'existe même pas sous OpenBSD ;)
+% \begin{lstlisting}[lastline=1]
+% $ ls /dev/pts/ 
+% $
+% \end{lstlisting}
+
+Sous Linux vous pouvez voir ces fichiers en affichant les descripteurs associés
+à votre shell. Dans votre shell tapez la commande suivante:
+
+\begin{lstlisting}
+$ ls -l /proc/$$/fd
+total 0
+lrwx------ 1 user user 64 2009-07-08 15:14 0 -> /dev/pts/4
+lrwx------ 1 user user 64 2009-07-08 15:14 1 -> /dev/pts/4
+lrwx------ 1 user user 64 2009-07-08 15:14 2 -> /dev/pts/4
+lrwx------ 1 user user 64 2009-07-08 15:14 255 -> /dev/pts/4
 \end{lstlisting}
-
 \sautligne
 
-Voici quelques exemples : 
+Ceci liste donc les \emph{f(ile) d(escriptors)} associés au processus courant
+(variable \$\$). Le \emph{fd} 255 est un cas particulier associé au
+fonctionnement de \emph{bash}, votre shell par défaut sous Linux.
+
+En ce qui concerne \verb+/dev/pts/4+, il s'agit tout simplement de
+l'identifiant de votre terminal, ici il s'agit du pseudo terminal 4. La liste
+des pseudos terminaux ouverts se trouve dans le dossier \verb+/dev/pts+. Il est
+également possible de savoir à quel terminal sont associés des processus, par
+exemple avec la commande:
+
+\begin{lstlisting}
+$ ps a -o command,tty
+COMMAND                     TT
+/sbin/getty 38400 tty1      tty1
+/sbin/getty 38400 tty2      tty2
+/sbin/getty 38400 tty3      tty3
+/sbin/getty 38400 tty4      tty4
+/sbin/getty 38400 tty5      tty5
+/sbin/getty 38400 tty6      tty6
+/usr/X11R6/bin/X -auth /var tty7
+bash                        pts/3
+vi bash-1.tex               pts/3
+bash                        pts/5
+ps a -o command,tty         pts/5
+\end{lstlisting}
+
+Les lignes correspondant à \verb+tty1+ à \verb+tty6+ sont en fait des \emph{tty}
+"physiques", ceux auxquels vont accédez par les combinaisons de touches
+\emph{Ctrl+Alt+FX}. \verb+tty7+ est un cas particulier qui ici est utilisé par
+mon serveur X pour afficher une interface graphique.
+
+Après cette digression, continuons avec quelques exemples:
 \begin{itemize}
 \item Lorsque vous entrez votre login dans un tty (pas dans gdm ou kdm), le programme 'login' lit vos données sur \emph{stdin}.
 \item Le programme 'ls' utilise \emph{stdout} ou \emph{stderr} suivant ce qu'il a à  dire :
@@ -95,7 +138,7 @@
 
 \section{Redirection de flux}
 
-La commande précédente redirige la sortie de \verb+ls+ sur \emph{stdout}, en général il s'agit de l'écran. Mais il est possible de rediriger la sortie ailleurs que sur l'écran. La 'redirection de flux' s'effectue gràçe à  l'opérateur '$>$' :
+La commande précédente redirige la sortie de \verb+ls+ sur \emph{stdout}, en général il s'agit de l'écran. Mais il est possible de rediriger la sortie ailleurs que sur l'écran. La 'redirection de flux' s'effectue grâce à  l'opérateur '$>$' :
 \begin{lstlisting}[lastline=1]
 $ ls 1>/dev/null	#1 (donc stdout) est redirige vers /dev/null
 $
@@ -103,7 +146,7 @@
 
 \sautligne
 
-Rien n'est alors listé sur le terminal. Le résultat de \verb+ls+ est écrit dans le fichier spécial /dev/null (c'est un fichier de type 'caractère' qui se contente d'absorber ce qu'on lui envoie sans rien redonner).
+Rien n'est alors listé sur le terminal. Le résultat de \verb+ls+ est écrit dans le fichier spécial \verb+/dev/null+ (c'est un fichier de type 'caractère' qui se contente d'absorber ce qu'on lui envoie sans rien redonner).
 
 \sautligne
 
@@ -118,7 +161,7 @@
 Les messages d'erreur de \verb+ls+ sont toujours envoyés sur \emph{stderr} et la redirection précédente n'a pas d'effet :
 \begin{lstlisting}[lastline=2]
 $ ls fichier_non_existant >/dev/null
-$ ls: cannot access fichier_non_existant: No such file or directory
+ls: cannot access fichier_non_existant: No such file or directory
 \end{lstlisting}
 
 \sautligne
@@ -143,13 +186,13 @@
 
 \Rappel{'\&1'représente bien \emph{stdout} lorsqu'il est placé à  droite de '$>$'. Utiliser '1' sans le '\&' aurait redirigé \emph{stderr} dans un fichier nommé '1'.}
 	
-A la place de /dev/null, on peut bien entendu rediriger \emph{stdout} ou \emph{stderr} vers un fichier normal. Il est même possible de concaténer (terme barabre signifiant qu'on ajoute à  la suite) la sortie au contenu d'un fichier déjà  existant avec '$>>$'.
+À la place de /dev/null, on peut bien entendu rediriger \emph{stdout} ou \emph{stderr} vers un fichier normal. Il est même possible de concaténer (terme barabre signifiant qu'on ajoute à  la suite) la sortie au contenu d'un fichier déjà  existant avec '$>>$'.
 \begin{lstlisting}[lastline=7]
 $ pwd > fichier
 $ cat fichier
 /home/gauvain
 $ date >> fichier
-$ cate fichier
+$ cat fichier
 /home/gauvain
 mardi 28 avril 2009, 00:44:19 (UTC+0200)
 \end{lstlisting}
@@ -158,7 +201,7 @@
 
 Attention toutefois à  ne pas tout envoyer vers le fichier /dev/null. En effet si vous faite :
 \begin{lstlisting}[lastline=1]
-$ls fichier_non_existant >/dev/null 2>&1
+$ ls fichier_non_existant >/dev/null 2>&1
 $
 \end{lstlisting}
 
@@ -168,38 +211,95 @@
 
 Cependant si vous avez spécifié le nom d'un fichier à  la place de /dev/null, dans ce cas la tous les messages seront écrit dans ce fichier. Vous pouvez également utiliser la fonction de concaténation de la redirection :
 \begin{lstlisting}[lastline=7]
-$pwd > toto
-$cat toto
+$ pwd > toto
+$ cat toto
 /home/gauvain
-$ls fichier_non_existant >>toto 2>&1
-$cat toto
+$ ls fichier_non_existant >>toto 2>&1
+$ cat toto
 /home/gauvain
 ls: cannot access fichier_non_existant: No such file or directory
 \end{lstlisting}
 
 \sautligne
 
-L'utilisation de la redirection 2$>$\&1 peut être très utile pour éviter de retaper le nom et l'emplacement d'un fichier. Dans l'exemple précédent, cela vous éviteras de rentrer deux fois le nom du fichier toto. Cela simplifieras également la lecture de vos scripts.
+À noter que l'évaluation des redirections est réalisée de droite à gauche.
+
+Prennons par exemple la commande suivante dont nous redirigerons les sorties
+d'erreur et standard.
+\begin{lstlisting}
+$ ls /etc/hostname fichierinexistant
+ls: cannot access fichierinexistant: No such file or directory
+/etc/hostname
+\end{lstlisting}
+
+Nous tentons simplement de lister le fichier \verb+/etc/hostname+ ainsi qu'un
+fichier (dans notre cas) inexistant. Deux lignes de texte sont renvoyées par
+\verb+ls+. La première est affichée sur la sortie d'erreur, la deuxième sur la
+sorte standard. Nous allons maintenant "jouer" avec les redirections.
+
+\begin{lstlisting}
+$ ls /etc/hostname fichierinexistant >>listing 2>listing
+$ cat listing
+ls: cannot access fichierinexistant: No such file or directory
+/etc/hostname
+\end{lstlisting}
+
+Rappelons que l'opérateur $>$ tronque d'abord le fichier (le ramène à une
+taille de 0 et le crée si besoin est) avant d'écrire le contenu redirigé.
+En allant de droite à gauche donc, le fichier listing est tronqué, et la sortie
+d'erreur redirigée vers celui-ci, ensuite la sortie standard est redirigée vers
+ce même fichier, mais en étant ajoutée à la suite (tel qu'expliqué pour
+l'opérateur $>>$ ).
+
+Autre exemple maintenant:
+\begin{lstlisting}
+$ rm listing
+$ ls /etc/hostname fichierinexistant >listing 2>listing
+$ cat listing
+/etc/hostname
+ess fichierinexistant: No such file or directory
+\end{lstlisting}
+
+Ici un comportement assez étrange sans vraiment l'être. De droite à gauche, la
+sortie d'erreur est redirigée vers le fichier \verb+listing+ mais c'est
+également le cas de la sortie standard. Les deux écritures vont donc se
+réaliser "en parallèlle" en début de fichier \verb+listing+ . Comme la sortie
+d'erreur est non bufferisée elle sera la première à être écrite dans le fichier
+et par-dessus sera ensuite écrit la sortie standard, ce qui explique ce bout de
+message manquant (vous remarquerez que le bout de message manquant fait
+exactement la taille de la chaîne de caractère émise par la sortie standard, en
+n'oubliant par le retour à la ligne).
+
+\begin{lstlisting}
+/etc/hostname
+             ess fichierinexistant: No such file or directory
+\end{lstlisting}
+
+Il s'agit bien entendu de cas extrêmes et extrêmement peu utilisés, mais il est
+bon d'y faire attention lors de l'utilisation de redirections multiples.
+
+%L'utilisation de la redirection 2$>$\&1 peut être très utile pour éviter de retaper le nom et l'emplacement d'un fichier. Dans l'exemple précédent, cela vous évitera de rentrer deux fois le nom du fichier \verb+toto+. Cela simplifiera également la lecture de vos scripts.
+
 
 \section{Codes de retour des commandes}
 
-Les codes de retour des commandes n'ont que peu d'intérêt, et ils n'indiquent ni l'échec complet ni la réussite du programme. Le code de retour du programme donne plus d'informations. Lorsque le programme a fini sont exécution, une variable particulière qui contient le code de retour est disponible : \$?
+Les messages de la sortie d'erreur n'ont qu'un intérêt indicatif pour l'utilisateur, ils n'indiquent ni l'échec complet ni la réussite du programme. À ce niveau le code de retour du programme donne plus d'informations. Lorsque le programme a fini sont exécution, une variable particulière qui contient le code de retour est disponible : \$? .
 
-Sa valeur peut être affichée gràçe à  la commande \verb+echo+. Dès qu'une autre commande est terminée, sa valeur change, donc le résultat est dépendant de ce qui se passe précédemment :
+Sa valeur peut être affichée grâce à la commande \verb+echo+. Dès qu'une autre commande est terminée, sa valeur change, donc le résultat est dépendant de ce qui se passe précédemment :
 \begin{lstlisting}[lastline=8]
 $ ls
 fichier_1 fichier_2 fichier_3
 $ echo $?
-1		#(ls a reussi a faire ce qu'on lui demande)
+0		#(ls n'a pas rencontré d'erreur pendant son exécution)
 $ ls fichier_non_existant
 ls: cannot access fichier_non_existant: No such file or directory
 $ echo $?
-0		#(ls n'a pas reussi a faire ce qu'on lui demande)
+2		#(ls a rencontré une ou plusieurs erreurs pendant son exécution)
 \end{lstlisting}
 
 \sautligne
 
-Les différents codes retourné peuvent être :
+Les différents codes retournés peuvent être :
 \begin{itemize}
 \item 0 est le code de retour conventionnel lorsqu'une application quitte en ayant fonctionné correctement ;
 \item Les codes de retour supérieurs à  0 indiquent qu'une erreur s'est produite. La signification dépend du programme ;
@@ -217,9 +317,9 @@
 
 Les entrées/sorties ainsi que le code de retour sont au bon vouloir du programmeur. Mais la convention veut que le code retour en cas de succès d'un programme soit toujours 0 (c'est le fameux return 0; des fonctions main dans un programme en C/C++/C\#). 
 
-\section{Interaction entres plusieurs commandes}
+\section{Interaction entre plusieurs commandes}
 
-Il est possible d'exécuter 2 commandes à  la suite en les séparant par le symbole ';'. La $2^{nde}$ commande sera alors exécutée quel que soit le code de retour de la $1^{ere}$.
+Il est possible d'exécuter 2 commandes à  la suite en les séparant par le symbole ';'. La $2^{nde}$ commande sera alors exécutée quel que soit le code de retour de la $1^{ère}$.
 Par exemple
 \begin{lstlisting}[lastline=3]
 $ ls toto; cd toto
@@ -232,7 +332,7 @@
 
 Comme vous pouvez le voir les 2 commandes ont été exécutées et ont échoué.
 
-Pour permettre un meilleur contrà´le sur l'enchainement de deux (ou plus) commandes il existe deux opérateurs. Les opérateurs \&\& et $||$ autorisent l'exécution conditionnelle d'une commande suivant la valeur du code de retour de la commande précédente.
+Pour permettre un meilleur contrôle sur l'enchaînement de deux (ou plusieurs) commandes il existe deux opérateurs. Les opérateurs \&\& et $||$ autorisent l'exécution conditionnelle d'une commande suivant la valeur du code de retour de la commande précédente.
 
 L'opérateur \&\& n'exécute la commande de droite que si celle de gauche a un code de retour égal à  0 (donc si elle s'est correctement terminée).
 Par exemple :
@@ -257,9 +357,9 @@
 
 \sautligne
 
-Le message envoyé par le \verb+echo+ s'affiche car la $1^{ere}$ commande a échoué.
+Le message envoyé par le \verb+echo+ s'affiche car la $1^{ère}$ commande a échoué.
 
-Il est bien entendu possible de chaîner autant d'opérateurs \&\& et $||$ que l'on désire et même de les mélanger dans une même ligne de commande. Les 2 opérateurs ont la même priorité et leur évaluation s'effectue de gauche à  droite. Mais vous devez prudent et connaître par avance le résultat de vos commande pour enchaîner correctement les commandes suivantes. 
+Il est bien entendu possible de chaîner autant d'opérateurs \&\& et $||$ que l'on désire et même de les mélanger dans une même ligne de commande. Les 2 opérateurs ont la même priorité et leur évaluation s'effectue de gauche à  droite. Mais vous devez être prudent et connaître par avance le résultat de vos commande pour enchaîner correctement les commandes suivantes. 
 Voici quelques exemples d'enchainements :
 \begin{lstlisting}[lastline=25]
 $ toto && tata || echo 'titi'
@@ -335,22 +435,23 @@
 Cette $2^{nde}$ notation est utile en cas de concaténation d'une variable avec un texte ou une autre variable :
 \begin{lstlisting}[lastline=3]
 $ arbre=sapin
-$ echo 'un $arbre, des $arbres'
+$ echo "un $arbre, des $arbres"
 un sapin, des
 \end{lstlisting}
 
 \sautligne
 
 Comme vous pouvez le constater, il manque une partie de la phrase. Cela est dû au fait que pour le shell la variable \$arbres n'existe pas. Le shell la remplace donc par un blanc. Alors que :
+
 \begin{lstlisting}[lastline=2]
-$ echo 'un $arbre, des ${arbre}s'
+$ echo "un $arbre, des ${arbre}s"
 un sapin, des sapins
 $
 \end{lstlisting}
 
 \sautligne
 
-Cette vois ci c'est bien \$arbre qui est utilisé et remplacé par sa valeur : sapin.
+Cette fois ci c'est bien \$arbre qui est utilisé et remplacé par sa valeur : sapin.
 
 Il faut faire attention à  certaines règles :
 \begin{itemize}
@@ -378,11 +479,21 @@
 
 \sautligne
 
-Les expressions entourées de " " ou ' ' sont interprétées comme un tout. C'est un élément particulièrement important, notamment pour comprendre comme sont interprétés les arguments passés aux scripts. Dans ce cas, le caractère espace n'est plus considéré comme un séparateur de commande, mais comme faisant partie de la chaîne affectée à  la variable "FOO".
+Les expressions entourées de " " ou ' ' sont considérées comme un tout, une chaîne de caractère complète. À noter que seul les expressions entourées de double quote ("") seront interprétées pour les variables ou expansions qu'elle contiennent.
+
+\begin{lstlisting}
+$ arbre=sapin
+$ echo 'un $arbre, des ${arbre}s'
+un $arbre, des ${arbre}s
+$ echo "un $arbre, des ${arbre}s"
+un sapin, des sapins
+\end{lstlisting}
+
+C'est un élément particulièrement important, notamment pour comprendre comment sont interprétés les arguments passés aux scripts. Dans ce cas, le caractère espace n'est plus considéré comme un séparateur de commande, mais comme faisant partie de la chaîne affectée à  la variable "FOO".
 
 Les variables sont de type \og string\fg mais peuvent êtres \og castés\fg en entier quand il est nécessaire. Cependant les différents shell (bash, csh, zsh, etc.) peuvent étendre le type possible de variable (comme par exemple, un type \og array\fg pour un shell bash). 
 
-Une autre possibilité est d'utiliser le backslash '\backslash', qui est un caractère dit \og d'échappement\fg. Placé devant un caractère spécial, il permet de le traiter comme un caractère normal. En reprenant l'exemple précédent :
+Une autre possibilité est d'utiliser le backslash '\backslash', qui est un caractère dit \og d'échappement\fg. Placé devant un caractère spécial, il permet de le traîter comme un caractère normal. En reprenant l'exemple précédent :
 \begin{lstlisting}[lastline=3]
 $ FOO=bar\ baz
 $ echo $FOO
@@ -418,15 +529,15 @@
 
 \section{Les commandes set et unset}
 
-La commande \verb+set+ permet de visualiser toutes les variables définies pour le shell (variables au sens large, vous risquez d'être surpris si vous exécutez cette commande).
+La commande \verb+set+ permet de visualiser toutes les variables définies pour le shell (variables et même fonctions au sens large, vous risquez d'être surpris si vous exécutez cette commande).
 
 La commande \verb+unset+ permet de supprimer une variable :
 \begin{lstlisting}[lastline=6]
 $ arbre=sapin
-$ echo 'un $arbre est un arbre' 
+$ echo "un $arbre est un arbre"
 un sapin est un arbre	# $arbre est bien remplace ici par 'sapin'
 $ unset arbre
-$ echo 'un $arbre est un arbre'
+$ echo "un $arbre est un arbre"
 un  est un arbre
 $
 \end{lstlisting}
@@ -446,9 +557,9 @@
 $ export arbre=sapin
 $ animal=chien
 $ bash			# On lance un nouveau shell depuis le shell courant
-$ echo 'un $arbre est un arbre'
+$ echo "un $arbre est un arbre"
 un sapin est un arbre	# $arbre a bien été rendu accessible au le sous-shell
-$ echo 'un $animal est un animal'
+$ echo "un $animal est un animal"
 un est un animal	# $animal ne renvoie rien car non exporté au sous-shell 
 $
 \end{lstlisting}
@@ -475,7 +586,7 @@
 
 \sautligne
 
-Le conteneur 'SHELL' a donc la valeur '/bin/bash' (qui est l'interpréteur shell sur ma machine. Cette valeur peut être différente sur d'autre machine). Certaines de ces variables sont définies par le shell lui même (SHELL par exemple), certaines dans son fichier de configuration, d'autres par des logiciels tiers (XAUTHORITY pour X) ou encore manuellement (DEBEMAIL).
+Le conteneur 'SHELL' a donc la valeur '/bin/bash' (qui est l'interpréteur shell sur ma machine. Cette valeur peut être différente sur d'autres machines). Certaines de ces variables sont définies par le shell lui même (SHELL par exemple), certaines dans son fichier de configuration, d'autres par des logiciels tiers (XAUTHORITY pour X) ou encore manuellement (DEBEMAIL).
 
 \section{Mixer variables et commandes}
 
@@ -559,7 +670,7 @@
 
 \sautligne
 
-La commande \verb+ls+ va lister tous les fichiers et va les afficher sur la sortie standard (\emph{stdout}). Le `pipe` (tuyau, noté $|$ ) va alors récupérer la sortie et la renvoyer vers l'entrée standard (\emph{stdin}). La commande \verb+grep+ prend alors le relais pour n'afficher que les fichiers ne terminant pas par .pdf.
+La commande \verb+ls+ va lister tous les fichiers et va les afficher sur la sortie standard (\emph{stdout}). Le `pipe` (tuyau, noté $|$ ) va alors récupérer la sortie et la renvoyer vers l'entrée standard (\emph{stdin}). La commande \verb+grep+ prend alors le relai pour n'afficher que les fichiers ne terminant pas par .pdf.
 
 Le mécanisme des pipes ($|$) permet d'enchaîner plusieurs commandes, en connectant la sortie standard d'une commande à  l'entrée standard de la suivante. Cela permet par exemple d'enchaîner plusieurs commandes pour enregistrer le résultat final dans une variable :
 \begin{lstlisting}[lastline=2]
@@ -589,8 +700,8 @@
 %%%%%%%%%%%%%%
 \chapter{Conclusion}
 
-Avec ce premier cours nous avons un fait tour rapide des possibilités d'utilisation du shell au travers de principes importants et fondamentales pour l'écriture et la compréhension de script shell.
-Les autres possibilités du shell sont trop nombreuses pour être toute expliquée dans ce cours, je vous invite donc à  consulter le document en annexe qui vous donnera des informations additionnelles.
+Avec ce premier cours nous avons un fait tour rapide des possibilités d'utilisation du shell au travers de principes importants et fondamentaux pour l'écriture et la compréhension de scripts shell.
+Les autres possibilités du shell sont trop nombreuses pour être toutes expliquées dans ce cours, je vous invite donc à  consulter le document en annexe qui vous donnera des informations additionnelles.
 
 Pour finir, voici quelques liens internet où vous pourrez trouver de plus amples informations :
 

