Terminal

Sous unix, dans un «terminal (virtuel)», on peut taper des «lignes de commande», qui sont interprétées par un «shell».

Terminal dans une fenêtre

Des applications comme konsole ou xterm ouvrent une fenêtre contenant un terminal. konsole est plus sophistiqué que xterm. Par exemple, une fenêtre de konsole peut gérer plusieurs terminaux qui sont chacun dans un onglet.

Terminal sans fenêtre

On peut basculer entre plusieurs terminaux non graphiques en tapant ctrl+alt+F2, ctrl+alt+F3, ... ou ctlr+alt+F7. On revient au système de fenêtrage en tapant ctrl+alt+F1. Quand on utilise un de ces terminaux pour la première fois, il faut d'abord se connecter (login:guest password:pn2018m...).

Shell

Dans un terminal, un interpréteur de commandes (aussi appelé «shell») affiche une invite de commande (aussi appelée «prompt») qui se termine en général par $, et attend que l'on tape une ligne de commande. Il exècute alors la commande. Quand cette commande est terminée, le prompt réapparaît dans l'attente d'une autre commande. Et ainsi de suite.

Répertoire courant et commandes pwd et cd

L'ensemble des répertoires (ou dossiers) forment une arborescence. Un shell a toujours un répertoire courant, qui est utilisé par défaut. En général le nom du répertoire courant se trouve dans le prompt juste avant le $. Mais on peut afficher le chemin d'accès complet au répertoire courant en tapant la commande pwd (Print Working Directory). On peut changer le répertoire courant avec la commande cd (Change Directory). Par exemple, si le fichier /home/guest/TD1/somme.c existe : guest$ pwd /home/guest guest$ cd .. home$ pwd /home home$ cd .. /$ pwd / /$ cd ~ guest$ cd TD1 TD1$ pwd /home/guest/TD1

Chemins d'accès et sous-répertoires . et ..

Un chemin d'accès (à un fichier ou à un répertoire) part de la racine de l'arborescence si il commence par /. Il part de /home/guest/ si il commence par ~ ou ~guest. Sinon il part du répertoire courant. Par exemple après la commande cd ~/TD1 les chemins suivants mènent tous au même fichier : /home/guest/TD1/somme.c ~/TD1/somme.c ~guest/TD1/somme.c somme.c ./somme.c ../TD1/somme.c ../../guest/TD1/somme.c ~/../guest/./TD1/somme.c Dans un chemin, .. fait remonter au répertoire parent, et . fait rester dans le même répertoire.

Création et suppression de sous-répertoires avec les commandes mkdir et rmdir

mkdir (MaKe DIRectory) crée un sous-répetoire dans un répertoire existant.
rmdir (ReMove DIRectory) détruit un sous-répetoire vide. Par exemple :
mkdir ~/TDécrée le sous-répertoire TDé dans le répertoire /home/guest/.
rmdir ~/TDédétruit ce répertoire.
mkdir ~/TD2crée le sous-répertoire TD2 dans le répertoire /home/guest/.

Copie, suppression, déplacement ou renommage de fichiers avec les commandes cp, rm et mv

cp (CoPy) crée une copie d'un fichier sous un autre nom.
rm (ReMove) détruit un fichier.
mv (MoVe) change le chemin d'accès d'un fichier. Cela peut se réduire à changer son nom, en le gardant dans le même répertoire. Mais cela peut aussi l'amener sur un autre disque, auquel cas le fichier est écrit sur le nouveau disque puis effacé de l'ancien. Par exemple :
cp ~/TD1/somme.c ~/TD2/vube.c copie un fichier
mv ~/TD2/vube.c ~/TD2/cube.c renomme la copie
rm ~/TD2/cube.cpuis la supprime
cp ~/TD1 ~/TD3 -rfait une copie (Récursive) du répertoire avec tout ce qu'il contient.
rm ~/TD3 -refface le répertoire et tout ce qu'il contient
mkdir ~/TD4
cd ~/TD4
cp ../TD1/*.c .copie tous les fichiers sources C de ~/TD1 dans ~/TD4 en gardant leur nom
mv somme.c cube.crenomme ~/TD4/somme.c en ~/TD4/cube.c
cp ~/TD1 /mnt/CLE_USB -r

La commande ls

La commande ls donne la LiSte de tous les fichiers d'un répertoire dont le nom a une certaine forme. Par exemple :
ls donne les noms des fichiers du répertoire courant.
ls ~/TD1/*.c donne les noms des fichiers source C du répertoire TD1.

La commande man

man (MANuel) permet de savoir tout ce que peut faire une commande unix, ou une fonction C. Par exemple man cp man rm man 3 printf man 3 sqrt

tab et ↑ dans une ligne de commande

Lorsque l'on tape un chemin d'accès dans une ligne de commande, on peut taper seulement le début de ce chemin et demander au shell de le prolonger en pressant la touche TAB. Si il y a plusieurs complétions possibles il n'écrira que la partie commune, mais les affichera toutes si on represse TAB.
Quand on a le prompt du shell, au lieu de taper une commande en entier, on peut faire défiler les commandes tapées précédemment en utilisant les touches ↑ (et ↓ si on est allé trop loin). On peut alors relancer cette commande (après l'avoir éventuellement modifiée ou corrigée).

exit ou ctrl+D

La commande exit ou ctrl+D arrête (définitivement) le shell.
Si le shell était dans une fenêtre xterm cela ferme cette fenêtre.
Si il était dans un onglet de konsole cela ferme cet onglet, et la fenêtre aussi, si c'était le dernier onglet.
Si il était dans un terminal atteint par ctrl+alt+F4, cela ferme la session, et le prompt de login réapparaît pour pouvoir ouvrir une autre session.
Si il avait été lancé dans un autre shell, par une commande sh ou bash on revient à cet autre shell. (Oui on peut lancer un shell dans un shell.) (Oui sh et bash sont deux shells différents et il en existe encore d'autres.)

Tâches en arrière-plan, ctrl+C, ctrl+Z, fg, bg et jobs

Quand une commande prend beaucoup de temps à s'exécuter, on est a priori obligé d'attendre qu'elle se termine pour avoir le prompt et en lancer une autre.
Si on pense qu'elle est trop longue et que l'on regrette de l'avoir lancée, on peut l'interrompre définitivement en tapant ctrl+C.
Si on ne veut pas la tuer mais que l'on veut quand même reprendre la main pour exécuter une autre commande, on peut l'interrompre temporairement en tapant ctrl+Z. On pourra poursuivre l'exécution de cette commande interrompue en tapant fg (ForeGround, premier plan). Ainsi on perdra de nouveau la main jusqu'à ce qu'elle se termine. Mais on peut aussi la relancer en arrière plan en tapant bg (BackGround). Elle n'aura plus accès au terminal dans lequel on pourra exécuter d'autres commandes.
Au lieu de taper
firefoxOn lance le navigateur.
ctrl+ZOn l'interrompt temporairement.
bgOn le relance en arrière-plan.
On peut le lancer directement en arrière-plan avec la commande
firefox&
Par exemple quand on a une fenêtre xterm et que l'on veut en ouvrir une deuxième, il suffit de taper xterm& dans la première.
Quand on a plusieurs tâches interrompues il faut préciser laquelle on veut relancer avec fg ou bg en tapant par exemple fg %2. Pour connaître le numéro des tâches interrompues on peut taper la commande jobs

Editeur de texte vi

Pour créer ou modifier un fichier de texte, comme du source C, on peut utiliser un «éditeur de texte». Il en existe de nombreux, comme vi, vim, emacs ou nano. On entre dans l'éditeur en tapant la commande
vi ~/TD1/somme.c
Une fois dans vi, on entre dans le mode INSERTION en tapant une des touches INS, a, i, o ou O. Dans ce mode ce qui est tapé s'insère dans le texte édité à la position du curseur. La touche INS permet de basculer entre les modes INSERTION et REMPLACEMENT. Dans le mode REMPLACEMENT le texte tapé s'écrit par dessus l'ancien texte. La touche ESC(ape) ou Echap(ement) fait sortir des modes INSERTION ou REMPLACEMENT, et fait revenir au mode «normal» de vi, dans lequel les lettres tapées ne sont pas mises dans le texte édité, mais représentent des commandes de vi. On peut taper par exemple :
a qui Ajoute du texte après le curseur,
i qui Insère du texte avant le curseur,
o qui insère une ligne après la ligne courante,
O qui insère une ligne avant la ligne courante,
dd qui efface la ligne courante,
10dd qui efface 10 lignes,
dw qui efface un mot (Delete Word),
4dw qui efface 4 mots,
5dl qui efface 5 Lettres,
d$ qui efface la fin de la ligne,
d^ qui efface le début de la ligne,
yy qui copie la ligne courante (dans le buffer)
5yw qui copie 5 mots
p qui colle (Paste) derrière le curseur, le dernier morceau de texte effacé ou copié,
P qui colle avant le curseur,
5p qui colle 5 fois,
u qui défait (Undo) le dernier changement,
4u qui défait les 4 derniers changements,
ctrl+R qui Refait le dernier changement défait,
. qui refait la dernière modification,
J qui Joint deux lignes,
7J qui joint 7 lignes,
:$ qui va à la fin du texte,
:13 qui va en ligne 13,
/truc qui va à la prochaine occurence de truc,
* qui va à la prochaine occurence du mot sous le curseur,
# qui va à la précédente occurence du mot sous le curseur,
n qui va à la prochaine (Next) occurence,
N qui va à la précédente occurence,
:w qui écrit (Write) le texte dans le fichier,
:q qui Quitte vi,
:!... qui exécute une commande unix,
:%s/\<truc\>/machin/g qui remplace toutes les occurences du mot truc par machin.
Sans le % la substitution se fait uniquement sur la ligne courante. Sans le g final, elle se fait seulement une fois par ligne. \< représente un début de mot. \> représente une fin de mot. Cela évite que structure devienne smachinture.

Compilation et exécution

On peut transformer le fichier source C /home/guest/TD1/somme.c en un fichier exécutable /home/guest/TD1/a.out puis l'exécuter grâce aux commandes : cd ~/TD1 gcc -Wall somme.c ./a.out On aurait pu appeler l'exécutable somme plutôt que a.out : gcc -Wall somme.c -osomme ./somme On peut utiliser deux fenêtres xterm. Dans la première on lance la commande vi ~/TD1/somme.c. A chaque nouvelle version du programme on tape :w dans vi pour sauver le fichier /home/guest/TD1/somme.c sur le disque, puis dans la deuxième fenêtre xterm, on le compile avec gcc puis on l'exécute.
Au lieu de deux fenêtres xterm on peut aussi utiliser deux onglets d'une seule fenêtre konsole.
On peut aussi utiliser une seule fenêtre xterm et sous vi taper  :w  puis  :!gcc % -Wall  puis  :!./a.out . Dans la commande unix qui suit  :!  un % remplace le nom du fichier édité. Comme dans tout shell, aprés  :!  on peut taper ↑ (et ↓) pour rappeler les commandes précédentes.

codeblocks

Au lancement de codeblocks on peut choisir
«créer un nouveau projet»
«console application» (et cliquer sur «go» puis «next»)
«C» plutôt que «C++» (et cliquer sur «next»)
titre du projet : img
répertoire où créer le projet : /home/guest/TD1/
nom du fichier du projet : img.cbp
nom de fichier qui en résulte : /home/guest/TD1/img.cbp (et cliquer sur «next»).
Dans la dernière fenêtre, on vide les champs «output dir» et «objects output dir».
Alors le fichier source sera /home/guest/TD1/img/main.c et on peut si on veut taper dans une fenêtre xterm : cd ~/TD1/img ls gcc main.c -Wall ./a.out