Introduction à Linux

UJF - Licence de Physique

[ Home| Unix| C++| Graphisme| Projets| Web| FAQ ]


1 UNIX c'est quoi?

UNIX (ou son analogue sur PC, LINUX) est un système d'exploitation (au même titre que DOS, Windows) qui permet de "dialoguer" avec l'ordinateur. Ce système est très puissant et très stable (contrairement à Windows). Bien qu'au premier abord il puisse paraître un peu austère, on s'y habitue très vite.

Remarque :

Nous avons dit que LINUX est l'analogue d'UNIX pour les PC. En fait LINUX est une version complètement gratuite de UNIX qui peut s'installer sur n'importe quelle machine. Généralement les constructeurs de stations de travail (IBM, HP, Compaq, SUN) livrent leurs machines avec une version d'UNIX alors que sur les PC on a plutôt tendance à installer LINUX. Les seules différences entre LINUX et UNIX sont dans certaines options de certaines commandes peu standards (mais notez qu'entre un UNIX IBM et HP ou Compaq, des différences existent également).

1.1 Comment dialoguer avec l'ordinateur ?

Ceci se fait dans une fenêtre dite terminal1 via un langage le shell. Il existe, sous UNIX, 3 principaux shells : le Bourne shell (sh) qui est le plus ancien, le C shell (csh) très utilisé et le Korn shell (ksh) qui est un peu un mélange des deux autres. Hormis ces shells, il existe des versions un peu plus conviviales : ce sont par exemple le bash (sh amélioré) et le tcsh (csh amélioré). C'est principalement avec ce dernier que nous travaillerons.

1.2 Les utilisateurs

Pour vous connecter sur une machine UNIX vous avez besoin d'un login, c'est-à-dire un nom d'utilisateur, et d'un mot de passe. Chaque utilisateur appartient à un groupe, ce qui permet de donner certains privilèges (possibilité d'écrire, lire ou exécuter un programme dans une certaine zone) communs à tous les utilisateurs de ce groupe. Il existe cependant un utilisateur particulier, nommé root qui a tous les privilèges.

1.3 Organisation des fichiers

Il est important de savoir que les fichiers sont classés dans l'ordinateur (sur le disque magnétique) selon une structure arborescente. Chaque noeud de l'arborescence s'appelle un répertoire (directory en anglais). Dans ces répertoires se trouvent des fichiers (files en anglais).

Par exemple /home/u3/phys/aaa/zorro.c signifie que le fichier zorro.c se trouve dans le répertoire aaa qui se trouve lui même dans le répertoire phys, etc. Le répertoire racine est /.

2 Principales commandes

Avant de regarder les commandes plus en détail, il y a deux commandes dont vous aurez besoin rapidement : man et passwd. La première vous sera très souvent utile car elle permet d'avoir un aide en ligne sur les autres commandes et même sur certaines fonctions C/C++. On tape

    man commande

La seconde permet de changer votre mot de passe ; on tape

    passwd

et on suit les instructions... Un mot de passe doit avoir 8 caractères (lettres, chiffres, ...).

Remarques :

2.1 Les répertoires et Fichiers

ATTENTION, comme pour la commande rm, les commandes cp et mv ne demandent pas de confirmation si un fichier fic2 existait déjà avant le cp ou le mv. Celui-ci sera perdu !

Exercices

2.2 Éditeurs de textes

Comme nous l'avons déjà souligné, pour créer ou visualiser un fichier, on utilise généralement un éditeur. Il existe un grand nombre d'éditeurs différents ; citons Word5, vi6, emacs7, et enfin nedit8 qui permet de faire beaucoup de choses, qui est assez convivial et intuitif. Nous utiliserons donc nedit pour éditer tous nos fichiers. On le lance en tapant nedit ou nedit filename pour éditer le fichier filename. Vous trouverez ici un petit aperçu de nedit.

Remarque

il est souvent utile d'utiliser la commande nedit & ou nedit filename & ce qui permet "de garder la main" dans la fenêtre xterm (faire l'essai avec est sans le signe &). Le signe & signifie "lancement en background" (arrière plan). Il est valable pour n'importe quelle application.

2.3 Divers commandes utiles

  • alias/unalias : cette commande permet de définir un raccourci : par exemple, nous avons vu que la commande rm fic détruit le fichier fic sans demander confirmation ; pour plus de sûreté, on doit utiliser rm -i fic qui demande une confirmation. On peut redéfinir la commande grâce à un alias:
    • alias rm "rm -i"
    ainsi quand vous taperez rm la commande exécutée sera en fait rm -i
    alias sans argument donne la liste des alias déjà existant et unalias mon_alias annule la commande alias. Cette commande très utile est à utiliser avec beaucoup de précaution (imaginer l'effet de commande comme : alias ls "cd" ).
  • find : comment rechercher un fichier dans une arborescence ?
    • find chemin -name filename -print : cherche tous les fichiers filename depuis le répertoire pointé par chemin.
    • find . -name "f*.txt" -print : recherche tous les fichiers commençant par "f", se finissant par ".txt" à partir du répertoire courant (".").
  • grep : recherche dans un fichier du répertoire courant une chaîne.
    • grep "petite chaine" fic*.C : recherche "petite chaine" dans les fichiers commençant par "fic" et finissant par ".C"
  • chmod : change les privilèges d'un fichier ou d'un répertoire.
    chmod ugo nom : ugo sont 3 nombres correspondant à un privilège donné au fichier/répertoire pour le USER (u) le groupe auquel appartient le USER (g) et les autres (o) ; ils correspondent aux lettres rwx obtenu lors de la commande ls -als. Les valeurs possible pour ces nombres sont :
    • 0 : aucun privilège
    • 1 : exécution autorisée (x pour execute)
    • 2 : écriture autorisée (w pour write)
    • 4 : lecture autorisée (r pour read)
    ou toute combinaison.
    Exemple : chmod 754 fic permet au USER d'avoir tous les privilèges (7=1+2+4), aux membres de son groupe de lire et exécuter le fichier fic (5=4+1) et aux autres, uniquement une lecture de fic.
  • gzip/gunzip : compression/décompression d'un fichier. La place ainsi occupée par le fichier compressé est généralement beaucoup plus petite.
    • gzip fic.ps : compresse fic.ps et le renomme fic.ps.gz
    • gunzip fic.ps.gz : décompresse fic.ps.gz et le renomme en fic.ps
  • tar : création/extraction d'archives composées de plusieurs fichiers et /ou directory
    • tar cvf monarchive.tar mydir : met dans monarchive.tar (un fichier) l'ensemble du contenu (arborescence et fichiers) du directory mydir
    • tar xvf monarchive.tar : extraction de l'ensemble des fichiers et/ou répertoires contenu dans monarchive.tar
  • source : exécute un script shell sans lancer un nouveau shell.

2.4 Enchaînement de commande

Il est possible de taper sur une même ligne plusieurs commandes indépendantes qui seront exécutées séquentiellement en les séparant par un point virgule.

Exemple :

Essayer de taper cette ligne :

    echo "echo un petit texte">fic;ls -als fic ; chmod 755 fic ; ls -als fic ; fic

On peut également utiliser le résultat d'une commande comme argument d'une autre en utilisant la commande | (se prononce pipe).

Exemple :

Essayer de taper:

    touch fic1 ; touch ex1 ; touch ex2
    ls | grep fic
    ls | grep 1

3 Impression

Plusieurs imprimantes existent : phcarism (fonctionnement aléatoire), neel et perrin.

  • lpr -Pnom_imprimante nom_du_fichier.ps ou nom_fichier.txt : pour imprimer respectivement un fichier POSTCRIPT9 et un fichier texte.
  • Pour annuler une impression, faire lpq (donne la liste des travaux en cours) et lprm -Pnom_imprimante numeronumero est le numero de ce que vous voulez annuler.
  • On peut aussi utiliser l'interface de KDE : kprinter nom_fichier

4 Interruption, passage en background d'un exécutable

Passage en background

Nous avons déjà vu que le symbole "&" permet de lancer en background (i.e. en gardant la main dans une fenêtre xterm) un exécutable (par exemple, un éditeur). Cependant on a parfois oublié de mettre ce symbole et on souhaite récupérer la main. On tape alors Ctrl+z : cela suspend l'exécution de la commande ; on peut alors l'envoyer en background en tapant bg. Essayer avec nedit.

Interruption d'un exécutable

Il est parfois nécessaire d'interrompre l'exécution d'un programme ; pour cela on peut utiliser dans la fenêtre où il a été lancé les touches Ctrl+c. Ceci termine violemment l'exécution. Bien sûr, Ctrl+c ne peut être effectif que si l'exécutable ne tourne pas en background. Si c'était le cas, il est possible de le "tuer". La commande ps donne le nom des exécutables qui tournent et le numéro qui leur a été attribué (PID). Soit X ce numéro ; on arrête l'exécution du programme en tapant kill -9 X. Essayer avec nedit.

5 Les variables dans un shell

Nous donnerons à titre indicatif certaines syntaxes propres à sh, mais nous ne travaillerons qu'en csh. Le shell est comme nous l'avons dit un moyen de communiquer avec l'ordinateur. Outre les instructions de bases que vous avez déjà vues, celui-ci permet d'utiliser des variables. Ces variables sont de 2 types ; il y a les variables standards et les variables d'environnement.

5.1 Complément : Les variables standards

Ce sont des variables que l'utilisateur se définit. Elles sont généralement utilisées dans des scripts ou programmes écrits dans un shell (csh ou sh). Elles ne "vivent" que dans le shell courant et sont perdues si on lance un nouveau shell. Leur affectation dépend du shell utilisé :

  • en sh : var=valeur
  • en csh :
    • si la variable est un nombre on utilise : @ var=valeur
    • si c'est une chaîne de caractères : set var=valeur

On utilise une variable ainsi affectée par ${var} ou plus simplement $var
On peut afficher la valeur d'une variable par la commande echo

Exemples :

Essayer :

    set var1="ceci est une chaine"
    set var2="cela aussi"
    echo "voici la variable var1: $var1 et la variable var2 : $var2" 

Essayer aussi :

    echo 'voici la variable var1: $var1 et la variable var2 : $var2' 

Pour les nombres :

    @ a=1
    @ b=2
    @ c=$a + $b
    echo "$a + $b = $c"

En sh la différence ne viendrait qu'à l'affectation.
On remarquera que l'espace de part et d'autre du signe "+" est nécessaire.

5.2 Les Variables d'environnement

Les variables d'environnement sont particulières dans la mesure ou elles sont utilisées par le shell lui même. Certaines sont déjà définies et sont indispensables, d'autres ne servent que dans certaines circonstances. Contrairement aux variables standards, elles "s'exportent" d'un shell au shell fils. Leur affectation dépend également du shell utilisé :

  • en sh : VAR=valeur ; export VAR
  • en csh : setenv VAR valeur

La commande printenv VAR permet de visualiser la variable (printenv sans argument donne la liste complète des variables d'environnement affectées). La commande echo peut aussi être utilisée (echo $VAR).

Exemples

  • PATH : ensemble des répertoires où le système recherche un exécutable (commande UNIX ou programme)
  • USER : votre login
  • HOME : votre répertoire principal
  • PWD : le répertoire courant
  • SHELL : votre shell par défaut
  • DISPLAY : l'adresse où s'affiche les fenêtres (si l'adresse est zorro.disney.fr on écrira setenv DISPLAY zorro.disney.fr:0.0).

Exercice

  • Faire afficher le contenu de votre variable DISPLAY (le résultat ressemble à zorro.disney.fr:0.0)
  • Demander à votre voisin le contenu de sa variable DISPLAY et affecter le à votre variable DISPLAY. Taper alors nedit ou xterm
  • Affecter à votre DISPLAY sa valeur initiale.

5.3 Complément : Écriture de scripts shell

Nous allons, à titre d'illustration écrire quelques petits scripts en csh. Cela vous permettra de vous familiariser avec certaines des commandes que vous avez vues et vous rendra des services par la suite. Un script shell est un fichier contenant une suite de commande (ici csh). Il commence par la ligne

   #!/bin/csh

indiquant que ce script est écrit en csh. Le "#" est en principe la façon de noter un commentaire en sh/csh. Cependant dans ce cas particulier ce commentaire est interprété par LINUX. Il est possible de passer des arguments à un script ; dans ce cas leur noms dans le script est $1 pour le premier argument, $2 pour le second, etc. Par exemple, si le script "essai" est appelé par  essai 12 texte , $1 aura la valeur 12 et $2 la valeur texte.

  1. Écrire un script affichant sur une ligne "Bonjour" et sur la suivante "1er paramètre" suivi de l'argument passé. Compléter ce script pour que, s'il n'y a pas d'argument, on affiche le message "pas d'argument". Une condition se note :
        if ( expression ) then 
            commande 
        endif
    	
    expression est un booléen (les tests ont la même syntaxe qu'en C : ==, !=, <=,>=,>,< ).
  2. Vous allez introduire dans le script, 3 variables nom_complet, extention et nom_ss_extension. Le but est d'affecter chacune de ces variables avec la partie utile de l'argument (par exemple, essai toto.txt, doit mettre toto.txt dans nom_complet, toto dans nom_ss_extension et txt dans extention). Pour cela, vous aurez besoin de la commande cut ainsi que des back quote : ` ` ; ces derniers provoquent l'exécution prioritaire de la commande qui est entre (par exemple set a=`ls` affectera à a le résultat de la commande ls, i.e. le contenu du répertoire courant). La commande cut a tois arguments et elle permet de découper un texte en différentes parties (-f i), suivant un délimiteur (-d"char"). Vous l'utiliserez en vous inspirant des exemples suivants :
        echo "ceciXestXunXexemple" | cut -d"X" -f1 
        echo "ceciXestXunXexemple" | cut -d"X" -f2
    	
  3. Modifier le script précédent de sorte que : si nom_ss_extension est égal à nom_complet alors on impose à extension "C" et enfin nom_complet prend la valeur $nom_ss_extension.$extension

5.4 Le .cshrc

A chaque fois qu'une xterm est ouverte, csh lance par défaut un certain nombre de scripts ; le dernier de ceux-ci est, s'il existe, le ~/.cshrc. En faisant ls -als dans votre home directory vous verrez que ce fichier n'existe pas. Vous allez en créer un suivant le modèle suivant :

    set path=( $path $HOME/bin .)  # where to look for executables
    if ( $?prompt ) then           # shell is interactive. 
       set history=40              # previous commands to remember. 
       set savehist=40             # number to save across sessions 
       set system=`hostname|cut -d"." -f 1`     # name of this system.       
       set prompt='%m[%c1] \!: '                # command prompt.
   
       alias xterm "xterm -sl 1000 -sb -n $HOST &" 
       alias dir "ls -als" 
       alias cls clear 
       alias pss "ps waux | grep $USER" 
       alias lpq lpstat -o 
       alias rm rm -i 
       alias cp cp -i 
       alias mv mv -i 
    endif  

Ce script ne doit pas être exécuté directement mais par la commande source .cshrc afin de conserver tous les alias et autres variables. Si cela vous semble utile vous rajouterez des commandes ou alias.

6 Programmation : le début

Nous allons utiliser un langage évolué de programmation afin d'écrire des programmes un peu plus compliqués que les scripts shell. Ce langage est le C++, une extension du C.

6.1 Écriture

La première des choses est de taper le programme (en utilisant nedit).
Voici un exemple que vous taperez dans un directory tp1

    #include < iostream >
    using namespace std;
    int main()
    {
            cout << "Bonjour ca va?" << endl;
    } 

Sauvegarder le sous essai.C

6.2 Compilation

Il faut ensuite le compiler, c'est-à-dire transformer le code compréhensible par vous en un code compréhensible par l'ordinateur. Pour cela on se place dans le répertoire tp1 et on tape

    g++ -o essai essai.C 

Cela a pour effet de créer un nouveau fichier exécutable appelé essai, à partir de votre programme C++ essai.C (-o signifie output name). Si vous oubliez -o xxx, l'exécutable créé aura pour nom a.out.

  • Si votre programme contient des erreurs, elles apparaissent expliquées avec le numéro de la ligne du programme correspondante. Il faut alors les corriger, saugarder le programme et le compiler à nouveau, jusqu'à ce qu'il n'y ait plus d'erreur.
  • Il existe divers compilateur C++ ; nous utiliserons g++.

6.3 Exécution

Exécutez votre programme en lançant la commande ./essai dans la fenêtre xterm.