==========================
Séance 1 : Prise en main
==========================
.. include:: commondefs.rst.inc
.. ifslides::
.. include:: credits.rst.inc
Pourquoi Linux ?
================
Open-source, et donc
* moins cher,
* plus sécurisé,
* plus portable *(que des alternatives commerciales)*.
Largement utilisé :
* serveurs, équipements réseau
* appareils Android
* autres « petits » appareils
(liseuses, raspberry pi...)
.. index:: noyau, distribution
Vocabulaire
-----------
* Linux est en fait le nom du **noyau** du système d'exploitation (SE).
* Un |SE| complet basé sur le noyau linux est appelé une **distribution**
(ou *distro*). Exemple :
.. hlist::
+ `Debian `_
+ `Ubuntu `_ (basée sur Debian)
+ `Fedora `_
+ `Arch Linux `_
+ `Slackware `_
+ ...
Pourquoi la ligne de commande ?
===============================
* travail à distance
* appareils peu puissants
* productif
* automatisable
.. index:: shell, bash
Le shell
========
* `shell`:eng: est le nom donné au programme qui gère la ligne de commande
* il en existe plusieurs versions, mais ``bash`` est la plus utilisée
.. nextslide::
* interaction typique avec le shell :
+ **affiche** une *invite* de commande
(traditionnellement terminée par ``$`` ou ``#``)
+ **analyse** le texte tapé
+ **exécute** le(s) programme(s) demandé(s)
(en lui/leur passant des arguments)
+ **attend** la fin de l'exécution,
puis recommence
.. _analyse_cli:
.. index:: guillemets
Analyse de la ligne de commande
-------------------------------
* Le shell découpe la ligne de commande au niveaux des *espaces*.
* Ce découpage donne une liste de chaînes de caractères :
+ la première est interprétée comme le nom du programme à exécuter,
+ les suivantes sont les arguments passés au programme.
* Pour inclure une (ou plusieurs) espace(s) dans un argument,
il faut encadrer cet argument par des guillemets (``"`` ou ``'``).
.. code-block::
# exemple
git commit --all -m "fixed bug #42"
.. nextslide::
* Une alternative pour inclure une espace dans un argument
consiste à la faire précéder par un anti-slash (``\``).
.. code-block::
# exemple
git commit --all -m fixed\ bug\ \#42
.. note::
Dans l'exemple ci-dessus, le caractère dièse (``#``)
nécessite également un anti-slash,
car lui aussi serait interprété par le shell (commentaire).
Dans la suite, nous verrons d'autres caractères spéciaux
utilisés par le shell pour analyser les lignes de commandes.
`Cet outil développé par Thierry Excoffier`__
permet de bien comprendre les mécanismes en œuvre dans cette analyse.
__ http://perso.univ-lyon1.fr/thierry.excoffier/MUNIX/test.html
.. index:: argument
Arguments d'un programme
------------------------
Les **arguments** d'un programme sont une liste de chaîne de caractères,
passée à ce programme à son lancement.
.. code-block:: c
int main(int argc, char* argv[]) {
/* ... */
}
Le programme est libre d'interpréter ces arguments comme il le souhaite,
mais il existe un certain nombre de *conventions*.
.. index:: option
Conventions courantes sur les arguments
---------------------------------------
* Un paramètre démarrant par un tiret (`-`) est une **option**,
qui altère le comportement du programme.
* Une option commençant par un seul tiret est composée d'une seule lettre
(exemple ``-h``, ``-V``).
Les options plus longues commencent par deux tirets
(exemple ``--help``, ``--version``).
* Plusieurs options courtes peuvent être combinées après un seul tiret
(exemple ``-la`` au lieu de ``-l -a``).
* L'option ``--help`` sert à afficher une courte documentation de la commande.
Quelques commandes de base
==========================
.. contents::
:local:
man [section] / man [options]
----------------------------------------
.. program:: man
Affiche une page du "manuel" (documentation).
.. describe::
La commande dont on souhaite afficher le manuel.
.. describe:: [section]
Éventuellement, le numéro de section du manuel.
.. option:: -k, --apropos
Liste toutes les pages du manuel contenant ``texte``.
echo [options]
--------------------------
.. program:: echo
Affiche les arguments, séparés par des espaces.
.. option:: -n
N'affiche *pas* de retour à la ligne après les arguments.
more [ficher]
-------------
.. program:: more
Affiche un fichier de manière paginée.
* *entrée* ou *espace* avance d'une page
* CTRL+C quitte le programme
.. hint::
CTRL+C n'est pas une instruction spécifique à ``more``;
cela interomp la plupart des programmes lancés en ligne de commande.
id [options] [utilisateur]
--------------------------
.. program:: id
Affiche des informations sur un utilisateur.
.. describe:: utilisateur
Nom ou numéro d'utilisateur (défaut : utilisateur courant).
.. option:: -u, --user
Affiche uniquement l'identifiant de l'utilisateur.
.. option:: -G, --groups
Affiche uniquement les groupes auxquels appartient l'utilisateur.
.. option:: -n, --name
Affiche l'identifiant textuel au lieu de l'identifiant numérique
(avec ``-u`` ou ``-g``).
date [options] [+format]
------------------------
.. program:: date
Affiche une date au format demandé.
.. option:: -d, --date=STRING
La date à afficher (défaut : date courrante)
.. describe:: +format
Format à utiliser pour l'affichage, cf. `man date`.
Exemples :
* ``"+%d/%m/%y"`` affiche jour/mois/année (sur 2 chiffres)
* ``+%A`` affiche uniquement le jour de la semaine
* ``+%W`` affiche le numéro de la semaine
.. note::
La valeur passée à ``--date`` accepte de nombreux formats différents,
y compris des expressions comme « `tomorrow`:eng: » ou « `2 years ago`:eng: ».
Attention cependant au format ``xx/yy/zzzz``,
il est généralement interprété à l'américaine : mois/jour/année.
Il vaut mieux lui préférer le format ``aaaa-mm-jj``.
Travaux dirigés
===============
.. ifslides::
`Consultez les ici <../s1.html#travaux-diriges>`_
.. ifnotslides::
Lancement d'une machine virtuelle Linux
---------------------------------------
* Ouvrir le fichier ``D:\VMWARE_images\PA.Champin\Ubuntu 19.10.ova`` avec `Vmware workstation`:eng:.
* Choisissez comme répertoire destination un sous-répertoire de ``D:\``
(n'utilisez **pas** un répertoire réseau, cela serait beaucoup trop lent).
* En cas d'erreur, cliquez sur *Retry*.
* Le mot de passe est ``etudiant``.
* Une fois la machine virtuelle démarrée, ouvrez un terminal en cliquant sur l'icône correspondante.
.. figure:: _static/terminal.png
Icône "Terminal"
Utilisation de commandes
------------------------
* affichez avec ``more`` tout le contenu du fichier ``/etc/passwd``
* affichez avec ``more`` les premières pages du fichier ``/var/log/syslog``,
puis quittez le programme
* en utilisant ``echo``, affichez ``bonjour le monde``
* affichez maintenant ``bonjour le MONDE !`` (avec deux espaces avant et après « monde »)
* en utilisant ``date``, affichez le jour de la semaine de votre jour de naissance
Historique
----------
.. hint::
Avec les touches *haut* et *bas*,
il est possible de naviguer dans l'historique des commandes tapées.
Il est ensuite possible de modifier la ligne de commande de manière classique
(flêche gauche et droite, retour arrière...).
* affichez à nouveau ``bonjour le monde``
* en utilisant ``date``, affichez le jour de la semaine de votre jour de naissance
* affichez maintenant le jour de la semaine de vos trois premiers anniversaires
(utilisez le retour arrière dans l'historique pour éviter de retaper la commande à chaque fois)
.. hint::
On peut effectuer une recherche dans l'historique des commandes,
en tapant CTRL+``R``, suivi du texte à rechercher.
En tapant à nouveau CTRL+``R``,
on remonte dans l'historique au résultat suivant de la recherche.
* affichez à nouveau le jour de la semaine de votre jour de naissance
(utilisez CTRL+R pour rechercher votre année de naissance dans l'historique)
* affichez à nouveau ``bonjour le MONDE !``
Édition avancée de la ligne de commande
---------------------------------------
.. hint::
* Avec CTRL+*gauche* et CTRL+*droite*,
on peut déplace le curseur mot par mot.
* Avec CTRL+``K``, on peut supprimer tout ce qui est à droite du curseur.
* Avec CTRL+``U``, on peut effacer la totalité de la ligne de commande.
* affichez ``au revoir le monde``
* affichez ``Bonjour le MONDE !``
* affichez le jour de la semaine de votre quatrième anniversaires
Répétition du dernier argument
------------------------------
* affichez à nouveau ``bonjour le monde``
* tapez ``echo au revoir le ``, puis la touche *echap*, puis ``.``
(NB: sur un clavier français, le `.` est obtenu avec SHIFT+``;``).
Quel message s'affiche ?
.. hint::
ESC+`.` ajoute le *dernier* argument de la précédente ligne de commande.
.. _tab-complétion:
Tab-complétion
--------------
* tapez ``ec`` suivi de la touche *tabulation* (``→|``) ; que constatez vous ?
videz ensuite la ligne de commande avec CTRL+C.
* tapez ``e`` suivi de la touche *tabulation* ; que constatez vous ?
tapez la touche *tabulation* à nouveau ; que constatez vous ?
videz la ligne de commande avec CTRL+C.
* tapez ``man`` suivi d'une espace, puis tapez *tabulation* deux fois ;
que constatez-vous ?
.. hint::
La touche *tabulation* déclenche ce qu'on appelle la `tab-completion`:eng::
le shell complète automatiquement le mot à gauche du curseur
(qui peut être vide).
Si plusieurs complétions sont possibles,
le shell fait plusieurs propositions.
Les proposition du shell dépendent du contexte;
elle peuvent être
* un nom de fichier (par défaut),
* une option de la commande,
* un nom d'utilisateur (e.g. pour la commande ``id``),
* une sous-commande (e.g. pour la commande ``git``)...
* tapez les caractères suivants: ``m``, ``o``, ``r``, *tabulation*,
``/``, ``e``, *tabulation*,
``p``, ``a``, ``s``, *tabulation*, *entrée*
* combien y a-t-il d'entrées dans la section 3 du manuel ?
* combien y a-t-il d'entrées commençant par ``pa`` dans la section 3 du manuel ?