TP0: Introduction aux commandes Unix

SOMMAIRE

  1. Introduction
  2. Répertoires et fichiers
  3. Suivi de l’activité et connexion à distance
  4. Compilation et exécution d’un programme
  5. Récapitulatif

I. Introduction

Nous présentons ici l’utilisation de la ligne de commandes sous Unix. Cette interface permet de dialoguer avec l’ordinateur au même titre que l’interface graphique, moins ergonomique, elle est, en revanche, beaucoup plus puissante et exhaustive.

L’interface graphique donne une représentation visuelle, sous forme d’icônes, des ressources proposées par le système. Ces icônes : dossiers, sous-dossiers, documents sont le reflet de l’organisation logique des fichiers sur le disque.
En effet, le système associe à l’organisation « à plat » du support physique (les blocs sur le disque) une organisation logique hiérarchique dans laquelle les noms des fichiers sont organisés sous la forme d’une arborescence. Les dossiers et sous-dossiers représentent des noeuds ayant des successeurs (répertoires ou directories), les documents sont les sommets pendants ou feuilles de l’arbre (fichiers standards).

A faire pour répondre aux questions suivantes :

  1. L’archive des TPs (que vous avez récupéré sur cette page) contient un dossier appelé TP0.
  2. Ce dossier est organisé ainsi :
    Interface graphique Organisation « système »
  3. Ouvrez l’application appelée terminal.

II. Répertoires et fichiers

II.1 Répertoires

Lorsqu’un utilisateurs ouvre un terminal ou se connecte à une machine via un terminal, il est positionné par défaut dans un répertoire qualifié HOME DIRECTORY.

Les commandes qui vont être utilisées ici sont :

  • pwd (print working directory) pour donner votre position dans l’arborescence
  • ls pour lister les noms de fichiers du répertoire courant
  • cd (change directory)
    • sans paramètre :
      pour revenir sous votre répertoire de connexion (HOME DIRECTORY)
    • cd NOMDIR pour aller dans le répertoire NOMDIR

Pour chacune des commandes, il existe un descriptif détaillé, accessible via la commande man, par exemple man ls. Il en sera de même des commandes illustrées dans la suite de ce TP.

Exercice

Dans le terminal courant :

  1. pwd, pour connaitre votre position dans l’arbre
  2. cd, sans option, donc aller dans le HOME DIRECTORY
  3. aller dans le répertoire du TP, en faisant, par exemple :
    cd TP_INF104/TP0/part2_terminal/material
  4. une fois dans le répertoire TP_INF104/TP0/part2_terminal/material faire ls pour lister les fichiers du répértoire courant, on trouve : INF104-liste.txt donnees src
  5. faire maintenant ls -l pour lister ces noms de fichiers avec leurs informations associées.
    On obtient un résultat tel que  :

    -rw-r--r-- 1 bertrand  staff  2901 17 oct 16:23 INF104-liste.txt
    drwxr-xr-x 3 bertrand  staff   102 25 oct 09:46 donnees
    drwxr-xr-x 4 bertrand  staff   136 25 oct 09:51 src
    
  6. et, enfin, ls -lR : idem, récursif pour chaque répertoire du répertoire courant. Le résultat est de la forme suivante :
    -rw-r--r-- 1 bertrand  staff  2901 17 oct 16:23 INF104-liste.txt
    drwxr-xr-x 3 bertrand  staff   102 25 oct 09:46 donnees
    drwxr-xr-x 4 bertrand  staff   136 25 oct 09:51 src
    
    ./donnees:
    
    ./src:
    -rw-r--r-- 1 bertrand  staff  197 16 oct 17:21 mon_echo.java
    

NOTE: connaitre ces trois commandes est essentiel pour utiliser le terminal. Elles sont simples, et vous les utiliserez dans tous les TPs de l’UE… Donc retenez les !

II.2 Redirection des entrées-sorties et pipes

Comme vous avez pu le constater, par défaut, toutes les commandes émises depuis une fenêtre terminal, effectuent leurs sorties sur ce terminal. Pour les rediriger sur d’autres supports on peut les faire suivre, entre autres, des symboles > ou >> :

  • > indique que la sortie n’est plus le terminal mais un autre support (fichier, etc.)
  • >> pour concaténer la sortie d’une commande à un support déjà existant (rallongement)

De façon analogue, on peut rediriger le résultat d’une commande en entrée d’une autre commande. Le symbole utilisé est | et il s’agi d’un « pipe ».

Exercice

Les commandes qui vont être utilisées ici :

  • cat pour afficher le contenu d’un fichier
  • date pour afficher la date

Depuis le répertoire TP_INF104/TP0/part2_terminal/material, entrer les commandes suivantes :

  1. ls
    le résultat est : INF104-liste.txt donnees src
  2. ls > display_output
    cat display_output
    le résultat est :

    	INF104-liste.txt
    	donnees
    	src
    
  3. date > display_output
    cat display_output
    le résultat est du type : Jeu 25 oct 2012 10:55:51 CEST
  4. ls >> display_output
    cat display_output
    le résultat est du type :

    Jeu 25 oct 2012 10:58:36 CEST
    INF104-liste.txt
    donnees
    display_output
    src
  5. Pour détruire le fichier display_output, faire : rm display_output
  6. Vous allez maintenant utiliser un « pipe », outil très utile et vous allez voir pourquoi. Pour cela, déplaçons nous dans le répertoire TP_INF104 et listons récursivement les fichiers contenus dans TP_INF104; exécutez les commandes (en remplaçant <chemin_relatif_… par le chemin qui va bien):
$cd <chemin_relatif_ou_absolu_vers_TP_INF104>
$ls -R
On s’aperçoit que le résultat est difficilement exploitable. Nous allons utiliser grep pour filtrer le résultat de ls et conserver seulement les résultats contenant « INF104-liste.txt ». Pour cela, tapez la commande:
$cd <chemin_relatif_ou_absolu_vers_TP_INF104>
$ls -R | grep INF104-liste.txt
Exercice: sachant que la commande cd sans argument vous positionne sur le répertoire associé à votre compte (celui à partir duquel tous vos fichiers sont stockés), utiliser pipe et grep pour retrouver l’emplacement de votre répertoire TP_INF104.

II.3 Fichiers

II.3.1 Présentation des commandes

Les commandes qui vont être utilisées ici (utiliser man pour plus de détails) :

  • grep
    pour extraire d’un fichier les lignes contenant une certaine chaine de caractères, par exemple :
    grep 1 INF104-liste.txt
    va afficher toutes les lignes de  INF104-liste.txt qui contiennent le mot 1
    grep Pierre INF104-liste.txt
    va afficher toutes les lignes de  INF104-liste.txt qui contiennent le mot Pierre
  • cp (comme copy)
    permet la copie d’un répertoire ou d’un fichier seul vers respectivement un répertoire, ou un répertoire ou un chemin absolu de fichier (renomme le fichier par la même occasion). Par exemple :
    cp INF104-liste.txt ../
    va copier le fichier INF104-liste.txt dans le répertoire parent
  • mv (comme move)
    pour changer le nom d’un fichier ou un répertoire, ou pour déplacer un fichier ou un répertoire. Par exemple :
    mv ../INF104-liste.txt ../../
    va déplacer le fichier ../INF104-liste.txt dans le répertoire parent du répertoire parent.
  • rm (comme remove)
    pour supprimer un fichier. ATTENTION, rm ne demande pas de confirmation, utiliser plutôt rm -i (i pour inquire). Par exemple :
    rm ../../INF104-liste.txt
    va supprimer le fichier ../../INF104-liste.txt
  • less
    afficher un fichier page par page ; la barre d’espace fait passer de page en page, pour quitter : taper q. Par exemple :
    less INF104-liste.txt
    va afficher le contenu de INF104-liste.txt
  • sort
    pour trier un fichier en fonction d’une clé ; par exemple :
    sort mon_fichier.txt -k2
    va afficher le contenu de mon_fichier.txt, trié ligne par ligne, selon la deuxième colonne (par défaut le séparateur entre colonnes est l’espace).

Pour aller plus loin : il n’est pas obligatoire de finir la partie du TP ci-dessous pour passer au TP suivant lors de la premier séance de TP. S’il vous reste du temps, faites le : les exercices ci-dessous fournissent quelques notions supplémentaires pour une bonne utilisation du terminal. Si vous n’avez pas le temps, ou si vous ne finissez pas les exercices ci-dessous, ce n’est pas très grave : vous pourrez passer au TP suivant lors de la prochaine séance.

II.3.2 Exercice

Nous allons travailler avec le fichier INF104-liste.txt, il contient la liste des élèves suivant INF104, ils y sont classés par ordre alphabétique. Nous allons en particulier trier cette liste par groupes, puis créer un fichier par groupe :

  • En supposant que le répertoire courant du terminal (exécutez pwd pour le vérifier) est TP_INF104/part2_terminal/material
  • copier INF104-liste.txt dans le répertoire donnees
  • aller dans le répértoire donnees
  • visualiser le contenu de ce fichier INF104-liste.txt en utilisant la commande less (avec less, la barre d’espace fait passer de page en page, pour quitter : taper q)
  • trier ce fichier par groupes (sortie sur le terminal)
  • effectuer à nouveau ce tri, en sortant le résultat dans un fichier (ici INF104-groupes.txt)
  • vérifier le contenu de ce dernier fichier en utilisant less
  • extraire le groupe 3 de INF104-groupes.txt, la sortie se fait sur le terminal
  • faire même chose, mais en rangeant la liste extraite dans un fichier appelé G3.txt,
    vérifier en faisant less G3.txt ou cat G3.txt
  • extraire le groupe 1 de INF104-groupes.txt et le copier dans le fichier G1G2.txt, vérifier
  • extraire le groupe 2 de INF104-groupes.txt et le concatener à G1G2.txt, vérifier

La solution de l’exercice est donnée dans l’archive des TPs.

II.4 Notion de chemin (PATH)

Comme on l’a vu, la syntaxe d’une commande est la suivante :

<appli> <liste de parametres>

L’application (appli) peut être, comme on l’a vu, une commande système, une application ou un programme écrit par l’utilisateur.

Cette application peut être désignée par :

  • son nom complet (chemin absolu vers le fichier) : /bin/ls,
  • on utilise le plus souvent un raccourci : le nom seul (ls),
    dans ce cas, le système va chercher ce fichier dans l’un des répertoire d’une liste préenregistrée.
    Une variable mémorise cette liste, elle s’appelle PATH.
    Pour afficher cette liste, utilise le acommande echo : echo $PATH

Ainsi, un message du type “commande inconnue” signifie soit que le fichier n’existe pas, soit que le chemin d’accès à ce fichier n’est pas dans le PATH.

Il existe d’autres variables :

  • CLASSPATH, qui remplace l’option -classpath de java
  • HOME
  • etc.

La notion de chemin s’applique à tous les fichiers. Quand on utilise un chemin, on emploie souvent les symboles . et .. :

  • . désigne le répertoire courant,
  • . . désigne le répertoire de niveau supérieur

Par exemple, dans un des exercices précédents, on aurait pu faire :

cd donnees
sort -k3 ../INF104-liste.txt

au lieu de :

cp INF104-liste.txt donnees
cd donnees
sort -k3 INF104-liste.txt

dans ce dernier cas, si on veut être sûr d’utiliser le fichier INF104-liste.txt se trouvant dans le répertoire courant :

sort -k3 ./INF104-liste.txt

III. Suivi de l’activité et connexion à distance

Suivi de l’activité : quelques commandes utiles :

  • who qui donne la liste des utilisateurs connectés sur la machine et leur provenance, par exemple :
    $who
    domas pts/0 2012-10-25 11:47 (hapchot.enst.fr)
    dupouy pts/1 2012-10-25 12:10 (cinna.enst.fr)
  • top : suivi dynamique des tâches active
  • du ., utilisation de la surface disque (disk usage)
  • time, exemple : time du .

Connexion à distance

Pour vous connecter sur une machine distante, vous pouvez utiliser la commande ssh.
Exemple pour le login dupont faisant ssh sur la machine cinna.enst.fr.Il se peut que la machine ne soit pas accessible (si elle est éteinte par exemple). Choisissez une machine de votre salle de TP, par exemple si vous êtes en C130 et que la machine C130-05 est allumée, vous pouvez vous y connecter ainsi: ssh dupont@C130-05.

ssh dupont@cinna.enst.fr
dupont@cinna.enst.fr's password: 
Last login: Wed Nov 28 10:07:03 2012 from valjean.enst.fr

Connectez vous sur une autre machine que la vôtre et faites à nouveau who.
Si vous utilisez la ligne de commandes vous pouvez continuer tout ce qui suit sur n’importe quelle machine des salles de TP de l’école (y compris celles sur laquelle vous êtes connecté via ssh).
Pour arrêter la connexion distante, taper exit.

IV. Compilation et exécution d’un programme Java

Pour compiler et exécuter un programme java nous utiliserons les commandes suivantes :

  • javac : compilation et production d’un fichier « bytecode », par exemple :
    javac exo.java produit un fichier qui sera appellé exo.class
  • java : exécution d’un fichier « bytecode », par exemple :
    java exo : exécution du fichier exo.class

Les commandes qui vont être utilisées ici :

  • mkdir
    créer un répertoire
  • file
    donne le type des fichiers
  • mv
    pour déplacer ou changer le nom d’un fichier
  • rmdir
    détruire un répertoire

IV.1 Exercice 1

  1. Allez dans le répertoire TP_INF104/TP0/part2_terminal/material/src :
    si vous êtes dans le répertoire donnees, faites cd ../src
  2. ce répertoire contient mon_echo.java, affichez le avec :
    cat mon_echo.java
  3. Pour compiler mon_echo.java:
    javac mon_echo.java
    cette commande va créer le fichier mon_echo.class
  4. la commande ls -l doit donner ce type de réponse :
    -rw-r–r– 1 bertrand staff 692 25 oct 13:51 mon_echo.class
    -rw-r–r– 1 bertrand staff 211 25 oct 13:48 mon_echo.java
  5. vérifier le type des fichiers avec la commande file * qui va donner ce type de réponse :
    mon_echo.class: compiled Java class data, version 50.0 (Java 1.6)
    mon_echo.java: ASCII C++ program text
  6. essayez plusieurs exécutions du fichier mon_echo.class :
    • java mon_echo
      résultat :
    • java mon_echo un deux trois
      résultat :
      args[0] = un
      args[1] = deux
      args[2] = trois

IV.2 Exercice 2

  1. créez deux répertoires resultats et exe, au même niveau que src :
    mkdir ../exe
    mkdir ../resultats
  2. déplacer mon_echo.class dans le répertoire exec:
    mv mon_echo.class ../exe
  3. vérifier que ceci a été fait (ls)
  4. aller dans le répertoire exec, vérifier ce qu’il contient et exécuter le fichier mon_echo.class en mettant les résultats dans le répertoire resultats,
    si vous êtes toujours dans src, faites :

    $ cd ../exe
    $ ls
    mon_echo.class
    $ java mon_echo  1 2 3 > ../resultats/mon_echo.out
    $ cat ../resultats/mon_echo.out 
    args[0] = 1
    args[1] = 2
    args[2] = 3
    

V. Récapitulatif

Depuis le répertoire INF104-TP0, la sortie de la commande ls -lR doit ressembler à :

-rw-r--r--  1 bertrand  staff  2901 17 oct 16:23 INF104-liste.txt
drwxr-xr-x  7 bertrand  staff   238 25 oct 12:22 donnees
drwxr-xr-x  3 bertrand  staff   102 25 oct 14:19 exe
drwxr-xr-x  3 bertrand  staff   102 25 oct 14:21 resultats
drwxr-xr-x  4 bertrand  staff   136 25 oct 14:19 src

./donnees:
-rw-r--r--  1 bertrand  staff  1206 25 oct 12:22 G1G2.txt
-rw-r--r--  1 bertrand  staff   572 25 oct 12:22 G3.txt
-rw-r--r--  1 bertrand  staff  2901 25 oct 11:22 INF104-groupes.txt
-rw-r--r--  1 bertrand  staff  2901 25 oct 11:11 INF104-liste.txt

./exe:

-rw-r--r--  1 bertrand  staff  692 25 oct 13:59 mon_echo.class

./resultats:
-rw-r--r--  1 bertrand  staff  36 25 oct 14:23 mon_echo.out

./src:
-rw-r--r--  1 bertrand  staff  211 25 oct 13:48 mon_echo.java

Organisation système correspondante:

Fin du TP0, TP suivant