8.2. Utilisation du shell#

Le shell est l’interface de commande historique, développée vers 1970 par Ken Thomson et Brian Ritchie avec Unix. Cette interface permet de contrôler tout le comportement d’un ordinateur :

  • exécuter des programmes

  • consulter/éditer des fichiers

  • copier/déplacer des fichiers

Bien que la conception de cette interface remonte aux année 1970, elle est toujours utilisée de nos jours, en particulier pour la gestion des serveurs sur Internet ou pour l’automatisation de la construction des logiciels.

On peut noter ces deux citations.

Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface. (Doug McIlroy)

What I saw in the Xerox PARC technology was the caveman interface, you point and you grunt. A massive winding down, regressing away from language, in order to address the technological nervousness of the user. (Attributed to an IBM technician lambasting the Apple Lisa, c. 1979)

8.2.1. Savoir se repérer/déplacer#

Avant de pouvoir agir sur des fichiers, il faut savoir où on se trouve.

La commande pwd permet de savoir où on est.

pwd
/builds/lamadone/informatique/premiere-nsi/jupyter/os/cours

La commande ls permet de lister le contenu d’un répertoire :

ls -lh
total 56K
-rw-rw-rw- 1 root root   80 Feb 10 20:14 fichier.py
-rw-rw-rw- 1 root root 1.7K Feb 10 20:14 generalites.md
-rw-rw-rw- 1 root root  40K Feb 10 20:14 schema_exec.svg
-rw-rw-rw- 1 root root 6.6K Feb 10 20:14 shell.md

Chaque ligne commence par un groupe de 10 caractères : 1 + 3 + 3 + 3 correspondant

  • au type de fichier : - pour un fichier normal, d pour un répertoire ;

  • aux permissions : du propriétaire (premier groupe), du groupe (deuxième groupe) et du reste du monde (other)

    • r signifie que le propriétaire, groupe ou le reste peut lire le fichier ;

    • w signifie que le propriétaire, groupe ou le reste peut écrire dans le fichier ;

    • x signifie que le propriétaire, groupe ou le reste peut exécuter le fichier.

Note

Un répertoire doit être exécutable pour être « traversé ».

Example 8.1

  • -rwx------ est un fichier lisible et inscriptible par l’utilisateur seulement ;

  • drwxr-xr-x est un dossier lisible par tous et dans lequel l’utilisateur peut écrire

  • -rwxr-xr-- est par exemple un fichier python écrit par le propriétaire, lisible et exécutable par le groupe et lisible uniquement par le reste du monde.

8.2.2. Utiliser des commandes basiques :#

Afficher le contenu d’un fichier :

cat fichier.py
def hello():
    print("Hello world!")


if __name__ == '__main__':
    hello()

Recherche d’un motif dans un fichier :

grep hello fichier.py
def hello():
    hello()

Écraser le contenu d’un fichier :

echo "Texte" > fichier
cat fichier
Texte
echo nouveau > fichier
cat fichier
nouveau

Écrire à la fin d’un fichier

echo Texte >> fichier
cat fichier
nouveau
Texte

8.2.3. Manipuler les emplacements de fichier#

mkdir dossier
pwd
/tmp/demo
ls -l
total 4
drwxr-xr-x 2 root root 4096 Feb 10 20:18 dossier

Changer le répertoire relativement au cwd actuel.

cd dossier
pwd
/tmp/demo/dossier

Changer le répertoire pour le répertoire parent du cwd.

cd ..
pwd
/tmp/demo

Se déplacer dans le répertoire /chemin/complet et ce quelque soit l’actuel cwd.

pwd
cd /tmp/demo
pwd
/builds/lamadone/informatique/premiere-nsi/jupyter/os/cours
/tmp/demo

Créer le repertoire relativement au cwd.

mkdir rerpetoire
ls -lh
total 8.0K
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 dossier
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 rerpetoire

Créer le répertoire dans le sous répertoire /chemin/vers/.

pwd
mkdir /tmp/demo/autre/
ls -lh
cd /tmp/demo
ls -lh
/builds/lamadone/informatique/premiere-nsi/jupyter/os/cours
total 60K
-rw-r--r-- 1 root root   14 Feb 10 20:18 fichier
-rw-rw-rw- 1 root root   80 Feb 10 20:14 fichier.py
-rw-rw-rw- 1 root root 1.7K Feb 10 20:14 generalites.md
-rw-rw-rw- 1 root root  40K Feb 10 20:14 schema_exec.svg
-rw-rw-rw- 1 root root 6.6K Feb 10 20:14 shell.md
total 12K
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 autre
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 dossier
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 rerpetoire

Copier la source dans la destination.

cd $gcwd
pwd
ls -lh
cp fichier.py /tmp/demo
/builds/lamadone/informatique/premiere-nsi/jupyter/os/cours
total 60K
-rw-r--r-- 1 root root   14 Feb 10 20:18 fichier
-rw-rw-rw- 1 root root   80 Feb 10 20:14 fichier.py
-rw-rw-rw- 1 root root 1.7K Feb 10 20:14 generalites.md
-rw-rw-rw- 1 root root  40K Feb 10 20:14 schema_exec.svg
-rw-rw-rw- 1 root root 6.6K Feb 10 20:14 shell.md
ls -lh fichier.py
-rw-rw-rw- 1 root root 80 Feb 10 20:14 fichier.py
ls -lh /tmp/demo
total 16K
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 autre
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 dossier
-rw-r--r-- 1 root root   80 Feb 10 20:18 fichier.py
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 rerpetoire

Note

La commande diff permet de voir les différences entre deux fichiers textes.

diff -Naur fichier.py /tmp/demo/fichier.py
echo "    hello()" >> /tmp/demo/fichier.py
diff -Naur fichier.py /tmp/demo/fichier.py
--- fichier.py	2025-02-10 20:14:33.152442419 +0000
+++ /tmp/demo/fichier.py	2025-02-10 20:18:23.856061687 +0000
@@ -4,3 +4,4 @@
 
 if __name__ == '__main__':
     hello()
+    hello()

Déplacer ou renommer la source en destination

mv /tmp/demo/fichier.py /tmp/demo/fichier_new.py
ls -lh /tmp/demo
total 16K
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 autre
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 dossier
-rw-r--r-- 1 root root   92 Feb 10 20:18 fichier_new.py
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 rerpetoire

Supprimer définitivement le fichier

rm /tmp/demo/fichier_new.py
ls -lh /tmp/demo
total 12K
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 autre
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 dossier
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 rerpetoire
mv /tmp/demo/dossier /tmp/demo/autre
ls -lh /tmp/demo/
total 8.0K
drwxr-xr-x 3 root root 4.0K Feb 10 20:18 autre
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 rerpetoire
ls -lh /tmp/demo/autre
total 4.0K
drwxr-xr-x 2 root root 4.0K Feb 10 20:18 dossier
rmdir /tmp/demo/autre
rmdir: failed to remove '/tmp/demo/autre': Directory not empty

rmdir /tmp/demo/autre/dossier
ls -lh /tmp/demo/autre/
total 0

Supprimer définitivement un dossier vide.

if [ -d /tmp/demo ] ; then
    rm -rf /tmp/demo
fi
if [ -e fichier ] ; then
    rm -rf fichier
fi

Exercices sur le shell