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.

~ désigne le répertoire home.

Basic commands

To do...write
Going in the directory <oùaller>cd <oùaller>
Going to the home directorycd ~
List the filesls and better ls -l
Create a directorymkdir <name>
Remove/delete sthrm <what>
Search inside a filegrep whatIwantToSearchInsideTheFile FileName
  • cd = change directory
  • pwd = 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 fichierDroit du propriétaire 👩Droit du groupe 🏠Droit des autres 🐱🐶Nom du propriétaire 👩Nom du groupe 🏠 
-r w xr - xr - xfschwarzlogica

  • r signifie que l'on peut lire le fichier 👁
  • w signifique que l'on peut écrire 🖊
  • x signifie que l'on peut exécuter ⚙

Le type de fichier peut être :

SymboleType de fichierExemple
-Fichier régulier (normal)fichier.txt
dDossier (directory)/home/user/
lLien symboliqueraccourci -> /etc/passwd
cPériphérique caractère (e.g. terminal)/dev/tty
bPériphérique bloc (e.g. disque dur)/dev/sda
pPipe nommé (FIFO)/tmp/ma_fifo
sSocket/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 ligneCtrl + A
Aller à la fin de ligneCtrl + E
Supprimer tout ce qu'il y a après le curseurCtrl + K
Pour coller ce qu'il y avaitCtrl + Y
Pour enlever la commande couranteCtrl + C
Rechercher une commande qu'on a écrite il y a longtempsCtrl + R

Références

  • https://missing.csail.mit.edu/2020/course-shell/
  • https://www.geeksforgeeks.org/linux-unix/