Outils personnels
Vous êtes ici : Accueil Blog Mes premiers pas avec OpenVMS
Navigation
 
Actions sur le document

Mes premiers pas avec OpenVMS

Filed Under:

Mes premiers pas avec OpenVMS. Un grand merci au site de Syltrem http://pages.videotron.com/syltrem/

Quelques commandes classiques

Si vous cherchez à faire quelque chose et que vous ne voyez pas la commande ici, faites HELP pour obtenir une liste des commandes et de l'aide sur leur fonction et utilisation. Vous y trouverez également une rubrique hints qui pourra vous guider vers ce que vous cherchez.

Commande Qualificatifs d'usage courant Description
DIRECTORY nom_fichier  DIR Liste des fichiers. Si nom_fichier est omis, on obtient la liste de tous les fichiers du répertoire courant.
  /SIZE Indique le dimension du fichier, en blocs de 512 bytes
  /DATE Date de création du fichier. /DATE=MODIFIED donnera la date de modification
  /FULL Affichera tous les attributs d'un fichier
     
SET DEFAULT disque:[répertoire]  SD Aller dans un autre répertoire
SHOW DEFAULT  SH Indique le répertoire courant
     
COPY origine destination   Copie le(s) fichier(s) origine vers la destination
DELETE nom_fichier;version   Détruit le fichier indiqué. Il est obligatoire d'indiquer le numéro de version
PURGE nom_fichier   Détruit toutes les versions antérieurs du fichier
RENAME nom_fichier nouveau_nom   Renommer un fichier, ou le déplacer d'un répertoire vers un autre
     
EDIT nom_fichier   Modifier un fichier à l'aide de l'éditeur de texte. Appuyer sur la touche PF2 pour obtenir de l'aide
     
@nom_procédure   Exécuter une procédure DCL (fichier de type .COM, contenant une série d'instructions en DCL)
SUBMIT nom_procédure   Exécution comme avec @, mais en mode batch (placer le fichier de commande dans la file d'exécution)
  /QUEUE=nom Pour spécifier une queue d'exécution particulière (défaut = SYS$BATCH)
SHOW QUEUE /BATCH   Obtenir la liste des queues d'exécution disponibles
  /ALL Liste les travaux d'impression en attente sur les queues d'impression
     
PRINT nom_fichier   Place le fichier sur la file d'attente d'impression
  /QUEUE=queue Pour indiquer une queue d'impression particulière (défaut = SYS$PRINT)
SHOW QUEUE /DEVICE   Obtenir la liste des queues d'impression disponibles
  /ALL Liste les travaux d'impression en attente sur les queues d'impression
     
SEARCH fichiers "chaîne_caractères"   Chercher une chaîne de caractère dans un ou des fichiers
DIFFERENCE fichier_a  fichier_b   Examiner les différences entre deux fichiers
     
SET FILE /PROTECTION=(prot)   Change la protection d'un fichier
CREATE /DIRECTORY [rep]   Création d'un répertoire
     
INITIALIZE  unité:  étiquette   Pour initialiser une ruban magnétique monté sur unité, avec l'étiquette
MOUNT unité: étiquette   Pour monter le ruban (logiquement, s'entend)
  /DENSITY=dens Densité des données enregistrées (pour les roulettes de 2400 pieds). 6250 ou 1600.
BACKUP  fichiers  unité:  nom_:sauv /SAVE_SET   Sauvegarde de fichiers sur l'unité de ruban, dans le fichier ruban nommé nom_sauv.
DISMOUNT unité   Démonter le ruban et libérer l'unité
     
SHOW DEVICE D   Montre les disques et l'espace libre sur chacun
SHOW MEMORY   Montre la mémoire réelle et virtuelle disponible
     
MONITOR SYSTEM  MONI Affiche un tableau sur l'activité courante du système

 

Symboles de commande encombrants

 

DCL ne tient compte que des quatre premières lettres des mots-clés dans une commande. Alors si quelqu'un a défini un symbole de commande du genre:
$ DEL*ETE:==DELETE/CONFIRM/LOG
et que vous voulez utiliser les qualificatifs par défaut de DELETE, il vous faudrait taper
$ DELETE/NOCONFIRM/NOLOG
pour annuler l'effet du symbole. Pour simplifier le tout et afin d'éviter que le symbole soit utilisé, tapez plutôt
$ DELEO ou DELEA ou ...
En effet, seuls les 4 premiers caractères sont tenus en compte, alors DCL comprendra que vous faites un DELETE mais surtout, vous n'utiliserez pas le symbole. C'est une habitude que je prends lorsque je travaille dans un compte utilisateur autre que le mien, et il m'arrive aussi d'utiliser ce truc dans des procédures de commandes pour m'assurer d'un traitement correct, que la procédure soit exécutée par n'importe quel utilisateur.
Ce sont le plus souvent les commandes DELETE, SUBMIT, PRINT et DIRECTORY que les gens vont personnaliser à l'aide de symboles.

Utilisez des fichiers temporaires sans causer de conflits

On a souvent besoin d'un fichier temporaire dans une procédure, et il est habituellement souhaitable de le nommer de manière à éviter des conflits dans le cas où celle-ci serait exécutée simultanément par plusieurs utilisateurs. J'ai l'habitude d'inclure le PID dans le nom du fichier temporaire et d'y référer par un nom logique.
Au sortir de la procédure, je fais mon petit ménage en me servant toujours du nom logique suivi de ":;*" pour détruire toutes les versions de ce fichier.

$ DEFINE  TMP  SYS$LOGIN:ACHILLE_'F$GETJPI(0),"PID").TMP
$ SHOW SYSTEM/OUTPUT=TMP:
$ DELETE/NOCONFIRM/NOLOG TMP:;*
$ EXIT

Bien utiliser f$verify()

On désire souvent qu'une procédure soit exécutée en mode NOVERIFY (un des exemples le plus courant est le login.com en BATCH, qu'on ne veut pas voir détaillé dans chaque .LOG). La fonction lexicale F$VERIFY() est utilisée à cette fin, et son usage comporte quelques particularités uniques:

D'abord, la fonction retourne la valeur 1 (VERIFY) ou 0 (NOVERIFY) d'après le réglage courant au moment où elle est exécutée. Ensuite, elle modifie ce réglage d'après la valeur passée en paramètre. Vous pouvez donc le changer et le remettre à son état initial ensuite. C'est ce que je fais dans l'exemple ci-dessous
Maintenant une chose importante: Si vous utilisez l'apostrophe (substitution) la modification du réglage est immédiate. Sans l'apostrophe, elle prendra effet après l'exécution de la ligne de commande. Plus important encore: si vous utilisez l'apostrophe, le changement de réglage aura lieu même si la commande est placée dans un commentaire.

$ VER = 'F$VERIFY(0)

! Première ligne de votre procédure.
! Avec l'apostrophe: on ne verra même pas cette ligne qui, avec le
! paramètre 0, change immédiatement le réglage à NOVERIFY
! VER recevra la valeur de l'état courant.

$ EXIT $STATUS + 0 * F$VERIFY(VER)

! Dernière ligne de votre procédure
! Sans l'apostrophe afin que cette ligne ne soit jamais affichée.
! Remet verify à son état initial après  l'exécution de la procédure.
! La petite formule est utilisée pour sauvegarder la valeur de
! $STATUS.

 

Sauter l'exécution de LOGIN.COM

Peut-être avez-vous déjà voulu vous connecter dans un compte utilisateur sans que le LOGIN.COM soit exécuté (peut-être pour corriger une erreur dans celui-ci) ? Dans ce cas voici une manière simple de le faire: ajoutez le qualificatif /NOCOMMAND au nom d'utilisateur.

Username: LEFUNESTE /NOCOMMAND

Notez cependant que cela ne pourra pas fonctionner si le compte est protégé pas les drapeaux RESTRICTED ou CAPTIVE.

Redirection de la sortie d'une commande vers un fichier

Certaines commandes,comme SHOW SYMBOL, ne peuvent pas être redirigées vers un fichier (il n'y a pas de qualificatif /OUTPUT=).  Avec un peu d'imagination on peut tout de même y arriver. En effet la sortie de la commande @ (exécution d'une procédure de commande) peut être redirigée, alors:

$ @SYS$INPUT /OUTPUT=TINTIN.LIS
_$ SHOW  SYMBOL /ALL /GLOBAL
_$ EXIT

SYS$INPUT devient une procédure exécutée par la commande @; on peut en rediriger la sortie n'importe où.

You have 1 new mail

Un autre truc qui n'en est pas vraiment un: vous est-il déjà arrivé que l'utilitaire mail vous indique que vous avez de nouveaux messages mais qu'en fait, aucun n'est disponible dans le dossier NEWMAIL ? Pour remettre à zéro le compteur de messages, entrez la commande suivante:

MAIL> READ/NEW

On peut aussi consulter dans les fichiers de VMS Mail la valeur de ce compteur. Je le fais pour entrer automatiquement dans MAIL dans mon LOGIN.COM lorsque j'ai des messages. Il suffit de consulter le fichier SYS$SYSTEM:VMSMAIL_PROFILE.DATA.

Crooked_Line.gif (926 octets)

Commande WAIT - utilisation non documentée

Si vous consultez la documentation, vous y lirez que le paramètre de la commande WAIT est un delta time. Alors si l'on veut attendre jusqu'à une heure précise, il faut d'abord y soustraire l'heure courante pour obtenir le delta time équivalent à l'intervalle de temps qui nous sépare de ce moment. Ce n'est pas toujours simple...

Saviez-vous qu'il est aussi possible de donner directement un temps absolu ?

$ WAIT 12-JUL-1999 13:45:00

Il est bien important de donner la date (même s'il s'agit de la date courante), et de la séparer de l'heure par un espace.

Effacement de l'écran

Vous aimeriez pouvoir définir un symbole de commande pour effacer l'écran, comme on peut le faire avec la commande CLS de DOS ?

Voici deux méthodes:

$ CLS :== TYPE  NL:  /PAGE

ou

$ ESC[0,8] == 27
$ CLS :== WRITE SYS$OUTPUT ESC, """[2J""",ESC,"""[H"""

Je préfère la seconde méthode puisqu'elle ne demande pas qu'une image soit exécutée.

Crooked_Line.gif (926 octets)

Avez-vous bien lu les manuels ?

Voici d'autres trucs qui n'en sont pas vraiment, puisqu'ils sont documentés. Par contre, il y en a qu'on omet d'utiliser et qui sont très pratiques.

SET TERMINAL /NOECHO

Pour que ne soient pas affichés les caractères entrés à l'écran. Très pratique lorsque vous demandez un mot de passe. De plus, l'entrée en question ne figurera pas dans la liste de rappel (RECALL buffer).

COPY DISQUE1:[ZORRO...]*.* DISQUE2:[*...]

La commande COPY peut replacer les fichiers dans les bons sous-répertoires, comme BACKUP le fait. Cependant, le répertoire racine de la destination doit exister au préalable; il ne sera pas créé comme avec BACKUP.
Important à retenir: cela ne fonctionnera pas au travers DECnet.

SHOW SYSTEM /NOPROCESS

Pour connaître la version de OpenVMS ou l'heure de redémarrage, sans que soit affichée la liste des processus.

SET OUTPUT dans une procédure soumise en lot, puis TYPE SYS$LOGIN:nom-procédure.LOG /OUTPUT=fichier.typ et MAIL fichier.typ
Cette séquence de commandes permet d'envoyer par courrier éléctronique le fichier .LOG d'une procédure en lot (batch) pour signaler au destinataire une erreur dans le traitement, par exemple. Ainsi l'utilisateur visé peut prendre connaissance du problème directement dans le message qu'il reçoit.

SYNCHRONIZE /ENTRY=

Pour synchroniser des procédures qui doivent s'exécuter en séquence. La commande mettra en attente la procédure jusqu'à ce que l'entrée indiquée soit complétée.

Les qualificatifs /PARALLEL et /IGNORE=(VALEUR,VALEUR) de la commande DIFFERENCES
Permettent de voir les résultats côte-à-côte plutôt qu'un sous l'autre, ce qui permet un meilleure lisibilité et aussi en éliminant des éléments qui ne représentent pas toujours des différences significatives, comme des sauts de ligne, des espaces multiples entre les mots, etc.

Vérifier l'existence d'un répertoire

Vous pouvez utiliser la fonction lexicale F$PARSE() pour savoir si un répertoire donné existe bien. En effet, F$PARSE() retournera une chaîne vide si le répertoire ou le disque de la spécification de fichier donnée en paramètre n'existe pas.

Je me sers de cette fonctionnalité pratique dans ma procédure de sauvegarde journalière pour déterminer, sur mon VMScluster, si un disque est un disque "system" ou non. Auquel cas je fais une sauvegarde de type image. Puisque nous avons des VAX est des Alpha il y a en tout 2 disques "system" (un pour chaque architecture).

$ LOOP:
$ DISK = F$DEVICE("*", "DISK")
$ IF DISK .EQS. "" THEN EXIT
$ IF         F$PARSE(DISK + "[VMS$COMMON]") ,NES, ""
$ THEN  QUALIFIER = "/IMAGE"
$              FILES = ""
$ ELSE   QUALIFIER = ""
$              FILES = "[*...]*.*
$ ENDIF
$ BACKUP 'DISK''FILES''QUALIFIER'
$ GOTO LOOP

Envoi d'une pièce jointe dans VMS Mail

Saviez-vous qu'il est possible d'envoyer tout type de fichier à un autre utilisateur avec l'utilitaire MAIL? Bien que ce ne soit pas documenté, il existe un qualificatif /FOREIGN aux commandes SEND et EXTRACT (depuis l'utilitaire MAIL) et à la commande MAIL (depuis DCL). Voici comment cela fonctionne:

Envoi du message contenant le fichier (ici un programme exécutable)

$ MAIL
MAIL> SEND /FOREIGN  KANGOUROU.EXE
To: SYLTREM
CC:
Subj: Salut Syltrem! Voici mon kangourou boxeur!
 MAIL> EXIT

Réception du message par SYLTREM

 $ MAIL

You have 1 new message

MAIL> DIR
NEWMAILFrom                         Date                                         Subject
1 ZORRO::SOPHIE    23-OCT-2000 07:01:12.83     Salut Syltrem! Voici mon kangourou boxeur!

 

MAIL> EXTRACT  SKIPPY.EXE
%MAIL-I-CREATED, MON$DISQUE:[SYLTREM]SKIPPY.EXE;1 created
MAIL> EXIT

Servez-vous de cette fonctionnalité pour envoyer à des utilisateurs des fichiers que vous ne pouvez copier directement dans leur répertoire, faute d'y avoir un accès en écriture. On peut également envoyer un fichier à une adresse SMTP (ex.: SMTP%"monami@copains.com"); le destinataire le recevra comme pièce jointe.

Transferts de fichiers avec FTP

L'entête des fichiers RMS contient des informations sur la structure interne du fichier, appelées attributs. Lorsque vous recevez des fichiers stockés sur un serveur autre que VMS par la commande FTP, les attributs de fichiers seront vraisemblablement perdus dans le transfert, rendant le fichier reçu inutilisable. Cette condition peut occasionner des messages tels que ceux-ci:
%IMGACT-F-NOTNATIVE, image is not an OpenVMS Alpha image
%BACKUP-F-NOTSAVESET, MON$DISQUE:[SYLTREM]NICK.BCK;2 is not a BACKUP save set.
La structure interne n'est pas modifiée durant le transfert, mais les attributs perdus ne permettent plus de lire le fichier correctement. Prenons pour exemple une image exécutable. Pour ce type de fichier, la longueur des enregistrements doit être fixe et d’une longueur de 512 octets. Après un transfert, les attributs indiquent format Stream, Longueur 0, ce qui ne correspond pas à la réalité. Vous pouvez corriger le fichier facilement en utilisant la commande :

$ SET FILE /ATTRIBUTES=(RAT=NONE, RFM=FIX, LRL=512) TEST.EXE ! RAT=Record Attributes
! RFM=Record Format
! LRL=Longuest Record Length

Pour d’autres types de fichiers, les attributs à modifier seront différents ou auront d’autres valeurs.

  • Pour un save-set de backup, la valeur pour LRL est égale à la valeur de /BLOCK= tel que spécifié lors de la création du save-set. Pour un fichier objet (.OBJ) ou un librairie d'objets (.OLB) , la longueur est de 512 octets.
    Pour automatiser cette opération, utilisez RESTORE_BACKUP_SAVESET_ATTR.COM.

  • Comparez les attributs d'un fichier corrompu avec ceux d'un autre fichiers de même type que vous savez intègre, avec la commande DIRECTORY /FULL. Vous verrez les attributs que vous devrez changer.

  • On ne peut pas utiliser cette méthode pour un fichier indexé. Utilisez plutôt CONVERT /FDL pour reconstruire les index.

L'instruction SET FILE /ATTRIBUTES ne remplace pas CONVERT /FDL car elle n'apporte pas de changements physiques au fichier, mais uniquement des changements logiques. Lorsque que cela suffit cependant, c'est beaucoup plus rapide à exécuter. Je m'en sert régulièrement pour pouvoir utiliser des fichiers reçus par courrier électronique ou pour utiliser les fichiers d'installation d'un logiciel sur CD-ROM ne provenant pas de Digital.

Identifier l'architecture (VAX ou Alpha) d'une image

Cette information se trouve dans l'entête (header) du fichier .EXE.
Vous pouvez écrire un petit DCL qui fera le travail pour vous, ou bien alors utilisez le qualificatif /SELECT de la commande ANALYZE /IMAGE (à partir de 7.1, mais documenté dans 7.3 seulement).

$ ANALYZE /IMAGE /SELECT=ARCHITECTURE *.EXE

Crooked_Line.gif (926 octets)

Valeurs par défaut dans les spécifications de fichiers
Dans les commandes acceptant des noms de fichiers en paramètre, les éléments manquants d'un nom de fichier reçoivent toujours une valeur par défaut. Ces éléments manquants recevront une valeur d'après le répertoire par défaut
(c.f. SHOW DEFAULT). Dans une liste de fichiers cependant, ces éléments seront pris dans la spécification de fichier qui précède dans la liste.

Exemple:

$ SET DEFAUT D1:[PATOF]
$ DIR F.LIS, B, [DONG].EXE

est équivalent à DIR D1:[PATOF]F.LIS, D1:[PATOF]B.LIS, D1:[DONG]B.EXE

Dans l'exemple, si B était un nom logique, le résultat aurait pu être assez différent:

$ SET DEFAUT D1:[PATOF]
$ DEFINE B D2:[CARTON]KOALA.COM
$ DIR F.LIS, B, [DONG].EXE

serait équivalent à DIR D1:[PATOF]F.LIS, D2:[CARTON]KOALA.COM,
D2:[DONG]KOALA.EXE


C'est très pratique et je m'en sert tout le temps pour éviter de taper des caractères pour rien (la paresse est souvent une bonne chose).
Ce comportement est une règle, mais d'autres commandes utilisent une variation de ce même principe dans un contexte différent. DIFFERENCES et ANALYZE /IMAGE par exemple utiliseront des défauts qui sont plus en accord avec la fonctionnalité de ces commandes. DIFFERENCES appliquera la règle ci-dessus pour former le nom du 2ème paramètre (fichier à comparer au premier), et ANALYZE /IMAGE changera le défaut pour SYS$SYSTEM:.EXE car les images de OpenVMS sont dans ce répertoire.

Vous aussi pouvez faire la même chose dans vos procédures avec la fonction F$PARSE(). Voyez dans l'aide comment utiliser les deuxième et troisième paramètres de cette fonction.

Crooked_Line.gif (926 octets)

Rechercher une ligne blanche dans un texte

Utilisez l'éditeur TPU. C'est l'éditeur par défaut depuis 6.x mais vous pouvez l'appeler à coup sûr avec la commande EDIT /TPU.

Faites une recherche avec caractères frimés (wildcard find (GOLD/FIND)) et cherchez pour:
\<\>       Trouvera une ligne blanche.
\<\w\>   Trouvera une ligne ne contenant que des espaces ou des tabulations

Le wildcard find vous permet de chercher une multitude de choses dans un document. Faites SHOW WILDCARD dans TPU, vous serez étonné des possibilités méconnues qui sont offertes.

Rendre vos procédures indépendantes de l'environnement

Si vous êtes comme moi et êtes un tant soit peu précautionneux, vous avez dans votre LOGIN.COM l'instruction qui suit:

$ DEL*ETE :== DELETE /CONFIRM

Ce qui est fâchant parfois, c'est que lorsqu'on exécute une procédure écrite par quelqu'un d'autre