programmation shell sous unix/linux · editions eni programmation shell sous unix/linux sh, ksh,...

14
Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3 ième édition) Collection Ressources Informatiques Extrait

Upload: lydung

Post on 11-Sep-2018

263 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources Informatiques Extrait

Editions ENI

Programmation shell sous Unix/Linux

sh, ksh, bash(3ième édition)

CollectionRessources Informatiques

Extrait

Page 2: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources 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

Page 3: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources Informatiques Extrait

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

Page 4: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources Informatiques Extrait

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

Page 5: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources Informatiques Extrait

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

Page 6: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources Informatiques Extrait

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

Page 7: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources Informatiques Extrait

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

Page 8: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources Informatiques Extrait

Editions ENI

UnixAdministration du système

(AIX, HP-UX, Solaris, Linux) (2ième édition)

CollectionRessources Informatiques

Extrait

Page 9: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources 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.

Page 10: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources Informatiques Extrait

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...

Page 11: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources Informatiques Extrait

© 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.

Page 12: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources Informatiques Extrait

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.

Page 13: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources Informatiques Extrait

© 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)

Page 14: Programmation shell sous Unix/Linux · Editions ENI Programmation shell sous Unix/Linux sh, ksh, bash (3ième édition) Collection Ressources Informatiques Extrait

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