En lisant les chapitres précédents, vous avez déjà interagit avec le shell. Le shell est le programme qui reçoit vos commandes et qui les exécute. Dans ce chapitre, nous allons explorer le shell plus en avant, avec une mention spéciale pour le personnaliser afin de lui faire faire le travail que vous voulez qu'il fasse.
Chaque processus a un environnement associé. Un environnement est
ensembles de variables d'environnement. Une variable est une valeur
modifiable avec un nom déterminé. Par exemple, le nom EMAIL peut se
référer à la valeur joe@nowwhere.com
. Sa valeur peut changer ;
EMAIL peut aussi se référer à jane@somewhere.com
.
Puisque le shell n'est qu'un processus parmi d'autres, il possède aussi son
environnement. Vous pouvez visualiser votre environnement en entrant la
commande printenv
. La figure suivante donne un exemple de
résultat de sortie de cette commande. Sur votre système, la sortie sera
différente bien que similaire.
PAGER=less HOSTNAME=icon MAILCHECK=60 PS1=$ USER=username MACHTYPE=i486-pc-linux-gnu EDITOR=emacs DISPLAY=:0.0 LOGNAME=username SHELL=/bin/bash OSTYPE=linux-gnu HISTSIZE=150 TERM=xterm-debian TEXEDIT=jed PATH=/usr/sbin:/usr/sbin/:/usr/local/bin/: /usr/bin/:/bin/:/usr/bin/X11/:/usr/games _=/usr/bin/printenv
Les variables d'environnement sont une façon de configurer le système. Par exemple, la variable EDITOR vous permet de sélectionner votre éditeur préféré pour poster des news, écrire du courrier électronique et ainsi de suite.
Régler ses variables d'environnement est quelque chose de triviale. En pratique, commençons par personnaliser votre prompteur de shell ainsi que votre visualiseur de texte avec les variables d'environnement. Tout d'abord, commençons par un peu d'informations basiques.
man less
Cette commande vous permet d'accéder au manuel en ligne de la commande
less
. Pour éviter de dérouler tout le texte d'un seul coup à
l'écran, man
invoque un pageur qui vous déroule le texte
page par page, à chaque fois que vous appuyez sur la touche espace.
Par défaut, le pageur utilisé est more
.
Continuons et regardons un peu la page de manuel de less
, qui est
un pageur très puissant. Affichez la page suivante en appuyant sur espace et q
pour quitter. more
quitte aussi automatiquement la page en
arrivant à la fin.
export PAGER=less
Après avoir lu les avantages de less
, il se peut que vous vouliez
l'utiliser pour lire les pages de manuel. Pour ce faire, vous devez
positionner la variable d'environnement PAGER.
La commande pour ajuster une variable d'environnement dans bash
a
toujours le format suivant:
export NOM=valeur
export
signifie déplacer la variable du shell dans votre
environnement. Cela veut dire que les programmes autres que le shell (par
exemple, un visualiseur de textes) seront capables d'y accéder.
echo $PAGER
C'est la façon la plus aisée d'accéder au contenu de la variable.
$PAGER demande en fait au shell d'insérer la valeur de PAGER
avant d'invoquer la commande. echo
renvoie simplement
l'argument: dans ce cas, cela renvoie simplement la valeur du contenu de
PAGER, c'est-à-dire less
.
man more
renvoie maintenant la page de manuel de more
. Mais maintenant,
man
utilise less
comme pageur.
less
a beaucoup plus de fonctionnalités que more
.
Par exemple, vous pouvez paginer en arrière à l'aide de la touche
b
. Vous pouvez aussi vous déplacer en avant et en arrière à
l'aide des flèches de direction. less
ne sort pas lorsque vous
avez atteint le bas du fichier de la page de manuel: il attend que vous appuyez
sur la touche q
.
Vous pouvez essayer quelques spécificités de la commande less
,
comme b
, pour vérifier qu'elles ne fonctionnent pas avec
more
.
unset PAGER
Si vous ne désirez pas spécifier un pageur, vous pouvez appliquer la commande
unset
à la variable. man
utilisera alors
more
par défaut, comme il le faisait avant que vous ne changiez la
variable.
echo $PAGER
Comme la variable PAGER a été détruite, echo
ne renverra
rien.
PS1=bonjour:
Pour s'amuser, tentons de modifier le prompteur. $ devrait maintenant être modifié. Voici les étapes en détails:
$ echo $PS1 $ $PS1=bonjour: bonjour:echo Mon prompteur est $PS1 Mon prompteur est bonjour: bonjour:
export
n'est pas nécessaire car vous ne modifier que le
comportement de votre propre shell. Il n'y a pas de raison d'exporter dans
l'environnement de tous les programmes pour faire le test. Techniquement
parlant, PS1 est plutôt une variable de shell qu'une variable
d'environnement.
Si vous le voulez, vous pouvez exporter la variable de shell, la transformant ainsi en variable d'environnement. Si vous agissez de la sorte, les programmes lancés à partir du shell pourront la voir.
Lorsque vous tapez une commande dans votre shell, ce dernier doit trouver le programme correspondant sur votre disque avant de l'exécuter. Si le shell devait examiner l'ensemble du disque dur, cela serait extrêmement lent. À la place, il se contente d'aller chercher dans un ensemble de répertoires contenu dans la variable d'environnement PATH. Cette liste de répertoires est le chemin d'accès du shell. Lorsque vous entrez une commande, le shell va chercher dans chacun des répertoires de ce chemin pour trouver la commande que vous lui avez demandé de lancer.
Il se peut que vous ayez à changer la variable PATH si vous installez vous-même des programmes à des endroits non conventionnels. La valeur du PATH est une liste de répertoires séparés par des « : ».
/usr/local/bin:/usr/bin/:/bin:/usr/bin/X11:/usr/games
Cette valeur est définie dans le fichier /etc/profile
et
applicable à tous les utilisateurs. Il est très facile de modifier cette
valeur, comme d'ailleurs l'ensemble des variables d'environnement. Si vous
tapez la commande ls
, le shell va d'abord la chercher dans
/usr/local/bin
; ls
ne s'y trouve pas donc il va
continuer et la chercher dans /usr/bin/
; comme cela échoue
encore, il vérifie /bin
. Il la trouve enfin et stoppe sa
recherche pour exécuter le programme /bin/ls
. Si la commande
/usr/bin/X11/ls
existe (ce n'est pas le cas mais c'est pour
l'exemple), elle serait tout simplement ignorée.
Vous pouvez voir quel ls
le shell va utiliser grâce à la commande
type
. type ls
va vous renvoyer /bin/ls
.
Essayez-la vous-même.
$ type type type is a shell builtin[38]
type
n'est pas vraiment un programme: c'est une fonctionnalité du
shell mais vous pouvez l'utiliser comme un programme extérieur.
Il y a de nombreuses commandes de la même sorte. Tapez man
builtins
pour visualiser la page les décrivant. De façon générale, il
n'est pas nécessaire de savoir si une commande est une fonctionnalité interne
ou bien un programme extérieur. Mais il faut garder à l'esprit qu'une
fonctionnalité interne ne sera pas visible via un ps
ou un
top
car il ne s'agit pas d'un processus séparé: c'est une partie
intégrante du shell.
De nombreuses applications sous Linux vous permettent de modifier leur comportement à certains moment en transformant les fichiers contenant leurs informations de configuration. Ces fichiers de configuration peuvent contenir des informations de lancement, des réglages de configuration ou bien des ajustements pour la sortie. En général, un nom de fichier de configuration est basé sur le nom de l'application qu'il est sensé modifier. Cette convention de nom permet de déterminer rapidement à quelle application appartient quel fichier de configuration pour les réglages.
Il est important de se rappeler qu'il y a deux façons différentes de configurer
sur un système Debian. La configuration système affecte tous les
utilisateurs. Ces configurations se trouve dans le répertoire
/etc
et donc il est généralement nécessaire d'être root pour
modifier ces fichiers. Vous pouvez avoir besoin de configurer la façon dont se
connecte le système à Internet par exemple, ou bien configurer les butineurs
HTML pour leur faire afficher la page de la société en se lançant. Si vous
désirez effectuer le changement pour tous les utilisateurs à la fois, vous
devez faire les transformations dans /etc
. Des fichiers de
configuration simples de /etc
sont /etc/X11/XF86Config,
/etc/lynx.cfg
et /etc/ppp/options
. En fait, presque tous
les fichiers de /etc
sont des fichiers de configuration.
La configuration personnelle n'affecte qu'un simple utilisateur. Les
fichiers cachés sont utilisés à cette fin. Par exemple, le fichier
~/.newrc
contient une liste d'articles sur USENET (groupes de
discussions) que vous avez lus et à quels groupes vous avez souscrit. Cela
permet à des lecteurs de news comme trn
ou GNUS
de
n'afficher que les articles non lus dans les groupes qui vous intéressent.
Cette information est bien-sûr propre à chaque utilisateur du système et ainsi
chacun possède son propre .newrc
dans son répertoire de travail
personnel.
Si vous utilisez la même commande de nombreuses fois, il se peut que vous vous
fatiguiez à la taper. bash
vous permet d'écrire un raccourci - on
dit alias - de votre commande.
Admettons que vous désiriez toujours utiliser les options
--almost-all
et --color=auto
de ls
.
Faîtes un alias:
alias myls='ls --almost-all --color=auto'
Maintenant, il vous suffit de taper myls
à la place de la commande
complète. Pour voir ce qu'est réellement myls
, il suffit de taper
type myls
. Pour voir la liste complète des aliases que
vous avez défini, taper simplement alias
tout seul comme commande.
Au fur et à mesure de vos expériences avec Linux, vous allez comprendre combien manipuler les entrées et sorties des applications est un concept très puissant. Cette partie décrit quelques points de ce que peut vous apportez la redirection des entrées-sorties.
stdin
, stdout
, tubes et redirection
Chaque processus a au moins trois connexions avec le monde extérieur.
L'entrée standard est une des sources des données du processus. La
sortie standard est un des endroits où le processus envoie ses données
et l'erreur standard est l'endroit où le processus envoie ses messages
d'erreurs (on les abrège généralement par stdin
,
stdout
et stderr
).
Les mots « source » et « endroit » sont intentionnellement vagues. Ces lieux d'entrées-sorties standards peuvent changer avec les utilisateurs. Cela peut être l'écran, le clavier, un fichier et même une connexion réseau. Vous pouvez spécifier les endroits à utiliser.
Lorsque vous lancez un programme à partir du shell, l'entrée standard est généralement le clavier et la sortie standard, ainsi que les erreurs, s'affichent sur votre écran. Vous pouvez bien sûr demander à votre shell de modifier ce comportement.
Par exemple, la commande echo
envoie son entrée standard sur sa
sortie standard, normalement à l'écran. Mais vous pouvez décider de l'envoyer
plutôt dans un fichier à l'aide de l'opérateur de redirection de
sortie, > . Par exemple, pour écrire le mot « Bonjour » dans
le fichier monfichier
, utilisez la commande suivante:
echo Bonjour > monfichier
Utilisez ensuite cat
ou bien votre pageur (more
ou
less
) pour visualiser le contenu du fichier
monfichier
.
$ echo Bonjour > monfichier $ cat monfichier Bonjour $
Vous pouvez changer l'entrée standard d'une commande avec l'opérateur de
redirection d'entrée, < . Par exemple, cat <
monfichier
. En pratique, ce n'est pas commode. Pour simplifier,
cat
accepte un fichier pour argument. Ainsi, vous pouvez vous
contenter de taper cat monfichier
et l'effet sera identique.
Si l'on approfondit un peu, la commande cat <monfichier
signifie que le shell ouvre le fichier monfichier
et envoie son
contenu dans l'entrée standard de cat
. cat
monfichier
, sans l'opérateur de redirection, signifie que la commande
cat
reçoit un argument unique (monfichier
), l'ouvre
d'elle-même et ensuite l'affiche à l'écran.
Il y a bien-sûr une raison pour cette double fonctionnalité. Par exemple, il est possible de connecter la sortie standard d'une commande sur l'entrée standard d'une autre commande. Cela s'appelle un tube (pipeline en anglais). Cela utilise l'opérateur tube[39], | .
Peut-être désirez-vous voir la GNU General Public License à l'envers ?
Pour le faire, utilisez la commande tac
(c'est un cat
mais inversé). Essayez:
tac /usr/doc/copyright/GPL
Malheureusement, cela défile beaucoup trop rapidement pour être lisible. Donc vous ne voulez avoir que quelques paragraphes: la solution est un tube:
tac /usr/doc/copyright/GPL | less
Cela prend donc la sortie standard de tac
, qui est la GPL lue à
l'envers, et l'envoie dans l'entrée standard de less
.
Vous pouvez enchaîner ainsi autant de commandes que vous le désirez. S'il vous
prend une envie inexpliquable de transformer tous les G en Q, il vous suffit
d'utiliser la commande tr G Q
comme ceci:
tac /usr/doc/copyright/GPL | tr G Q | less
Vous pouvez obtenir le même résultat en utilisant des fichiers temporaires et des redirections, par exemple:
tac /usr/doc/copyright/GPL > tmpfile tr G Q < tmpfile > tmpfile2 less < tmpfile2 rm tmpfile tmpfile2
Il est clair qu'un tube est bien plus pratique.
Vous désirez souvent utiliser une commande sur tout un groupe de fichiers. Des
caractères spéciaux (wildcards) sont utilisés pour créer des
termes génériques d'expansion de nom de fichiers. Une série de
lettres et des caractères spéciaux permettent ainsi de lister des fichiers.
Par exemple, le motif /etc/*
remplace la liste de tous[40] les fichiers de /etc
.
* est un motif qui remplace n'importe quelle série de caractères et ainsi
l'expression /etc/*
fournira la liste de tous les fichiers
commençant par /etc/
.
Cette liste de fichiers est très utile comme un jeu d'arguments pour une
commande. Par exemple, le répertoire /etc
contient une série de
sous-répertoires appelés rc0.d, rc1.d
, etc... Normalement, pour
visualiser le contenu de ces répertoires, vous devriez taper les commandes
suivantes:
ls /etc/rc0.d /etc/rc1.d /etc/rc2.d /etc/rc3.d ls /etc/rc4.d /etc/rc5.d /etc/rc6.d /ect/rcS.d
C'est particulièrement lourd et pénible. À la place, il suffit d'utiliser le caractère spécial « ? » comme suit:
ls /etc/rc?.d
/etc/rc?.d
renvoie alors une liste de nom de fichiers, commençant
par rc
, suivant d'un caractère et se terminant pas
.d
.
Les caractères spéciaux disponibles sont les suivants:
Correspond à n'importe quel groupe de 0 ou plus de caractères.
Correspond à un caractère quelconque mais unique.
[...]
Si vous entourez des caractères de crochets, le résultat est une correspondance
avec ces caractères. Par exemple, [abc]
correspond soit à un
a
, soit à un b
ou soit à un c
. Si vous
ajouter un ^ après le premier crochet, on retourne le sens. Ainsi,
[^abc]
correspond à tous les caractères qui ne sont pas un
a
, un b
ou un c
. Vous pouvez aussi
inclure un intervalle comme [a-j]
qui correspond à tout entre
a
et j
. La correspondance est sensible à la casse
des caractères donc si vous voulez inclure toutes les lettres, vous devz
utilisez [a-zA-Z]
.
Les motifs d'expansion sont très simples, à partir du moment où vous les voyez dans des exemples concrets:
*.txt
Cela vous fournit la liste de tous les fichiers finissant pas .txt
puisque * correspond à tout.
*.[hc]
Cela vous fournit une liste de fichier se terminant soit par .h
soit par .c
.
a??
Cela vous fournit la liste de tous les fichiers de trois lettres commençant par
un a
.
[^a]??
Cela vous fournit la liste de tous les fichiers de trois lettres ne commençant
pas par la lettre a
.
a*
Cela vous fournit l'ensemble des fichiers commençant par a
sans
tenir compte de leur nombre de lettres.
p.karatchentzeff@free.fr