Programmation en DCL - Notions de base

DCL est un incontournable pour tout qui travaille avec OpenVMS. En effet, aussitôt branché sur un terminal l'invite DCL, le signe de dollar ($), attend vos instructions.

Les instructions DCL

Ces instructions, ou commandes, sont généralement formées d'un verbe suivi de paramètres. Le tout peut être accompagné de qualificatifs qui préciseront les détails de votre requête. Certains qualificatifs doivent recevoir une valeur pour être complets, comme vous le constaterez dans les exemples qui suivent. Le code couleurs utilisé dans ce paragraphe pour identifier les différents éléments des commandes, sera adopté dans les exemples qui suivent.

D'autres commandes regroupent toute la panoplie des IF-THEN-ELSE-ENDIF, GOTO, GOSUB, CALL, et l'utilisation de variables numériques et alphanumériques, qui permettent la création de procédures de commandes très élaborées. Comme dans tout langage qui se respecte, on peut bien sûr lire et mettre à jour des fichiers de données. Des fonctions (lexicals) permettent entre autres de retourner de l'information sur l'environnement (utilisateur, ordinateur, disques, etc) rendant ainsi possible la programmation de procédures efficaces pour la gestion de votre ordinateur, ou la mise en place de menus.

Le langage de commande DCL est assez intuitif. Voyons quelques exemples:


C'est somme toute plutôt simple...  Analysons maintenant en détail la commande suivante:
PRINT /QUEUE=VENTES$PRINT TEST.TXT /COPIES=2, TEST.LIS /HEADER
qui pourrait se lire en français:
Envoyer à l'imprimante nommée VENTES$PRINT le document TEST.TXT en 2 copies, et aussi TEST.LIS sur lequel imprimer une  ligne d'entête au haut de chaque page.

Verbe C'est la commande en tant que telle. Il correspond au programme qui traitera la requête.
PRINT Envoyer des fichiers à l'imprimante.
Paramètre Les paramètres de la commande PRINT sont les noms des fichiers à imprimer
TEST.TXT
TEST.LIS
/Qualificatif Modificateurs de la commande; permet d'être plus spécifique dans votre demande. Un qualificatif est toujours précédé d'une barre oblique (/).
Ils peuvent modifier la commande en son tout, ou agir sur le paramètre qui le précède. Tout dépend de la nature du qualificatif.
./QUEUE Spécifie l'imprimante à utiliser (une queue est une file d'attente; les documents y sont placés à la queue leu leu). Agit sur la commande entière.
/COPIES Indique le nombre de copies à imprimer. Placé juste après le paramètre TEST.TXT, il agit sur celui-ci uniquement.
/HEADER Demande d'imprimer en entête de chaque page du document, une ligne d'information contenant le nom du fichier ainsi que la date d'impression. Placé juste après le paramètre TEST.LIS, il agit sur celui-ci uniquement.
=Valeur Complète l'énoncé d'un qualificatif. C'est un peu comme le paramètre de ce dernier. Elle doit suivre immédiatement le qualificatif auquel elle se rapporte, et être précédée du signe égal (=).
VENTES$PRINT Spécifie exactement quelle imprimante (queue) doit être utilisée.
=2 Le qualificatif /COPIES serait incomplet si le nombre de copies ne serait pas indiqué.

Il est bon de savoir que DCL ne fait pas la différence entre majuscules et minuscules, et que l'on peut abréger les mots-clés des commandes et qualificatifs, tant qu'il n'y a pas d'ambigüité (4 caractères suffiront habituellement). Enfin, n'hésitez pas à consulter l'aide en ligne (commande HELP) qui vous aidera beaucoup à connaître les commandes et leurs qualificatifs possibles. Avec l'expérience, vous devinerez beaucoup de commandes sans avoir à vous référer à l'aide en ligne ou aux manuels. En effet, beaucoup de commandes et qualificatifs sont simplement le mot anglais correspondant à l'item que vous désirez, comme par exemple si vous voulez connaître le propriétaire d'un fichier, ajouter le qualification /OWNER à la commande DIRECTORY. C'est aussi simple que cela.

 

Spécifications de fichiers

Maintenant que vous connaissez un peu la manière d'énoncer une commande, vous voudrez connaître la syntaxe en usage pour les noms de fichiers. Pour plusieurs commandes, les paramètres sont effectivement des noms de fichiers. Encore un peu de théorie, alors:

                         

Une spécification de fichier s'énonce comme suit: DISQUE:[REPERTOIRE]NOM.TYPE;VERSION. Chaque composant est un mot formé de lettres et de chiffres, auxquels peuvent s'ajouter quelques caractères spéciaux comme le souligné (_) et le signe de dollar ($).

DISQUE: Le nom du disque suivi de deux-points (:)
DUA1:
TWEETY$DKA500:
[RÉPERTOIRE] Le nom du répertoire entouré de parenthèses carrées ("[" au début et "]" à la fin). S'il y a des sous-répertoires, les différents niveaux sont séparés par des points (.).
Un nom de répertoire peut être formé de lettres et de chiffres, et également quelques caractères spéciaux comme le souligné (_) et le signe de dollar ($).
[TOONS]
[BUGS.BUNNY]
NOM Le nom du fichier, qui peut comporter des lettres et des chiffres, et quelques caractères spéciaux comme le souligné (_) et le signe de dollar ($).
CLUSTER_CONFIG
BASIC$STARLET
.TYPE Le type, souvent appelé extension. Il est précédé d'un point (.) et indique le genre de fichier (document texte, programme, etc)
.COM Fichier de commandes DCL
.EXE Programme compilé exécutable (communément appelé image)
.LIS Fichier de sortie (liste, rapport, etc)
.DIR Répertoire de fichiers
;VERSION Le numéro de version, précédé du point-virgule (;).
Chaque nouveau fichier créé se voit attribué le numéro de version 1. Si le fichier est modifié (dans l'éditeur de texte par exemple) puis sauvegardé, une nouvelle version (;2) est créée. Le fichier original n'est pas écrasé. Cela est très utile lorsqu'on fait des modifications répétées sur un programme et que l'on désire retourner en arrière lorsque çà tourne mal. On doit cependant faire soi-même sont petit ménage pour éliminer les versions inutiles, ou mettre en place un nombre maximum de versions.
;123


Notions avancées

Quand vous serez bien à l'aise avec la syntaxe énoncée ci-dessus, revenez jeter un coup d'oeil à ce qui suit. Ne vous tracassez pas avec ceci si vous n'en êtes envore qu'au début de votre apprivoisement de DCL.

Une notation relative de répertoire peut être utilisée:
Le signe moins (-) signifie "un niveau plus haut".
[-.ELMER] indique le répertoire appelé ELMER, au même niveau que le répertoire courant. C'est-à-dire que si l'on est dans le répertoire [TOONS.BUGS.BUNNY] on se retrouvera dans [TOONS.BUGS.ELMER].
[--] indique le répertoire deux niveaux plus haut. Alors si au départ nous pointons sur [TOONS.BUGS.BUNNY] on se retrouvera dans [TOONS]. On peut utiliser autant de "-" que nécessaire.
L'ellipse indique "tous les niveaux en dessous".
[TASMANIAN…] signifie: le répertoire [TASMANIAN] et tous ses sous-répertoires.
[…] signifie: le répertoire courant et tous ses sous-répertoires.
Mettre un point devant un nom de répertoire indique qu'il s'agit d'un sous-répertoire.
[.BUGS] indique [TOONS.BUGS] si au départ on se trouve dans [TOONS].
Le répertoire racine d'un disque est représenté par [000000]. Celui-ci contient tous les répertoires principaux plus quelques fichiers requis par RMS (Record Manageent System).

 

Dans certaines commandes (en particulier DIRECTORY, COPY, etc), des caractères frimés (wildcards) peuvent être employés dans le répertoire, le nom et le type d'un fichier.
Le pourcentage (%) tient lieu d'un caractère:
L'astérisque (*) tient la place d'aucun ou plusieurs caractères
On peut utiliser n'importe quelle combinaison et placer les caractères frimés à n'importe que endroit:
Ex.:  [B*D*]PIERRE_TO%BAL.*

 

Un numéro de version relatif peut être employé.
; seul (non suivi d'un chiffre) signifie "dernière version" (la plus récente; celle dont le numéro est le plus élevé)
;-1 indique la version précédente du fichier, et ainsi de suite (;-2, ;-3…)
;-0 indique le numéro de version le plus petit pour ce fichier. Si les versions ;10, ;11 et ;12 sont présentes, il s'agit de la version ;10

 

Si le protocole de communication DECnet est utilisé, on peut indiquer un nom de noeud dans une spécification de fichier pour ainsi accéder un fichier sur un autre ordinateur du réseau. Le nom de noeud doit être suivi du double deux-points (::). Optionnellement, ceux-ci peuvent être précédés d'un nom d'utilisateur et d'un mot de passe encadrés de guillemets (") pour valider l'accès à l'ordinateur en question. Voyez la documentation sur la sécurité VMS pour plus de détails sur ce genre d'accès.

 

Messages d'erreur

OpenVMS indiquera toujours un message d'erreur détaillé et compréhensible lorsqu'une commande ou une opération se termine anormalement. Ces messages ont un format standard qu'il est bon de connaître.

Un message est formé de quatre (4) éléments distincts. Chacun remporte une information spécifique sur la nature de l'erreur. Le format général est le suivant:

%MODULE-S-ABRÉVIATION, texte

MODULE Nom du module de traitement dans lequel l'erreur s'est produite
CLI
DIRECT
Command Language Interpreter (DCL)
DIRECTORY (la commande de ce nom)
S Sévérité du message
S
I
W
E
F
Succès
Information
Avertissement
Erreur
Erreur Fatale
ABRÉVIATION Mot indiquant la cause de l'erreur, en format abrégé
NOFILES
MAXPARAM
Signifie: aucun fichier trouvé
Signifie: trop de paramètres
texte Texte explicatif expliquant la nature de l'erreur
too many parameters - reenter command with fewer parameters
error opening DUA1:[DAFFY]DUCK.DAT; as input

Certaines commandes font appel à plusieurs modules de traitement, et lorsqu'une erreur survient dans un sous-module, plusieurs lignes de messages peuvent être affichées. Chaque ligne donne une partie de la cause de l'erreur. Les lignes subséquentes sont habituellement précédées d'un tiret (-) plutôt que du signe de pourcentage (%):

$ COPY LEONARD.LIS *.*
%COPY-E-OPENIN, error opening DUA1:[BEDES]LEONARD.LIS; as input
-RMS-E-FNF, file not found

Le premier message provient de la commande que nous avons appelée (COPY) et indique que le fichier à copier (fichier en entrée) n'a pas pu être ouvert. Ce message serait incomplet s'il n'était suivi du second message, venant de RMS (c'est le file system de OpenVMS) qui indique que le fichier n'existe pas. Ce dernier message est très important dans la compréhension de l'erreur et vous permettra de la corriger.

Un autre exemple mettra plus en évidence l'importance d'avoir plusieurs niveaux de messages.
$ COPY LEONARD.LIS  GENIE.*
%COPY-E-OPENIN, error opening DUA1:[BEDES]LEONARD.LIS;1 as input
-RMS-E-PRV, insufficient privilege or file protection violation

Cette fois-ci, le premier message est exactement le même, mais le second nous renseigne sur la cause exacte de l'impossibilité pour la commande COPY d'ouvrir le fichier LEONARD.LIS. En effet, les protections du fichier nous en bloquent l'accès.

 

Eh! bien voilà, c'est assez pour un début. Vous pourrez consulter le dictionnaire DCL en ligne ou imprimé pour connaître les commandes et leur paramètres. Rappelez-vous, la majorité des commandes et qualificatifs sont un mot anglais très significatif de leur fontion. Avec l'usage, vous viendrez à en deviner plusieurs sans avoir à vous référer a la documentation.