Post on 11-Sep-2018
Editions ENI
Programmation shell sous Unix/Linux
sh, ksh, bash(3ième édition)
CollectionRessources Informatiques
Extrait
A. Variables d'environnement
Les thèmes abordés dans ce chapitre permettront à l'utilisateur de paramétrer son
environnement de travail en tenant compte du shell utilisé.
Un certain nombre de variables sont définies dans l'environnement du shell. Elles
contiennent des informations nécessaires au fonctionnement de l'interpréteur et/ou
des commandes lancées à partir de celui-ci.
1. Liste des variables
La commande set donne la liste des variables définies dans le shell courant.
Exemple
$ set
HOME=/home/christie
LOGNAME=christie
PATH=/usr/bin:/bin
PS1='$ '
PS2='> '
TERM=vt100
...
2. Affichage de la valeur d'une variable
Le caractère spécial $ du shell permet de récupérer le contenu d'une variable.
Exemple
$ echo $HOME
/home/christie
$
3. Modification de la valeur d'une variable
Le shell permet d'initialiser ou de modifier des variables.
Chapitre 3
76 Programmation shell sous Unix/Linux
Exemple
$ variable=valeur
$ echo $variable
valeur
$
Si la valeur contient des caractères spéciaux du shell ($, >, espace...), il faut em-
pêcher le shell d'interpréter ceux-ci en entourant la valeur avec des simples quotes.
Utiliser des simples quotes est l'une des trois manières de masquer des carac-
tères en shell. Ce point sera détaillé ultérieurement.
Exemple
Le symbole ">" (redirection) doit être masqué, l'espace (séparateur de mots sur la
ligne de commande) également :
$ variable='mot1 mot2 =>'
$ echo $variable
mot1 mot2 =>
$
Il ne faut pas mettre d'espace autour du signe =. Le shell ne comprendrait pas
qu'il s'agit d'une affectation.
4. Principales variables
Les variables présentées ci-dessous possèdent une valeur au niveau du shell de
connexion. D'autres variables peuvent être définies ultérieurement.
a. HOME
Cette variable contient la valeur du répertoire d'accueil de l'utilisateur. Elle ne doit
pas être modifiée.
b. PATH
La variable PATH contient une liste de répertoires qui sont explorés par le shell
lorsqu'une commande externe est lancée.
�Edit
ions
EN
I-
All
rights
reserv
ed
Paramétrage de l'environnement de travail
sh, ksh, bash 77
En aucun cas, une commande n'est recherchée dans le répertoire courant si
celui-ci ne figure pas dans la variable PATH.
Exemples
$ echo $PATH
/usr/bin:/bin
$
La commande date est trouvée :
$ date
Tue Jan 28 17:51:23 MET 2003
$
En effet, elle se situe dans le répertoire /usr/bin :
$ find / -name date 2> /dev/null
/usr/bin/date
$
La commande ping n'est pas trouvée :
$ ping localhost
ksh: ping: not found
$
La commande est située dans le répertoire /usr/sbin qui n'est pas cité dans la
variable PATH :
$ find / -name ping 2> /dev/null
/usr/sbin/ping
$
Le répertoire courant n'est pas exploré s'il n'est pas cité dans PATH :
$ cd /usr/sbin
$ ping localhost
ksh: ping: not found
$
Chapitre 3
78 Programmation shell sous Unix/Linux
Modifier le contenu de la variable PATH :
$ PATH=$PATH:/usr/sbin
$ echo $PATH
/usr/bin:/bin:/usr/sbin
$
La commande ping est trouvée :
$ ping localhost
localhost is alive
$
Rechercher une commande dans le répertoire courant
Pour qu'une commande soit recherchée dans le répertoire courant, il faut ajouter
en fin de variable PATH la chaîne ":." ou simplement le caractère ":".
Exemple
PATH=/usr/bin:/usr/local/bin:/home/christie/bin:.
Équivalent à :
PATH=/usr/bin:/usr/local/bin:/home/christie/bin:
c. PWD
ksh bash
Cette variable contient la valeur du répertoire courant. Elle est mise à jour par le
shell dès que l'utilisateur change de répertoire. Cette variable peut être utilisée en
ksh pour faire apparaître la valeur du répertoire courant dans le prompt.
d. PS1
Cette variable contient la chaîne de caractères représentant le prompt principal.
Exemple
$ echo $PS1
$
$ PS1='Entrez une commande => '
Entrez une commande => date
Thu Jan 30 17:27:51 MET 2003
Entrez une commande =>
�Edit
ions
EN
I-
All
rights
reserv
ed
Paramétrage de l'environnement de travail
sh, ksh, bash 79
Avec le ksh et le bash, il est possible de paramétrer son prompt de telle façon qu'il
contienne en permanence la valeur du répertoire courant.
Faire apparaître la valeur du répertoire courant dans le prompt en ksh
Il faut se servir de la variable PWD.
Exemple
Ici, le prompt est composé de deux caractères : le symbole "$" suivi d'un espace
(cf. Figure 1) :
Figure 1 : Initialisation de PS1 avec le répertoire courant (1)
$
$ echo -$PS1-
-$ -
$
Le répertoire courant est /home/christie :
$
$ pwd
/home/christie
$
Chapitre 3
80 Programmation shell sous Unix/Linux
Initialisation de PS1 avec la chaîne de caractères '$PWD$ ' ; il faut empêcher
le shell de substituer $PWD par sa valeur au moment de l'affectation, donc il
faut protéger l'expression avec des quotes (cf. Figure 2) :
$
$ PS1='$PWD$ '
Figure 2 : Initialisation de PS1 avec le répertoire courant (2)
Le shell doit maintenant réafficher son prompt. Il va chercher la valeur de PS1
($PWD$ ). La variable PWD est évaluée et remplacée par sa valeur (actuelle-
ment/home/christie).
/home/christie$
Changement de répertoire :
/home/christie$ cd /tmp
�Edit
ions
EN
I-
All
rights
reserv
ed
Paramétrage de l'environnement de travail
sh, ksh, bash 81
Editions ENI
UnixAdministration du système
(AIX, HP-UX, Solaris, Linux) (2ième édition)
CollectionRessources Informatiques
Extrait
© E
diti
ons
ENI -
All
righ
ts r
eser
ved
128Administration du système (AIX, HP-UX, Solaris, Linux)
Unix
Les deux modes (bloc et caractère) correspondent aux deux types b et c.D'autre part, à l'emplacement habituel de la taille des fichiers, on remarquedeux nombres séparés par une virgule. Il s'agit de deux informations baptiséesmajeur et mineur. Le majeur (20) désigne le programme "driver" dans lestables internes du noyau. Le mineur (0 ou 1) est un argument transmis aumajeur. Il permet d'identifier soit un périphérique particulier, soit un moded'utilisation du périphérique (ici, il s'agit d'une densité pour la disquette).
Parfois, plusieurs noms de fichiers correspondent au même majeur et au mêmemineur. Dans l'exemple, /dev/fd0.18 et /dev/fd0h sont associés au mêmecouple "20,1". Ceci traduit simplement deux noms équivalents pourdésigner une même utilisation. Ces équivalences sont liées soit à un besoin desimplification des noms, soit à la préoccupation de compatibilité ascendantelors des évolutions de version. Les deux noms de l'exemple sont deux liensclassiques (on remarque leur compteur de liens égal à 2).
La commande mknod peut aussi servir à créer un fichier spécial. On lui four-nit le nom souhaité, le type (b ou c), le majeur et le mineur.
Cette commande est rarement appelée directement. Elle constitue plutôt lapremière étape interne de la mise en œuvre des périphériques.
On pourrait cependant l'employer ici pour créer un troisième nom dedisquette :
mknod /dev/diskette b 20 1
Particularité Solaris
Les noms associés aux périphériques Solaris sont de deux types :
– Noms physiques (noms internes)Ces noms sont situés dans le répertoire /devices où chaque contrôleur estreprésenté par un sous-répertoire contenant les véritables fichiers spéciaux.
– Noms logiques (utilisés dans les commandes)Ils sont situés, de manière classique, dans le répertoire /dev mais ce sont desliens symboliques vers le répertoire /devices.
129PériphériquesChapitre 3
Exemple
# ls -l /dev/mouse lrwxrwxrwx 1 root other 32 dec 6 20:24 /dev/mouse -> ../devices/pseudo/consms@0:mouse# cd /devices/pseudo # ls -l consms@0:mouse crw------- 1 root other 143,0 dec 6 20:39 consms@0:mouse#
Mode bloc
L'accès à ces périphériques se fait à l'aide de requêtes au système de gestion defichiers du noyau. Celui-ci gère un ensemble de tampons caches permettantde différer les écritures physiques et d'anticiper éventuellement les lectures.
Un périphérique géré en mode bloc donne la possibilité de création d'unfilesystem. Concrètement, ce mode correspond aux disques (partitions etvolumes logiques d'un disque dur, disquettes, CD-Rom).
Comme déjà précisé dans le chapitre Disques et systèmes de fichiers, ces péri-phériques peuvent aussi être utilisés en mode raw bloc, sans passer par le ges-tionnaire du noyau. Certaines commandes ou applications peuvent ainsi lesmanipuler directement. De ce fait, les périphériques en mode bloc ont deuxentrées dans le répertoire /dev, l'une de type b (bloc) et l'autre de type c (rawbloc). On se rappellera que les versions Linux ne conservent pas ce principe dela double entrée mais proposent une commande raw pour associer une entréeraw bloc à la seule entrée bloc en cas de besoin.
Mode caractère
Ce mode ne donne pas la possibilité de création d'un filesystem. Les entrées/sorties sont directes (sans utilisation de tampons caches du noyau) et lepilote sait gérer des caractères de validation ou d'interruptions.
Concrètement, ce mode correspond aux terminaux, bandes magnétiques,imprimantes...
© E
diti
ons
ENI -
All
righ
ts r
eser
ved
130Administration du système (AIX, HP-UX, Solaris, Linux)
Unix
2. Recensement des périphériques présentsLes noms des fichiers spéciaux sont spécifiques aux versions, voire aux typesde matériels de chaque constructeur. Chaque version propose cependant descommandes d'identification rapide des périphériques.
2.1 Périphériques AIX
AIX stocke beaucoup d'informations système dans une base de donnéesspécifique baptisée ODM (Object Data Manager) ; en particulier, tout ce quiconcerne la gestion des périphériques. La configuration courante se décline parrapport à une base de périphériques supportés. La commande lscfg permetd'afficher la configuration (un maximum de détails est obtenu avec l'option-v).
Les noms de périphériques sont très simples car ils sont constitués d'unpréfixe et d'un numéro d'ordre lors de la configuration. De ce fait, le nomde fichier spécial ne précise pas directement l'emplacement physique. Cetteadresse physique est affichée par la commande lscfg et s'interprète suivant letype de périphérique (adaptateur, périphérique SCSI, port série...). Unecommande plus interne, lsdev, permet aussi d'obtenir des informationsdétaillées.
Les préfixes des périphériques usuels sont :
– hdisk : disques durs.
– fd : disquettes.
– rmt : bandes.
– tty : terminaux.
– lp : imprimantes.
– cd : CD-Rom.
131PériphériquesChapitre 3
Bien que très spécifique, la configuration se fait de manière intuitive via lesmenus de l'utilitaire smit. La terminologie de ces menus est la suivante :
États
Transition d'états
2.2 Périphériques HP-UX
La commande ioscan permet d'obtenir une description complète de la confi-guration matérielle.
Elle est dotée de nombreuses options, dont par exemple :
-C class
Restriction de l'affichage à une certaine classe de matériel.
-f
Liste détaillée.
-n
Affichage des noms des fichiers spéciaux.
Supported Périphérique dont les caractéristiques sont connues.
Undefined État virtuel : périphérique encore inconnu.
Defined Périphérique déclaré mais non opérationnel.
Available Périphérique opérationnel.
Add a device supported ou undefined vers available.
Configure a device defined vers available.
Remove a device Suppression complète ou retour à l'état defined.
© E
diti
ons
ENI -
All
righ
ts r
eser
ved
132Administration du système (AIX, HP-UX, Solaris, Linux)
Unix
Exemple
# ioscan -fn -Cdisk Class I HW Path Driver SW State Type Description===================================================================disk 0 2/0/1.4.0 sdisk CLAIMED DEVICE TOSHIBA CD-ROM XM-5701TA /dev/dsk/c0t4d0 /dev/rdsk/c0t4d0disk 1 2/0/1.5.0 sdisk CLAIMED DEVICE MICROP 2112 /dev/dsk/c0t5d0 /dev/rdsk/c0t5d0disk 2 2/0/1.6.0 sdisk CLAIMED DEVICE CONNER CFP2107S 2.14GB /dev/dsk/c0t6d0 /dev/rdsk/c0t6d0## ioscan -f Class I HW Path Driver SW State Type Description===================================================================bc 0 root CLAIMED BUS_NEXUS ...................................................................ext_bus 0 2/0/1 c720 CLAIMED INTERFACE Built-in SCSI...................................................................disk 0 2/0/1.4.0 sdisk CLAIMED DEVICE TOSHIBA CD-ROM XM-5701TAdisk 1 2/0/1.5.0 sdisk CLAIMED DEVICE MICROP 2112disk 2 2/0/1.6.0 sdisk CLAIMED DEVICE CONNER CFP2107S 2.14GB...................................................................lan 0 2/0/2 lan2 CLAIMED INTERFACE Built-in LANtty 0 2/0/4 asio0 CLAIMED INTERFACE Built-in RS-232Ctty 1 2/0/5 asio0 CLAIMED INTERFACE Built-in RS-232Cext_bus 1 2/0/6 CentIf CLAIMED INTERFACE Built-in Parallel...................................................................#
2.3 Périphériques Solaris
La commande prtconf affiche la configuration matérielle sous une forme peuclaire :
# prtconf System Configuration: Sun Microsystems i86pcMemory size: 127 MegabytesSystem Peripherals (Software Nodes):i86pc +boot (driver not attached).......................................... isa, instance #0 motherboard (driver not attached)
133PériphériquesChapitre 3
asy, instance #0 asy, instance #1 lp (driver not attached) fdc, instance #0 .......................................... pci, instance #0 pci1028,4094 (driver not attached) display, instance #0 ..........................................
Deux commandes plus internes, getdev et devattr, peuvent fournir des infor-mations plus concrètes :
# getdev type=disk disk1# devattr -v disk1 alias='disk1'bdevice='/dev/dsk/c0d0s2'capacity='0'cdevice='/dev/rdsk/c0d0s2'desc='Disk Drive'dpartlist='dpart100,dpart102,dpart103,dpart104,dpart105'part='true'removable='false'type='disk'#
2.4 Périphériques Linux
La commande dmesg affiche tous les messages concernant le démarrage dusystème. On y trouve une bonne description des périphériques reconnus.
Exemple
On extrait ici tous les messages concernant les disques (hd).
# dmesg | grep hd Kernel command line: ro root=/dev/hda5 ide0: BM-DMA at 0xfcd0-0xfcd7, BIOS settings: hda:pio, hdb:pio ide1: BM-DMA at 0xfcd8-0xfcdf, BIOS settings: hdc:pio, hdd:piohda: FUJITSU MHD2032AT, ATA DISK drive hdb: SR200S, ATAPI CD/DVD-ROM drive