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
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
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/