Introduction au shell Bash


Le shell

Un interpréteur de commandes (le "shell", la coquille qui entoure le "noyau" du système) est un programme qui sert d'intermédiaire entre l'utilisateur et le système d'exploitation.
Sa tâche essentielle est l'exécution de programmes.
Pour cela, il effectue (en boucle infinie) :
  • la lecture d'une ligne
  • sa compréhension comme une demande d'exécution d'un programme avec d'éventuels paramètres.
  • le lancement de ce programme avec passage des paramètres
  • d'éventuelles redirections d'entrées-sorties
  • les exécutions de scripts (fichiers de commandes)

    Démarrage du shell

    Les scripts de connexion

    1. d'abord le script /etc/profile communs à tous les users y compris root
    2. . On y trouve notamment la définition de umask
    3. celui-ci cherche à exécuter tous les scripts /etc/profile.d/*.sh (parcourir alias.sh et numlock.sh)
    4. puis il y a exécution de $HOME/.bash_profile (la variable $HOME contient le chemin vers le répertoire personnel). Il s'agit ainsi d'un fichier de démarrage personnel et paramétrable.
    5. A son tour il exécute $HOME/.bashrc dans lequel il est recommandé de placer toutes les fonctions ou alias personnels (car .bashrc est exécuté dans tout shell)
    6. Enfin le précédent script exécute /etc/bashrc, dans lequel on place les alias globaux et la définition symbolique du prompt $PS1
    7. Puis le prompt utilisateur s'affiche et le shell attend une commande ...

    Personnalisation des commandes bash

    Personnalisation du login utilisateur

    Chaque utilisateur peut ajouter des commandes shell au fichier de profil personnel, ~/.bash_profile
    Par exemple, voici ce que j'ai mis à la fin de ce fichier :
    clear
    salut="Bonjour $USER !\nJe te souhaite bon courage ...\n\
    # le dernier \ pour pouvoir continuer la commande sur la ligne suivante
    # $( ..) pour obtenir le résultat de l'exécution de la commande incluse
    Nous sommes le $(date) "
    # -e option indispensable pour interpréter les \n
    echo -e $salut
    

    Les variables d'environnement système

    Facilités de saisie des commandes

    Comme les commandes Unix sont souvent longues à saisir, diverses facilités sont offertes :

    Historique des commandes
    Cette liste numérotée est accessible en tapant history | less Pour relancer la commande numéro n, saisir (sans espace) !n
    On peut aussi parcourir les précédentes lignes de commandes avec les flèches (comme doskey) et les éditer. Ceci permet très facilement de reprendre une précédente commande pour l'éditer et la modifier.

    Le clic-droit
    Dans un terminal console, sélectionner un texte quelconque. Un clic-droit recopie ce texte sur la ligne de commande, même dans une autre console.

    L'opérateur tilde

    Le caractère tilde ~ (alt 126) seul renvoie au rép. personnel de l'utilisateur actuel.
        Si l'user actif est toto, chaque occurrence du caractère ~ est remplacé par le chemin /home/toto

    Le tilde ~ suivi d'un nom d'user, par ex jean,  renvoie au rép. personnel de jean, c-à-d /home/jean
    Ainsi par cette commande cd ~stagiaire3 tente en vain d'aller dans le rép. /home/stagiaire3


    TP 1

    1. Personnaliser le script .bash_logout situé dans votre répertoire personnel pour que le contenu du cache de Netscape soit effacé au moment de votre déconnexion
      Puis comme root, compléter le script "modèle" /etc/skel/.bash_logout, afin que ce "nettoyage" soit effectué pour tout nouvel utilisateur.

    2. Expérimenter les "tab" et "clic-droit".
      Saisir echo -n "Bonjour $USER ! Nous sommes le "; date
      Puis utiliser le "clic-droit" pour exécuter cette commande dans une autre console.

    3. [root@pc5 /root] cat  > essai.txt <Entr> envoie la saisie dans le fichier
      Ceci est un essai tout simple ! <Entr>
      mais tout-à-fait intéressant. <Entr>
      <CTRL-D>         caractère fin de fichier sous Linux
      [root@pc5 /root] cat  essai.txt     envoie le contenu à la console
      [root@pc5 /root] cp essai.txt  ~jean  copie le fichier dans /home/jean


    Compléter une commande

    Lorsqu'on tape une commande en ligne la touche TAB, l'interpréteur cherche à compléter le nom du fichier.
    home/toto ]$ less  /etc/fs TAB

    S'il y a plusieurs propositions, il y a attente d'un complément d'info de la part de l'utilisateur (avec un "tut").
    Un autre TAB et l'interpréteur affiche toutes les possibilités ou en indique le nombre, s'il y en a beaucoup !


    TP 2


    $ cd  /etc <TAB>
    there are 111 possibilities. Do you really wish to see them all ? (y or n)
    $ cd  /etc/s <TAB>
    security    services    smb.conf    syslog.conf   etc ..
    $ cd  /etc/sys<TAB>            # on tape y, le système complète s et ... attend
    sysconfig    syslog.conf    syslog.conf.inn
    $ cd  /etc/sysc<TAB>          # on ajoute c, le système complète aussitôt à sysconfig
    $ cd  /etc/sysconfig/ <Entr>

    Exo : poursuivre ainsi jusqu'à afficher le contenu du fichier de configuration de l'interface Ethernet  /etc/sysconfig/network-scripts/ifcfg-eth0


    Désigner un ensemble de fichiers


      TP 3

    Etudier et commenter les commandes suivantes, en étant connecté root
    Commande          Signification de cette commande ? que remarquez vous ?
    ll ~/m*
    cd
    ll  *.*                           où sont passés les autres fichiers ?
    ll  *                              que viennent ici faire les répertoires ?
    ll  *i*
    ll  [a-n]*
    ll  [an]*                      quelle différence ?
    ll  [^an]* | less
    ll  *.*htm*
    ll   [a-z]*/*.pl
    mkdir ~

    # lister tous les répertoires dont le nom commence par stage, avec une variable

    user=stage
    echo $user
    ll -d home/$user*
    

    Les commandes du shell

    référence : man bash

    Analyse de la ligne de commande

    TP 4

    Valeur de retour d'une commande

    Enchainement des commandes

      TP 5

    Si toto6 n'est pas un utilisateur valide ?
    [root@p00]$ grep toto6 /etc/passwd ;  echo $?
    le groupe root existe déjà, il ne peut pas être recréé,
    prévoir les codes de retour 
    [root@p00] #  $ who am i; echo $?; groupadd root; echo $?; date; echo $?
    

    Enchainement conditionnels des commandes

    Redirections des entrées-sorties

    Toutes les commandes (du noyau, du shell et créées par le programmeur) sont dotées par le système de 3 canaux de communication :


    TP 6

    Etudier et commenter les commandes suivantes
    1. Exemples :
      cd
      cat > essai.txt
      cat  essai.txt
      sort  < essai.txt
      cat  >> essai.txt
      sort  < essai.txt
      sort  < essai.txt  > essai-tri.txt
      cat essai-tri.txt
      cat  essai.txt  essai-tri.txt
      
    2. Quel est l'effet de la commande suivante ? Vérifiez
      (essai.txt est le fichier créé précédemment)
      wc -w  < essai.txt > mots.txt
      Que se passe t-il si on enlève l'option -w ?
      
    3. Pour obtenir le même affichage final, remplacez la séquence suivante par une seule commande
      cd /etc
      ll > /tmp/liste.txt   
      cat /tmp/liste.txt   
      wc -l < /tmp/liste.txt   
      
    4. ll
      ll /etc | less
      ll  |  sort
      ll  |  wc -l
      
    5. who
      who |  sort
      cat | sort > essai-pipe.txt
      Pouvez-vous prévoir la différence entre :
      cat  essai.txt | lpr
      cat  essai.txt > lpr
      
    6. Enregistrer dans un même fichier truc.txt, la liste des utilisateurs actuellement connectés, la date du jour, le nom de l'utilisateur actif et le rép. personnel trié.


    Substitution de commande

      TP 7


    Extraction de texte

    Voir filtres tr, grep, cut, sed ..