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

    Hélas, ils diffèrent grandement d'une distribution GNU/Linux à une autre.
    1. Le script /etc/profile est d'abord exécuté pour tous les utilisateurs y compris root. On y trouve la définition initiale du PATH et de umask
    2. Sur distribution Debian, ce fichier est très sobre : le parcourir et le commenter
    3. sur distribution Mandriva, on y trouve l'exécution de tous les scripts /etc/profile.d/*.sh, grâce à la boucle -à comprendre !-:
      for i in /etc/profile.d/*.sh ; do
        if [ -x $i ] ; then
          .$i
        fi
      done
      
      En particulier, parcourir les alias.sh et numlock.sh
    4. Ensuite, il y a exécution de $HOME/.bash_profile (la variable $HOME contient le chemin vers le répertoire personnel). Contrairement à /etc/profile, il s'agit ainsi d'un fichier de démarrage personnel et paramétrable.
    5. A son tour, il exécute $HOME/.bashrc, s'il existe, dans lequel il est recommandé de placer toutes les fonctions ou alias personnels
    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

    Ceci concerne les comptes créés directement sur le système. Chaque utilisateur peut ajouter des commandes shell au fichier de profil personnel, ~/.bash_profile
    Par exemple, voici ce que l'on peut écrire à 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


    TP 1

    1. Connexion distante au système
    2. Tester la connexion à distance par ssh sur une machine cliente. Si vous ne disposez que de Windows, utilisez putty.
    3. Personnaliser le script /etc/bashrc, en faisant afficher un message de bienvenue aux utilisateurs.

    4. Vous constatez que les personnes qui se connectent au système directement (et non par WEB ou par SAMBA) laissent des traces visibles dans leur répertoires personnels .. Le fichier /home/$USER/.bash_history est créé lors de leur déconnexion. Que contient-il ?
      Personnaliser (créer si besoin avec touch) le script .bash_logout situé dans votre répertoire personnel pour que ce fichier 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.

    5. Prolongement
      Définir 2 variables quelconques à la fin de /etc/profile dont une seule est exportée
      Reloguez vous. Pouvez-vous afficher (avec echo) ces 2 variables ?
      Placez-vous dans un shell enfant par la commande sh. Les 2 variables y sont-elles disponibles ?
      Revenez au shell parent par exit. Même question et conclusion.


    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'utilisteur, renvoie à son répertoire personnel (ainsi la commande cd ~stage conduit à /home/stage)

    Compléter une commande


    TP 2

    1. 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.

    2. [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
    3. Expérimenter
      $ cd  /etc <TAB>
      there are 216 possibilities. Do you really wish to see them all ? (y or n)
      $ cd  /etc/s <TAB>
      samba/  ssh/  security   services   
      syslog.conf   etc ..
      $ cd  /etc/sys<TAB>           
      # on tape y, le système complète s et ... attend
      sysconfig/   syslog.conf    ...
      $ cd  /etc/sysc<TAB>         
      # on ajoute co, le système complète aussitôt à
      sysconfig
      $ cd  /etc/sysconfig/ <Entr>
      Puis afficher le contenu du fichier de configuration
      de l'interface Ethernet  /etc/sysconfig/network-scripts/ifcfg-eth0
      $ less n <TAB>
      
    4. Je sais que la commande de changement de propriété d'un fichier commence par ch, mais je ne me souviens plus de la suite.
      Comment la retrouver ?

    5. Quel est l'ensemble des exécutables (dont vous avez bien sûr le droit d'exécutiion) commençant par a ? par w ?
      Essayer de trouver dans quels répertoires se trouvent ces fichiers ?

    6. Faites connaitre vos exécutables personnels du système !
      1. Taper b <TAB> --> combien d'exécutables commençant par b ?
      2. Se placer dans son répertoire personnel, par exemple /home/jean. Y créer un sous-répertoire /bin dans lequel il faut créer un fichier, nommé bidon, même vide, avec des droits d'exécution pour tous.
      3. REtaper b <TAB> --> y a t-il un changement ?
      4. Ajouter le répertoire /home/jean/bin à la variable d'environnement PATH (voir supra)
      5. Retester --> vos impressions ?


    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

    Etudier les exemples suivants Dans le fichier /etc/httpd/conf/commonhttpd.conf, utiliser grep -ni pour rechercher les numéros des lignes contenant un des mots-clés suivant, sans tenir compte de la casse : userdir , directoryIndex , indexes


    Valeur de retour d'une commande

    Enchainement des commandes


      TP 5

    Prévoir les résultats de scommandes :
    Supposons que toto6 ne soit pas un utilisateur connu du système
    [root@se3pdc]#  grep toto6 /etc/passwd ;  echo $?
    On sait que le groupe root existe déjà
    [root@se3pdc] # who am i; echo $?; groupadd root; echo $?
    [root@se3pdc] # date; echo $?
    [root@se3pdc] # date > /dev/null; 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 > wc
      cat  essai.txt | wc
      
    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