Aller au contenu

Bash à sable

Le but de ce TP d'introduction est de se familiariser avec l'environnement Unix Ubuntu et de voir quelques outils, notamment bash, que vous utiliserez par la suite dans les TPs. Nous allons voir comment :

  • créer/supprimer des fichiers/répertoires (éventuellement récursivement)
  • écrire un script bash pour manipuler des fichiers, changer leurs droits
  • rechercher/installer des packages
  • ...

Prise en main

Pendant tous les TPs, nous allons utiliser deux outils : la console (ou terminal) et l'éditeur emacs. Les scripts seront exécutés depuis un terminal et écrits avec emacs.

Sous Gnome 3, pour afficher la liste des applications disponibles, déplacez le curseur de la souris dans le coin en haut à gauche de l’écran ou appuyez sur la touche Windows. Tapez « Terminal » puis cliquez sur l'application correspondante.

C’est dans ce terminal que nous allons exécuter nos scripts, créer des répertoires, etc.

Terminal (ou console)

Pourquoi passer par le terminal ? Je vous l'accorde, à première vue, l'interface est austère. Le terminal est une interface pour interagir avec le shell. Bash est un shell, un langage de programmation qui va vous offrir énormément de flexibilité dans la construction de commandes personnalisées. Grâce au Bash, vous pouvez combiner des commandes simples pour construire un programme plus compliqué. Pour l'instant, cela reste abstrait, mais plusieurs exemples ci-après vont l'illustrer. Faites-moi confiance.

Si vous vous posez des questions sur une commande, peut-être que le site https://explainshell.com pourrait vous être utile. Regardez par exemple ce qu'il propose sur la commande ls -p | grep -v / | wc -l

Quelques commandes de base à connaître :

  • ls : lister le contenu du répertoire courant
  • ls /chemin/vers/un/repertoire : lister un répertoire spécifique
  • pwd : afficher le chemin du répertoire courant
  • cd : changer de répertoire (cd .., cd ~)
  • mkdir : créer un répertoire (-p pour hiérarchique)
  • rm : supprimer un fichier (-r pour un répertoire)

Question

Créez un répertoire dans votre home (cd ~) pour y stocker vos scripts.

Rechercher/Installer des packages

Linux permet d’installer facilement des logiciels via un gestionnaire de paquets :

  • Sous Fedora :

    • yum search : chercher un paquet
    • yum install : installer
    • yum remove : désinstaller
  • Sous Ubuntu:

    • apt search :
    • apt install : installer
    • apt remove : désinstaller

L'installation par le gestionnaire de paquet est à privilégier puisqu'il va prendre en charger l'installation des dépendances notamment.

Les installations nécessitent les droits superutilisateur car elles modifient des dossiers système comme /usr/lib, /usr/bin, etc.

Éditer avec Emacs

emacs est un éditeur de texte (un IDE même, voir les IDE) très complet et configurable. Il offre :

  • coloration syntaxique
  • indentation
  • modes spécifiques selon l’extension (.py, .cpp, .sh, .tex, etc)

Question

Lancez ces commandes pour tester les modes :

emacs titi.py &
emacs titi.cpp &
emacs titi.sh &
emacs titi.tex &

Note

Utilisez & pour exécuter une commande en tâche de fond. Sans &, utilisez Ctrl+Z puis bg.

Bashons un peu

Le but est d'écrire de petits scripts et les assembler avec Bash.

Question

Lisez, exécutez, expérimentez avec les différents scripts Bash ci-dessous. Pour chaque script, vous pouvez le coder en utilisant emacs ou VS code et l'exécuter en suivant les instructions.

Mon premier script bash

Fichier hello.sh :

#!/bin/bash

echo "hello world!"

Exécution :

sh hello.sh

Puis :

chmod u+x hello.sh
./hello.sh

La ligne #!/bin/bash indique l’interpréteur à utiliser pour évaluer le script. C'est ce qu'on appelle le shebang.

Passer des arguments à un script bash

#!/bin/bash

echo "J'ai reçu $# arguments"

if [ $# != 0 ]; then
    echo "Liste des arguments :"
    for i in $@; do
        echo "$i"
    done
else
    echo "donc rien à lister"
fi

Fonctions utiles

#!/bin/bash

echo "Je m'exécute depuis le répertoire `pwd`"
echo "Le script $0 s'appelle `basename $0` et se trouve dans `dirname $0`"

Entrées et sorties standards

Une commande peut écrire sur :

  • stdout : sortie standard
  • stderr : sortie d’erreur
  • et recevoir via stdin : entrée standard

Entrées/Sorties

Enchaîner des scripts : filtres et pipe

Un pipe (|) connecte la sortie standard d’une commande à l’entrée standard d’une autre.

Exemples :

du * | sort -n
du * | sort -n | tail -10
ls -p | grep -v / | wc -l

Consultez man ls, man grep, man wc pour les détails.

Lire l'entrée standard dans un script

Fichier read_input.sh :

#!/bin/bash
while read -r ligne; do
    echo "Ligne lue : $ligne"
done

Test :

cat read_input.sh | ./read_input.sh

Aide sur les commandes

Utilisez man pour consulter l’aide :

man mkdir
Utilisez les flèches pour naviguer et q pour quitter.

Il existe plusieurs manières d'avoir de l'aide sur les commandes