Linux

Shell

L’interface en ligne de commande est appelée un shell et sur Ubuntu, le shell par défaut est bash.

Après vous être connecté, vous vous trouverez dans votre répertoire HOME. D’ordinaire, il se situe dans '/home/username' mais sur le cluster, votre home sera dans '/home_nfs/username'.

Ce répertoire est stocké sur le storage du noeud d’accueil du cluster et son contenu est partagé au travers du réseau.

Peu importe le serveur sur lequel vous serez, vous aurez toujours votre HOME et vos fichiers (representé par un ~ dans le prompt).

Voici les informations du prompt :

[demo@datamaster ~]$          (1)
[user@hostname   directory]$  (2)
1 Vous êtes l’utilisateur demo et vous vous trouvez dans votre répertoire home sur le serveur datamaster
2 Utilisateur@serveur répertoire
Table 1. Comparaison des dossiers utilisateurs entre Windows et Linux

Windows

Linux

Racine

c:\

/

Répertoire de l’utilisateur

C:\Utilisateurs\username

/home/username

Chemin des programmes

c:\Program Files\

/usr/bin/

Comment se déplacer dans l’arborescence

Voici un exemple qui montre comment se déplacer dans l’arborescence des fichiers :

[demo@datamaster ~]$ pwd
/home_nfs/demo

[demo@datamaster ~]$ mkdir scripts
[demo@datamaster ~]$ cd scripts
[demo@datamaster scripts]$ pwd
/home_nfs/demo/scripts

[demo@datamaster scripts]$ cd ..
[demo@datamaster ~]$ pwd
/home_nfs/demo/

[demo@datamaster ~]$ mkdir -p sources/python
[demo@datamaster ~]$ cd /home_nfs/demo/sources/python
[demo@datamaster python]$ pwd
/home_nfs/demo/sources/python
Table 2. Commande change directory

Retour au dossier home

cd

cd ~

Remonter dans l’arborescence

cd ..

Retour au dernier répertoire

cd -

Changer de répertoire relatif

cd ../../usr/local/share

Changer de répertoire absolu

cd /usr/local/share

Créer des fichiers et des dossiers

Il est possible de créer des fichiers de plusieurs manières.

La commande touch, qui sert à modifier la date de modification d’un fichier, permet aussi de créer un fichier vide si aucun autre fichier du dossier courant ne porte le nom donné en argument.

Créer un fichier vide avec touch
$ touch hello.txt
$ ls hello.txt -l
-rw-rw-r--. 1 demo demo 0 26 jun 11:50 hello.txt

Ce fichier peut-être ouvert avec un éditeur de texte comme nano ou vim.

Ouvrir un fichier avec nano
$ nano hello.txt (1)

$ cat hello.txt
Hello World !
...
$ ls hello.txt -l
-rw-rw-r--. 1 demo demo 342 26 jun 11:50 hello.txt
1 Voir capture ci-dessous.
nano
Figure 1. Nano

On peut aussi rediriger la sortie d’un programme vers un fichier :

Redirections de flux
$ ls /usr/lib/ -l >> apps.txt

$ ls -lh apps.txt
-rw-rw-r--. 1 guttadauriaa guttadauriaa 44K 26 jun 12:07 apps.txt
Faites attention, les doubles chevrons >> ajoute le flux en fin de fichier mais le simple chevron > remplace l’ancien contenu par le nouveau.

Effacer des fichiers et des dossiers

La commande rm permet de supprimer les fichiers.

Effacer des fichiers
$ rm hello.txt
$ ls hello.txt -l
-rw-rw-r--. 1 demo demo 0 26 jun 11:50 hello.txt

La commande rmdir permet de supprimer les dossiers vides.

Effacer un dossier
$ mkdir fichiers/
$ touch fichiers/hello.txt
$ ls hello.txt -l
-rw-rw-r--. 1 demo demo 0 26 jun 11:50 hello.txt
$ rmdir fichiers
rmdir: impossible de supprimer 'fichiers': Le dossier n\'est pas vide
$ rm fichiers/*.txt
$ rmdir fichiers

Programmes et Variables d’environnement

Dans les systèmes POSIX comme Linux, les programmes sont principalement installés dans le dossier /usr/bin/ pour les utilisateurs et /usr/sbin pour les commandes systèmes. Les bibliothèques de code utilisées par les applications se trouvent dans /usr/lib ou /usr/lib64.

On peut lancer l’exécution d’un programme en tapant son chemin complet dans un terminal :

Exécution des programmes
$ /usr/bin/g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0

Pour ne pas devoir taper les chemins complets vers les programmes, une variable dénommée PATH est définie. Elle contient une liste de dossiers où se trouvent les applications du système.

Grâce à elle, nous pouvons lancer les programmes par leurs noms :

Variable $PATH
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

$ gcc --version
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0

$ which gcc
/usr/bin/gcc

Ceci est valable pour les applications installées via le gestionnaire de logiciel du système mais pas si nous téléchargeons un programme manuellement dans notre dossier personnel.

Pour ceux-ci, nous devrons ajouter son dossier dans le PATH :

Ajouter un dossier dans le PATH
# Installation du langage Go
$ wget https://dl.google.com/go/go1.18.6.linux-amd64.tar.gz
$ tar -xf go1.18.6.linux-amd64.tar.gz -C ~/bin/

# Ajout du dossier dans le PATH
$ export PATH=$HOME/bin/go/bin:$PATH
/home_nfs/demo/bin/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

$ go version
go version go1.18.6 linux/amd64

$ which go
/home_nfs/demo/bin/go/bin/go

La modification de la variable PATH ne sera active que dans cette session et sera à refaire si on la quitte. Pour ne pas devoir le refaire à chaque session, nous pouvons ajouter la ligne dans notre fichier ~/.bashrc ou ~/.bash_profile.

$ echo 'export PATH=$HOME/bin/go/bin:$PATH' >> ~/.bashrc

Ce cas d’utilisation est très simple mais souvent les logiciels ont besoin de bibliothèques de code dynamique (.so sur Linux, .dll sur Windows). Il faut alors ajouter leurs dossiers à une autre variable dénommée $LD_LIBRARY_PATH. En outre, d’autres variables d’environnement peuvent être nécessaire à l’exécution ou la compilation de frameworks.

Viens ensuite un autre problème. Que faire si, par exemple, nous avions besoin d’utiliser différentes versions d’OpenMPI pour différents projets ? Plusieurs dossier menant à la commande mpirun existerait dans le path mais seul le premier serait utilisé.

Modifier ces variables manuellement devient vite fastidieux et sources d’erreurs. C’est pour régler ce genre de problèmes que les modules d’environnements ont été créés.

Scripts

Un script est un fichier contenant un ensemble d’instructions dans un langage interprétable comme bash, Python ou Ruby par exemple.

Voici un script bash qui écrit la chaîne "Hello World !" sur la sortie standard :

Contenu du fichier my_script.sh
#!/bin/bash
NAME=$1

if [[ -n $NAME ]]; then
    echo "Hello $NAME !"
    exit
fi

echo "Hello World !"
[demo@datamaster ~]$ ls scripts
my_script.sh
[demo@datamaster ~]$ ./scripts/my_script.sh Adriano  (1)
Hello Adriano !
[demo@datamaster ~]$ cd scripts
[demo@datamaster scripts]$ ./my_script.sh    (1)
Hello World !
[demo@datamaster scripts]$ cd -
[demo@datamaster ~]$ /home_nfs/demo/scripts/my_script.sh (2)
Hello World !
1 Chemins relatifs avec un argument
2 Chemin absolu (depuis la racine '/')

Le script doit être exécutable pour pouvoir l’utiliser directement. Voici comment faire pour vérifier et ajouter la permission d’exécution :

[demo@datamaster scripts]$ ls -l script.sh
-rw-rw-r--. 1 demo demo 104 29 jun 15:05 script.sh

[demo@datamaster scripts]$ chmod u+x script.sh

[demo@datamaster scripts]$ ls -l script.sh
-rwxrw-r--. 1 demo demo 104 29 jun 15:05 script.sh

Quelques commandes de base

ls

Afficher la liste des fichiers

cd

Change directory : se déplacer dans le système de fichiers

pwd

Present working directory : là où vous vous trouvez.

mkdir

Make directory : créer un nouveau répertoire

rm

Remove file : effacer un fihcier

rmdir

Remove directory : effacer un répertoire vide

file

Donner des informations sur un fichier

nano

éditeur de texte simple

vim

éditeur de texte avancé (quitter avec 'Escape :q')

ssh

Secure Shell : aller sur un autre serveur au travers d’une connexion chiffrée

htop

Afficher l’état de l’ordinateur (quitter avec 'q')

chmod

Change modificator : changer les permissions des fichiers ou répertoires

chown

Change owner : changer le propriétaire ou le groupe propriétaire d’un fichier ou dossier

man

Manual : afficher les pages de manuel d’une commande