Newer
Older
cours-unix-shell / UnixShell_cours2018 / Unix.txt
$Id: Unix.txt,v 1.9 2003/05/13 16:03:01 parmentf Exp $

			     ------------
				 UNIX
			     ------------

Historique ---------------------------------------

Multics --> UNICS --> UNIX
(MULTiplexed Information and Computing Service)
(UNiplexed Information and Computing Service)

1969 / AT&T Bell Laboratories (Ken Thompson, Dennis Ritchie) / PDP7

1972 / 10 UNIX installés

1973 / ré-écrit en C / portabilité

1979 / Bourne shell

1983 / AT&T UNIX System V

1984 / TCP/IP sur 4.2BSD --> Internet
     / 100 000 UNIX installés

1987 / 750 000 UNIX installés

1991 / Linux en développement (par Linus Torvalds)

1999 / Linux 2.2

2001 / Linux 2.4

Implications:

Internet, Jurassic Park, Open Source, ...

http://www.unix-systems.org/what_is_unix/history_timeline.html

Différents UNIX:

HP-UX, Solaris (Sun), (DEC), AIX (IBM), Xenix (Microsoft, abandonné),
IRIX (SGI), BSD (Berkeley), FreeBSD, Linux, MacOS X (Apple), QNX, ...


Cas de Linux:

Le noyau est le même 2.2, 2.4 ou 2.6 (dernier numéro pair: version
stable, impair: version de développement), mais les distributions
changent (facilités d'installation, programmes fournis, facilités de
configuration, ...): RedHat, Mandrake, SuSE, UnitedLinux (SCO, SuSE,
TurboLinux, Conectiva), Slackware, Debian, ...
Gratuit et sources fournies.

http://www.linux-france.org/
http://www.linux.org/
http://lea-linux.org/intro/ (Linux Entre Amis)
http://www.delafond.org/survielinux/ (Guide de survie du débutant sous
Linux)


Caractéristiques ---------------------------------

UNIX est un système d'exploitation:
- portable (de nombreuses architectures supportées)
- réseau (on peut se connecter à une machine distante et y exécuter
des programmes, pour peu qu'on puisse s'y loguer).
- multi-tâches (plusieurs programmes peuvent tourner en même temps, ce
qui n'était pas le cas de Windows 3 - pas réellement, ni celui de de
MacOS < 10)
- multi-utilisateurs (plusieurs utilisateurs peuvent utiliser la même
machine en même temps).

Ces caractéristiques sont de plus en plus présentes dans les systèmes
d'exploitation modernes (alors que ça fait plus de 30 ans qu'UNIX les
possède).
ex: Windows NT-2000-XP, MacOS X, Linux, Amiga, ...


X Window System ----------------------------------

X Window (appelé aussi "X" ou "x11") est la couche graphique des
systèmes basés sur Unix. Elle est la même sur nombre de systèmes
d'exploitation différents, et tient compte du réseau.

X Window a une architecture client/serveur: une application graphique
est considérée comme un client d'un serveur X (c'est-à-dire le
programme qui affiche les données sur l'écran du poste de travail).

Exemple de serveurs X:
- XWin
- XFree86 (pour Linux, Cygwin, ...)
- ...

http://www.x.org/X11.html
http://www.xfree.org/
http://www.linux-kheops.com/doc/casteyde/install_guide-2.0.2/htm/c8074.htm#AEN8093


La plupart des commandes Unix se manipulent en mode texte.
Certaines des applications aussi.
D'autres ne fonctionne qu'en mode graphique (sous X).
Certaines fonctionnent dans les 2 modes (ça dépend de ce qui est
disponible): emacs est de celles-là.

Emacs --------------------------------------------

http://www.parinux.org/ressources/mini-howtos/emacs/

Window Managers ----------------------------------

Le "look-and-feel" de X est configurable: on peut utiliser plusieurs
"Window managers" (contrairement à Windows, où l'on n'a pas le choix
de l'interface graphique, même si on peut configurer un peu les
couleurs, les comportements -- avec TweakUI).

http://www.xwinman.org/

À garder en réserve.


Commandes ----------------------------------------


http://www.linux-france.org/article/debutant/


Shell --------------------------------------------

Nous ne verrons ici que le shell sh (aussi appelé Bourne Shell), avec
lequel ksh est compatible (ksh est le shell par défaut à l'INIST).

-- variables d'environnement ---

HOME
PATH
PS1
SHELL

-- exécution d'un script --

sh
#!/bin/sh
.

-- les variables d'un script --

variable=valeur
$variable
${variable}
export variable

-- les paramètres --

$0
$n
$#
$*
shift

-- variables spéciales --

$$
$?

-- caractères spéciaux --

\
"..."
'...'
`...`

-- instructions --

case
test
if
while
until
for

-- diverses commandes --

#
banner
echo
read
exit
. script
fonction()
exec arg

-- expr --

expr e1 op e2
expr e1 \| e2
expr e1 \& e2
expr e1 : regexp


http://www.shellunix.com/ (en français)


Make ---------------------------------------------

make < GNU make (GNU make est celui qu'on utilise à l'INIST)

make est un programme qui permet de gagner du temps.

Il arrive qu'on construise de gros shells qui, traitent un corpus, en
extraient des informations, et/ou en font une synthèse.

Or, dès que le corpus change, ou que les paramètre de traitement
changent (par exemple, une table de référence), quand on n'a pas make,
on relance le shell. Dans ce cas on relance un traitement qui n'aurait
pas forcément besoin d'être exécuté *depuis le début*.

Pour pallier à ce problème, on peut aussi découper ce gros shell en
plusieurs petits, mais il subsiste un écueil: il faut s'assurer qu'on
a bien exécuté tous les shells nécessaire à la prise en compte des
dernières modifications.

Make est là pour répondre à tous ces besoins: grâce aux dates de
modification des fichiers, et à une liste de dépendences entre
fichiers de départ et fichiers d'arrivée, il simplifie la regénération
de fichiers (sans qu'on aie à tenir une liste des fichiers modifiés,
et donc des shells à exécuter).

De plus, make est un programme générique, qui peut être appliqué à
bien d'autres programmes que de simples shells. On s'en sert par
exemple pour compiler de gros projets (pour avoir un programme à jour,
il faut qu'il soit recompiler dès qu'un des fichiers dont il dépend
est modifié).

--

Par défaut, make utilise le fichier makefile présent dans le
répertoire courant. Ce fichier doit contenir les règles de dépendances
entre fichiers à générer et fichiers de base (un fichier peut
appartenir aux deux catégories, mais dans des règles différentes), et
les commandes à exécuter pour obtenir les fichiers à générer.

une règle est de la forme:

cible: base
	commande

Où la commande doit être précédée d'une tabulation! Il peut y avoir
plusieurs lignes de commandes, et plusieurs fichiers de base.

Pour créer le fichier cible (qui est une règle du fichier makefile),
il suffit de taper: make cible.

http://www.eng.hawaii.edu/Tutor/Make/FrenchMake/make.htm
http://www.oreillynet.com/pub/a/linux/2002/01/31/make_intro.html
http://www.gnu.org/manual/make/
http://make.paulandlesley.org/


Sed ----------------------------------------------

Sed (pour Stream EDitor) est un éditeur non interactif de texte. Il
permet d'appliquer une certain nombre de commandes à un fichier puis
d'en afficher le résultat (sans modifier le fichier de départ) sur la
sortie standard.

Substitution -------

La commande suivante lit <fichier> et affiche ses lignes sur la sortie
standard en remplaçant la chaîne Dilib par la chaîne DILIB.

sed 's/Dilib/DILIB/' fichier

Il est conseillé d'entourer les commandes par des apostrophes simples,
pour éviter que le shell n'interprète les caractères spéciaux (
.*[]^$\ ).

ATTENTION: cette commande ne remplace que la première occurrence de
"Dilib" sur chaque ligne du fichier. S'il y en a deux, la deuxième ne
sera pas remplacée, à moins d'utiliser l'option g en fin de commande:

sed 's/Dilib/DILIB/g' fichier

Si on veut faire deux remplacements sur la même ligne de commandes, on
peut utiliser:

sed -e 's/Dilib/DILIB/g' -e 's/Jacques Ducloy/Monsieur Dilib/g' fichier

ATTENTION: le -e est obligatoire pour distinguer la deuxième commande
d'un nom de fichier.

REMARQUE: les commandes sont effectuées sur chaque ligne dans leur
ordre d'apparition, ce qui veut dire que "Jacques Ducloy" sera
transformé en "Monsieur Dilib" *après* la substitution de "Dilib" par
"DILIB", il restera donc des "Dilib" sur la sortie standard.

Expression régulières:

On peut utiliser des expressions régulières dans les chaînes à
remplacer (donc, il faut banaliser les caractères spéciaux dans cette
chaîne).

Exemple:
sed -e 's/Jacques D[uU][cC][lL][oO][yY]/Monsieur Dilib/g' fichier

REMARQUE: le caractère * englobe autant de caractères qu'il peut, ce
qui veut dire que

sed 's/ré.*duction/réduction/g' fichier

transformera le fichier

do ré mi fa sol la si duction ah bon duction la suite

en

do réduction la suite

et non pas en

do réduction ah bon duction la suite

Récupération -------------------------------------

Les opérateurs \( et \) sauvent leur contenu et permettent leur
récupération par l'utilisation de \1, \2, etc.

sed -e 's/^\([A-Z][A-Za-z]*\), \([A-Z][A-Za-z]*\)/\2 \1/' fichier

Remplacera les Nom, Prénom en début de chaque ligne du fichier (quand
il en trouve) par Prénom Nom.

Commandes dans un fichier ------------------------

Si vous avez beaucoup de commandes, vous pouvez les rassembler dans un
fichier comme celui-là:

# Fichier "exemple.sed"
# Il ne peut y avoir de commentaires que dans un bloc au début du
# fichier.
s/É/&Eacute;/g
s/À/&Agrave;/g
s/Ç/&Ccedil;/g

Pour appeler ce fichier, il faut utiliser l'option "-f":

sed -f exemple.sed fichier

Une autre solution consiste à en faire un script exécutable (à la
manière d'un script shell):

#!/usr/bin/sed -f
# Table de transcodage de ISO-8859-1 vers HTML
s/É/&Eacute;/g
s/À/&Agrave;/g
s/Ç/&Ccedil;/g


http://www.shellunix.com/sed.html	La commande sed
http://www.cs.hmc.edu/qref/sed.html	An introduction to sed