Actions sur le document
Mes premiers pas avec OpenVMS
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. |
|
$ EXIT $STATUS + 0 * F$VERIFY(VER) |
! Dernière ligne de votre procédure |
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 fichierCertaines 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.
![]()
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.
![]()
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.
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> SEND /FOREIGN KANGOUROU.EXE
To: SYLTREM
CC:
Subj: Salut Syltrem! Voici mon kangourou boxeur!
MAIL> EXIT
Réception du message par SYLTREM
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
![]()
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.
![]()
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
