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.
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).
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.
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.
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 /
.
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, ...).
pwd
.
cd rep
pour aller dans le sous répertoire appelé rep
.
cd ..
pour aller dans le répertoire parent. (..
est le chemin relatif qui représente le parent et .
est le
chemin relatif représentant le répertoire courant).
cd
pour revenir à votre répertoire principal (ce
répertoire s'appelle HOME ou home directory).
mkdir rep
pour créer un sous répertoire appelé rep
rm filename
détruit le fichier filename
(sans demander de confirmation !)
rm *
détruit tous les fichiers (sans
demander de confirmation !)
rm -i fi*
détruit tous les fichiers commençant
par fi
en demandant une confirmation.
rep
ainsi que les fichiers qu'il contient : rm -r rep
cp chemin1/fic1 chemin2/fic2
où chemin 1/2
peut être un chemin absolu (/home/users/zorro/Affaire
)
ou un chemin relatif (../zorro/Affaire
ou bien
Exemple/essai
) et fic1/2
sont les noms des fichiers.
cp -r chemin1/rep1
chemin2/rep2
mv chemin1/fic1
chemin2/fic2
(en particulier, mv chemin1/fic1
chemin1/fic2
renomme fic1 en fic2
).
mv chemin1/rep1
chemin2/rep2
(ceci peut aussi servir à renommer un répertoire).
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 !
ls > liste
redirige le résultat de la commande ls
dans le fichier liste
(en le créant).
ls >> liste
redirige le résultat de la commande ls
dans le fichier
liste
(en l'ajoutant à la fin).
more fic
voir le contenu d'un fichier.
source ~meplan/bin/debut
ls
,
puis avec : ls -als
essai
.
Vérifier son existence (avec ls
).
pwd
).
Créer 3 fichiers vides fic1, fic2
et fic3
(on pourra utiliser la commande touch fic1
)
cd .. et vérifiez que vous y êtes.
Créer un répertoire exemple
contenant 4 fichiers
vides ex1, ex2, fic1, fic2
.
ls
,
puis ls exemple/
, ls exemple/fic*
et enfin ls *
.
ls * > liste1
.
Vérifier avec la commande more
le contenu de liste1
.
liste1
en fichier liste2
.
Vérifier avec la commande ls
.
Taper ensuite mv exemple/ex1 essai/
et observer le résultat en listant les contenus de exemple
et essai
.
Se Placer dans essai/
et taper ls
puis mv ex1 fic1
; vérifier le résultat avec
ls
puis faire mv -i fic1 fic2
.
essai
par rm -i *
.
Se placer dans votre home directory et taper
rm -r essai
puis rm -r exemple
.
bin
, lib
et tmp
.
Ces répertoires vous seront utiles pour la suite et vous permettront de mettre des
exécutables UNIX (bin/
), vos librairies (lib/
) ou des
fichiers temporaires (tmp/
).
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.
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.
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"
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 :
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.
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.
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).
Essayer de taper:
touch fic1 ; touch ex1 ; touch ex2 ls | grep fic ls | grep 1
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.
lpq
(donne la liste des travaux en cours) et
lprm -Pnom_imprimante numero
où numero
est le numero de ce que vous voulez annuler.
kprinter nom_fichier
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
.
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/var>
ce numéro ; on arrête l'exécution du programme en tapant
kill -9 X
.
Essayer avec nedit
.
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.
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é :
var=valeur
@ var=valeur
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
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.
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é :
VAR=valeur
; export VAR
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
).
setenv DISPLAY zorro.disney.fr:0.0
).
zorro.disney.fr:0.0
)
nedit
ou xterm
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
.
if ( expression ) then commande endifoù
expression
est un booléen (les tests ont la même syntaxe qu'en C : ==, !=, <=,>=,>,<
).
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
nom_ss_extension
est égal à nom_complet
alors
on impose à extension
"C" et enfin nom_complet
prend la valeur $nom_ss_extension.$extension
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.
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.
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
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
.
Exécutez votre programme en lançant la commande ./essai
dans
la fenêtre xterm.