Le shell
Pourquoi ?
- Parce que les interfaces graphiques n’offrent pas autant d’automatisation du terminal
- Impossible de donner des arguments à un programme avec une interface graphique
- Parce que même des petits ordinateurs ont un terminal
- Parce que communiquer avec un ordinateur distant c’est plus simple en terminal
- Parce que générer du texte c’est plus simple que de cliquer dans une interface. Donc les agents IA peuvent facilement exécuter des commandes (avec les dangers que cela comporte…)
Invite de commande
L’invite de commande ressemble à ça :
nomdemachine:endroitoùonest$
En image :
💻:📌$
où 💻 est le nom de la machine et 📌 est le chemin où aller.
Par exemple petitchat:~/Documents/rapports.
où ~ désigne le répertoire home.
Basic commands
| To do… | write |
|---|---|
Going in the directory <oùaller> | cd <oùaller> |
| Going to the home directory | cd ~ |
| List the files | ls and better ls -l |
| Create a directory | mkdir <name> |
| Remove/delete sth | rm <what> |
| Search inside a file | grep whatIwantToSearchInsideTheFile FileName |
cd= change directorypwd= print working directory
Où sont mes programmes ?
Quand vous tapez python, gcc, ou autres dans le terminal, ça lance le programme. Mais où est le programme ? Il n’est pourtant pas dans le répertoire courant ! Pour savoir où se trouve un programme :
which python
Variable PATH
En fait, il y a une variable dite d’environnement qui s’appelle PATH et qui stocke les chemins où il faut regarder pour trouver un programme.
On peut afficher le contenu de la variable PATH :
echo $PATH
Modification de PATH
Pour vos besoins personnels, vous pouvez modifier le fichier ~/.profile qui peut modifier la variable PATH pour rajouter un nouveau chemin.
Une fois modifié, pour que le bash lise le fichier, on fait :
source ~/.profile
Le manuel
man echo
man ls
Redirection = reading/writing data from files
By default
By default, a program is just taking its input in the terminal (stdin) and outputs in the terminal (stdout).
Input from a file
./monprogramme < inputTextFile.txt
./monprogramme < inputTextFile.txt > outputTextFile.txt
On peut aussi utiliser >> pour ajouter des données à un fichier (s’il existe, sinon ça le crée) alors que > écrase le contenu.
./monprogramme < inputTextFile.txt >> outputTextFile.txt
Tube : enchaîner des programmes
ls -l | grep key | less
- list of the files, one per line
- then we keep the lines containing the word “key”
- then we show the result in a scrolling page with
less
Gestion des droits des fichiers sous UNIX
Connaître les droits d’un fichier
Avec ls -l, on connaît les droits des fichiers dans le répartoire courant. Avec ls -l fichier.txt, on connaît les droits du fichier fichier.txt.
Une ligne comme
-rwxr-xr-x 1 fschwarz logica 25648 Oct 13 13:56 a.out
se lit comme :
| Type de fichier | Droit du propriétaire 👩 | Droit du groupe 🏠 | Droit des autres 🐱🐶 | Nom du propriétaire 👩 | Nom du groupe 🏠 |
|---|---|---|---|---|---|
- | r w x | r - x | r - x | fschwarz | logica |
où
rsignifie que l’on peut lire le fichier 👁wsignifique que l’on peut écrire 🖊xsignifie que l’on peut exécuter ⚙
Le type de fichier peut être :
| Symbole | Type de fichier | Exemple |
|---|---|---|
| - | Fichier régulier (normal) | fichier.txt |
| d | Dossier (directory) | /home/user/ |
| l | Lien symbolique | raccourci -> /etc/passwd |
| c | Périphérique caractère (e.g. terminal) | /dev/tty |
| b | Périphérique bloc (e.g. disque dur) | /dev/sda |
| p | Pipe nommé (FIFO) | /tmp/ma_fifo |
| s | Socket | /var/run/docker.sock |
Changer les droits
chmod
Changer les droits d’un utilisateur
Concaténer des fichiers
cat file1.txt file2.txt file3.txt
affiche le contenu de file1.txt, file2.txt et file3.txt sur la sortie standard.
La commande
cat file1.txt file2.txt file3.txt > combinedfile.txt
redirige la sortie standard et l’écrit dans le fichier combinedfile.txt. Autrement, on a effectué la concaténation des trois fichiers.
Rechercher
Find
On cherche des fichiers avec leur nom.
find oùchercher -maxdepth 2 -name 'nomdufichieroupattern'
find ~/teaching -name 'td*.pdf'
grep (Globally search a Regular Expression and Print)
grep "patternToSearchForInsideFiles" filenameOrPatternOfFileName
grep "Python" notes.txt
- Chercher récursivement dans les sous-dossiers :
grep -r "abricot" * - Ignorer la casse :
grep -i "abricot" panierdefruits.txt - Compter le nombre d’abricots :
grep -c "abricot" panierdefruits.txt - Obtenir les lignes qui ne contiennent pas un pattern :
grep -v "abricot" panierdefruits.txt - Chercher exactement les lignes :
grep -x "abricot" panierdefruits.txt
Exemples
Modifier la brillance de l’écran
Voici un programme qui cherche le fichier brightness, puis tente d’écrire 3 à l’intérieur.
$ sudo find -L /sys/class/backlight -maxdepth 2 -name '*brightness*'
/sys/class/backlight/intel_backlight/brightness
$ cd /sys/class/backlight/intel_backlight/
$ echo 3 > brightness
Ca ne fonctionne pas pour des raisons de droit.
$ sudo echo 3 > brightness
Le problème est que sudo ne donne des droits que sur des programmes et > est exécuté par le shell. Pour déléguer la redirection (l’ouverture du fichier brightness) au root, on peut utiliser le programme tee.
$ echo 3 > sudo tee brightness
Racourcis clavier
| Pour faire…. | Faire |
|---|---|
| Aller au début de ligne | Ctrl + A |
| Aller à la fin de ligne | Ctrl + E |
| Supprimer tout ce qu’il y a après le curseur | Ctrl + K |
| Pour coller ce qu’il y avait | Ctrl + Y |
| Pour enlever la commande courante | Ctrl + C |
| Rechercher une commande qu’on a écrite il y a longtemps | Ctrl + R |
Références
- https://missing.csail.mit.edu/2020/course-shell/
- https://www.geeksforgeeks.org/linux-unix/
- https://explainshell.com/ outil en ligne qui explique les lignes de commande