\documentclass{beamer}

% Valentin Samir

\mode<presentation>
{
  \usetheme{Warsaw}
  \usecolortheme[overlystylish]{albatross}

  \setbeamercovered{transparent}
  % or whatever (possibly just delete it)
}
\graphicspath{{presentation/}}

\usepackage[francais]{babel}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{times}
\usepackage{graphicx}
\usepackage{tikz}

\title[Séminaire Cr@ns]{Le Shell}

\subtitle{Interface en ligne de commande Unix}

\author[Valentin Samir]{Valentin Samir}
\date[19/10/2010]{Mardi 10 octobre 2010}

%\logo{\includegraphics{crans}}
%\pgfdeclaremask{masque_crans}{masque_logo_crans}
%\pgfdeclareimage[mask=masque_crans,height=0.5cm]{logo_crans}{logo_crans}
%\logo{\pgfuseimage{logo_crans}}

% Delete this, if you do not want the table of contents to pop up at
% the beginning of each subsection:
\AtBeginSection[]
{
  \begin{frame}<beamer>
    \frametitle{Sommaire}
    \tableofcontents[currentsection,currentsubsection]
  \end{frame}
}

\AtBeginSubsection[]
{
  \begin{frame}<beamer>
    \frametitle{Sommaire}
    \tableofcontents[currentsection,currentsubsection]
  \end{frame}
}

% If you wish to uncover everything in a step-wise fashion, uncomment
% the following command: 

\beamerdefaultoverlayspecification{<+->}

\begin{document}

\begin{frame}
  \titlepage
\end{frame}

\begin{frame}
  \frametitle{Sommaire}
  \tableofcontents
\end{frame}

\section{Description générale}
\begin{frame}
  \frametitle{Introduction}
  \begin{itemize}
  \item Interface entre l'utilisateur et le système d'exploitation
  \item Processus premier d'une session
	\begin{itemize}
	 \item {\em user\!:password\!:uid\!:gid\!:comment\!:homedir\!:shelll \\
		admin\!:x\!:1000\!:1001\!:\!:/home/admin\!:/bin/bash}
	\end{itemize}
%\begin{block}{Bloc standard}
%Un bloc tout simple
%\end{block}
	
  \item Interpréteur de commandes
	\begin{itemize}
	 \item lecture et exécution de commandes
	 \item redirection des entrées/sorties
	 \item expansion des noms de fichiers
	\end{itemize}


  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Introduction}
  \begin{itemize}
 \item Langage de programmation
	\begin{itemize}
	 \item programmation interactive (en ligne)
	 \item programmation non-interactive (fichier de commandes)
	\end{itemize}

  \end{itemize}
\end{frame}

\section{ L'interpréteur de commandes}
\subsection{Fonctionnalités Générales}
\begin{frame}
  \frametitle{Les Shells}
  \begin{itemize}
  \item \textbf{sh} ("Bourne shell", Steve Bourne) \\
 	\ \ \  shell historique (disponible sur tous les Unix)
  \item \textbf{csh} ("C-shell", Bill Joy) \\
	\ \ \ shell BSD
 \item \textbf{ksh} ("Korn shell") \\
	\ \ \ shell normalisé POSIX (P1003.2) et ISO (HP, Solaris) 
 \item \textbf{bash} ("Bourne again shell" de Brian Fox et Chet Ramey) \\
	\ \ \ Ksh du domaine public
 \item \textbf{zsh} ("Zero shell"), par défaut au Crans \\
	\ \ \ Ksh du domaine public 
 \item ...

  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Algorithme du shell}
  \begin{itemize}
  \item Ouverture initiale de 3 fichiers standard
	\begin{itemize}
	  \item entrée standard ,stdin, par défaut le clavier
	  \item sortie standard, stdout, par défaut l'écran
	  \item sortie erreur standard, stderr, par défaut l'écran
	\end{itemize}
  \item Le shell lit sur son entrée standard
	\begin{itemize}
	  \item lecture de la commande jusqu'à la fin de ligne et interprétation des métacaractères et opérateurs
	  \item lecture des lignes de commandes jusqu'à la fin de fichier
	\end{itemize}
  \item Lancement d'une commande
	\begin{itemize}
	  \item recherche du nom de la commande à l'aide du PATH
	  \item en premier plan : fork() exec(commande) wait() prompt
	  \item en arrière plan : fork() exec(commande) prompt
	\end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Caractères de contrôle au clavier}
  \begin{itemize}
  \item Caractères de contrôle non gérés par le shell
	\begin{itemize}
	  \item '<cr>' fin de ligne (retour chariot) mappé en <cr><lf>
	  \item '<lf>' fin de ligne (nouvelle ligne) mappé en <cr><lf>
	  \item '<tab>' tabulation
	  \item '<bs>' \^ \! H, backspace, effacement du caractère précédent
	  \item '<del>' \^?, souvent identique à <bs>
	  \item \^ \! C interruption d'un processus attaché au terminal
	  \item \^ \! Z suspension d'un processus en premier plan
	  \item \^ \! U effacement de la ligne complète
	  \item \^ \! W effacement du mot qui précède
	  \item \^ \! D fin de fichier => si le shell lit,termine
	  \item \^ \! S suspension de l'affichage écran (Xoff)
	  \item \^ \! Q reprise de l'affichage écran (Xon)
	\end{itemize}
  \item Gestion des caractères de contrôle par stty \\
  \ \ \  stty erase \^ \! H kill \^ \! U intr \^ \! C susp \^ \! Z eof \^ \! D
 \end{itemize}
\end{frame}
\subsection{Format d'une commande}
\begin{frame}
  \frametitle{Format d'une commande}
  \begin{itemize}
  \item Métacaractères \\
	\ \ \ | \& ; ( ) < > <espace> <tab>
  \item Opérateurs de contrôle \\
	\ \ \ || \& \&\!\& ; ;; ( ) | <newline>
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Format d'une commande}
  \begin{itemize}
  \item Invite (le prompt) principale \\
	\ \ \ \$ ou \# pour utilisateur ou super-utilisateur : \\
		\ \ \ \ \ \ admin@genua\!:\~\!\$ ou root@genua\!:\~\!\#
  \item Commande simple
	\begin{itemize}
	  \item une commande simple est une séquence de mots séparés par un séparateur blanc.\\
	 Le premier mot désigne le nom de la commande à exécuter, les mots suivants sont passés en arguments à la commande.
	  \item la valeur retournée d'une commande est celle de son exit.
	\end{itemize}
  \item Chemin de recherche du nom d'une commande :\\
	\ \ \ commandes intégrées ou \\
	\ \ \ {\em PATH=/usr/local/sbin\!:/usr/local/bin\!:/usr/sbin\!:/usr/bin\!:/sbin\!:/bin.}
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Pipelines}
  \begin{itemize}
  \item plusieurs commandes séparées par le caractère |.
  \item format : command1 [ | command2 ... ]
  \item la sortie standard de la première commande est connectée à l'entrée standard de la commande suivante, et ainsi de suite.
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Listes}
   \begin{itemize}
  \item séquence d'un ou plusieurs pipelines séparés par un des opérateurs : ;, \&, \&\!\&, ||.
  \item optionnellement terminée par un ;, \&, <newline>.
  \item priorité des opérateurs : \&\!\& > || > ; = \&
  \item si termine par \&, exécuté en arrière plan
  \item les commandes séparées par un ';' sont exécutées séquentiellement
  \end{itemize}
\end{frame}

\subsection{Les entrées-sorties}
\begin{frame}
  \frametitle{Redirection des entrées-sorties}
  \begin{itemize}
  \item Fichiers standard
	\begin{itemize}
	  \item entrée standard ,stdin, par défaut le clavier (fd=0)
	  \item sortie standard, stdout, par défaut l'écran (fd=1)
	  \item sortie erreur standard, stderr, par défaut l'écran (fd=2)
	\end{itemize}
  \item Redirection de l'entrée standard
	\begin{itemize}
	   \item '< {\em fichier ou périphérique}'
	   \item '<\!< {\em marque}' texte qui suit jusqu'à la marque
	\end{itemize}
  \item Redirection de la sortie standard
	\begin{itemize}
	   \item '>{\em fichier ou périphérique}'
	   \item '1>{\em fichier ou périphérique}'
	   \item '>\!>{\em fichier ou périphérique}' (insertion)
	\end{itemize}
   \item Redirection de la sortie erreur standard
	\begin{itemize}
	   \item '>\!\&' ou '\&>{\em fichier ou périphérique}'
	   \item '2>{\em fichier ou périphérique}'
	\end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Redirection des entrées-sorties}
 \begin{itemize}
   \item Examples \\
 \ \ \ cat fichier1 >fichier2 copie\\
 \ \ \ cat fichier3 >>fichier2 ajout\\
 \ \ \ cat >fichier4 saisie de texte\\
 \ \ \ cat <fichier4 listage\\
 \ \ \ cat <fichier4 >fichier5 copie\\
 \ \ \  cat <fichier6 >>fichier5 ajout\\
 \ \ \ appli 1>/dev/null 2>\&1 \& silence total en background\\
 \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Méta-caractères d'expansion}
   \begin{itemize}
   \item Ne sont concernées que les chaînes de caractères des noms de fichiers.
   \item * remplace n'importe quelle chaîne de caractères
   \item ? remplace n'importe quel caractère
   \item $\left[ \dots \right]$ établit une coïncidence avec l'un des caractères mis entre crochets m[ai]* \\
	\ \ \ \  {\em mail macro micro mini}
   \item $\left[ .-. \right]$ établit une coïncidence avec tous les caractères compris entre les 2 bornes
 	 \ \ \ \ {\em ls [A-Z]*.[hc1-8]}
   \item \{...,...\} remplace successivement les chaînes intérieures \\
	 \ \ \ \ ls *.{C,cc}
   \item \~\ \! remplace par le \$HOME ou celui d'un autre login \\
	 \ \ \ \ {\em cd \~\ \!username}

  \end{itemize}
\end{frame}



\begin{frame}
  \frametitle{Quotage}
   \begin{itemize}
    \item utilisé pour supprimer les fonctionnalités de certains caractères spéciaux du shell, \\
	dont les métacaractères : * \textbackslash \ \$ * ` " '
   \item Caractère d'échappement \textbackslash \ 
   \item Simples quotes '...'
   \item Doubles quotes "...", conservent leur valeur littérale à l'exception de \$ ` et \textbackslash
 \end{itemize}
\end{frame}

\section{Le langage de programmation}
\begin{frame}
  \frametitle{Fichier de commande, Script}
 \begin{itemize}
   \item Magic number : \#! /bin/sh
   \item commentaires \#
  \item affectation de variables, variable=valeur, variable2=\$variable
   \item test conditionnel \\ 
{\em \ \ \ if commande ; then \\
\ \ \ liste de commandes\\
\ \ \ else\\
\ \ \ liste de commandes\\
\ \ \ fi }
  \item boucles : for in do ... done, while do ... done => break [n]
  \item expression arithmétiques (+, -, *, /, \%), interne au shell
  \item fonctions nom() \{.........\} 
 \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Variables de substitution prédéfinies}
 \begin{itemize}
  \item \$0,...,\$9 arguments
  \item \$\# nbr arguments
  \item \$\!? code retour de la dernière commande
  \item \$\$ pid de ce shell
  \item \$! pid du dernier process en bg
 \end{itemize}
\end{frame}

\section{Autre}
\begin{frame}
  \frametitle{Fichiers d'initialisation}
 \begin{itemize}
    \item /etc/profile
    \item .profile
    \item .login
    \item .cshrc
    \item .logout
    \item .bash\_profile
    \item .bashrc
    \item .bash\_alias
    \item .inputrc
    \item .zshrc
    \item .tcshrc
 \end{itemize}
\end{frame}

\end{document}
%%% Local Variables: 
%%% mode: pdflatex
%%% End: 
