mirror of
https://github.com/fdiskyou/Zines.git
synced 2025-03-09 00:00:00 +01:00
1313 lines
52 KiB
Text
1313 lines
52 KiB
Text
![]() |
==Phrack Inc.==
|
||
|
|
||
|
Volume Three, Issue Thirty-five, File 7 of 13
|
||
|
|
||
|
<:=--=:><:=--=:><:=--=:><:=--=:>\|/<:=--=:><:=--=:><:=--=:><:=--=:>
|
||
|
<:=--=:> <:=--=:>
|
||
|
<:=--=:> >>>>>=-* Users Guide to VAX/VMS *-=<<<<< <:=--=:>
|
||
|
<:=--=:> <:=--=:>
|
||
|
<:=--=:> Part I of III <:=--=:>
|
||
|
<:=--=:> <:=--=:>
|
||
|
<:=--=:> Part A: Basic Information <:=--=:>
|
||
|
<:=--=:> Part B: Programming the VAX/VMS <:=--=:>
|
||
|
<:=--=:> <:=--=:>
|
||
|
<:=--=:> By: Black Kat <:=--=:>
|
||
|
<:=--=:> <:=--=:>
|
||
|
<:=--=:><:=--=:><:=--=:><:=--=:>/|\<:=--=:><:=--=:><:=--=:><:=--=:>
|
||
|
|
||
|
|
||
|
Index
|
||
|
~~~~
|
||
|
Part A contains information on the following topics:
|
||
|
|
||
|
o Background o Logical Names
|
||
|
o Terminal Control Keys o System Default Logical Names
|
||
|
o Logging in o Logical Name Tables
|
||
|
o Digital Command Language (DCL) o User Environment
|
||
|
o Error Messages o Terminal Characteristics
|
||
|
o Command Line Editing o File Security
|
||
|
o Files and Directories o EDT Text Editor
|
||
|
o File Operations o EDT Help manual
|
||
|
|
||
|
Part B contains information on the following topics:
|
||
|
|
||
|
o Programming VAX/VMS o Parameters
|
||
|
o DCL Expressions o Terminal I/O
|
||
|
o Command Procedures o File I/O
|
||
|
o Writing Command Procedures o Redirecting Command Procedure I/O
|
||
|
o Comments o Branching and Conditionals
|
||
|
o Labels o Loops
|
||
|
o Debugging o Subroutines
|
||
|
o Invoking Command Procedures o Error Handling
|
||
|
o Symbols o Termination
|
||
|
o Lexical Functions o Example Command Procedures
|
||
|
|
||
|
|
||
|
<:=- Part A : Basic Information -=:>
|
||
|
|
||
|
Introduction
|
||
|
~~~~~~~~~~~
|
||
|
VAX is an acronym for Virtual Address eXtension, a 32-bit computer developed by
|
||
|
Digital in the 1970's. The VAX architecture supports multiprogramming, where
|
||
|
many users running different programs can use the VAX simultaneously and each
|
||
|
appears to have full control of the computer's resources. The multiprocessing
|
||
|
VAX functions vary differently from the old timesharing systems, which would
|
||
|
allocate a slice of CPU time to each user of the system in a rotating fashion,
|
||
|
whether the time slice was required or not. The VAX/VMS environment, however,
|
||
|
provides each user an allocation of processor time based on the user's needs
|
||
|
and priority. If a user does not need his quantum of time, or a portion of it,
|
||
|
it is given to the next user. This scheduling method is very efficient when
|
||
|
compared to the old method of timesharing.
|
||
|
|
||
|
The VAX is capable of addressing more than four billion addresses, through a
|
||
|
method known as virtual memory addressing. Because the memory is virtual
|
||
|
however, there is no need to have four billion bytes of physical memory. The
|
||
|
VAX executes programs by a technique known as paging, whereby a single "page"
|
||
|
of the program is read into memory at a time, and when a new page is needed,
|
||
|
the old one is "swapped" back out to disk to make room for the new one. The
|
||
|
VMS operating system ties everything together. The user interacts with VMS
|
||
|
(Virtual Memory System) through a Command Language Interpreter (CLI), usually
|
||
|
the Digital Command Language (DCL).
|
||
|
|
||
|
When you use VAX/VMS, you are known to the system as a process, which is
|
||
|
created when you log in to the system and deleted when you log out. This
|
||
|
process carries with it various attributes to identify you from other system
|
||
|
users (process name, identification, user identification code, privileges,
|
||
|
etc).
|
||
|
|
||
|
|
||
|
Terminal Control Keys
|
||
|
~~~~~~~~~~~~~~~~~~~
|
||
|
Ctrl-A Allows you to insert, rather than overstrike, characters on a
|
||
|
DCL command line that you're editing.
|
||
|
Ctrl-B Displays DCL commands that you've previously entered.
|
||
|
Ctrl-C Interrupts the coessed or the program being executed.
|
||
|
Ctrl-E Positions the cursor at the end of the line.
|
||
|
Ctrl-H Positions the cursor at the beginning of the line.
|
||
|
Ctrl-I Tab
|
||
|
Ctrl-O Alternately suppresses and continues the display of the output
|
||
|
terminal.
|
||
|
Ctrl-Q Enables (toggles on) output to the display after CTRL-S.
|
||
|
Ctrl-R Retypes the current input line and repositions the cursor atthe
|
||
|
end of the retyped line.
|
||
|
Ctrl-S Disables (toggles off) output to the display until CTRL-Q is
|
||
|
pressed.
|
||
|
Ctrl-T Displays process statistics.
|
||
|
Ctrl-U Discards the current input line and performs carriage return.
|
||
|
Ctrl-W Refreshes the screen.
|
||
|
Ctrl-X Flushes the type-ahead buffer.
|
||
|
Ctrl-Y Interrupts command or program execution and returns control to
|
||
|
the DCL command line interpreter.
|
||
|
Ctrl-Z Indicates end of file for data entered from terminal.
|
||
|
|
||
|
|
||
|
Logging in
|
||
|
~~~~~~~~
|
||
|
Most VAX systems prompt you with something like this:
|
||
|
|
||
|
Welcome to VAX1
|
||
|
Username:
|
||
|
|
||
|
Type your username and press <enter>. You'll then be prompted for your
|
||
|
password. If you enter the correct username/password combination, you'll
|
||
|
be given something like the following:
|
||
|
|
||
|
Welcome to VAX/VMS V4.4
|
||
|
Last interactive login on Monday, 16-JUL-87 16:12
|
||
|
Last non-interactive login on Friday, 13-JUL-87 00:14
|
||
|
$
|
||
|
|
||
|
If you entered an incorrect username and password, you'll receive the
|
||
|
message:
|
||
|
|
||
|
User authorization failure
|
||
|
|
||
|
Just hit <enter> and you'll be prompted for your username again. Once
|
||
|
you're logged in, you'll be given the DCL prompt ($). This indicates that
|
||
|
the system is ready to accept interactive commands.
|
||
|
|
||
|
To log out, use the command:
|
||
|
|
||
|
$ LOGOUT
|
||
|
|
||
|
|
||
|
The Digital Command Language (DCL)
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
DCL is comprised of more than 200 commands called verbs. Each DCL verb acts on
|
||
|
a parameter or assumed parameter, and the action of these verbs and the scope
|
||
|
of their parameters can be modified with qualifiers. The basic command
|
||
|
structure is:
|
||
|
|
||
|
$ LABEL: COMMAND-NAME PARAMETER(S) /QUALIFIER(S) !COMMENT
|
||
|
| | | | |
|
||
|
| | | | +-- Optional Comment
|
||
|
| | | |
|
||
|
| | | +-------------- Command modifier(s)
|
||
|
| | |
|
||
|
| | +---------------------------- Object of the
|
||
|
Command
|
||
|
| |
|
||
|
| +-------------------------------------- DCL command verb
|
||
|
|
|
||
|
+-------------------------------------------------- Optional Label
|
||
|
|
||
|
A label is an optional, user-specified string with a maximum length of
|
||
|
255 characters. It is most commonly used in command procedures.
|
||
|
|
||
|
A DCL command verb defines the action the VAX will take when the command
|
||
|
line is interpreted.
|
||
|
|
||
|
Parameter(s) specify the object or a list of objects the DCL command verb
|
||
|
will act upon. Multiple parameters may be specified but must be separated
|
||
|
from one another by a space, multiple spaces, or a tab. If you enter a DCL
|
||
|
command that requires parameters, but you don't enter them on the command
|
||
|
line, the DCL interpreter will prompt you for them automatically.
|
||
|
|
||
|
Qualifiers further define or modify the function the DCL command will
|
||
|
perform. They consist of a keyword followed by a value or a list of
|
||
|
values.
|
||
|
|
||
|
The qualifier keyword must be preceded by a slash (/). Multiple qualifiers
|
||
|
may be specified, but each must be preceded with a slash. Qualifiers
|
||
|
usually aren't required. There are three kinds of qualifiers: parameter,
|
||
|
positional, and command. A command qualifier applies to the whole command.
|
||
|
Generally, these are placed at the end of the command. For example:
|
||
|
|
||
|
$ DIRECTORY [BYNON],[BYNON.DECPRO]/FULL
|
||
|
|
||
|
This displays a full listing of two directories, using the /FULL qualifier of
|
||
|
the DIRECTORY command. A positional qualifier takes on a different meaning
|
||
|
based on where it is located in the command. If a positional qualifier is
|
||
|
placed after the command verb, but before the first parameter, the qualifier
|
||
|
will affect the entire command. If the same positional qualifier is placed
|
||
|
after a parameter, only that parameter will be affected. For example:
|
||
|
|
||
|
$ PRINT/COPIES=3 MEMO1.TXT,MEMO2.TXT
|
||
|
$ PRINT MEMO1.TXT/COPIES=2,MEMO2.TXT
|
||
|
|
||
|
The first command prints three copies of each file. The second command prints
|
||
|
two copies of the first file, but only one copy of the second. A parameter
|
||
|
qualifier affects only the parameter it follows. In the following example,
|
||
|
MEMO1.TXT is sent to the queue LASER and MEMO2.TXT is sent to queue FAST_PRINT:
|
||
|
|
||
|
$ PRINT MEMO1.TXT/QUEUE=LASER,MEMO2.TXT/QUEUE=FAST_PRINT
|
||
|
|
||
|
A comment is an optional, user-specified comment about the command. It is
|
||
|
commonly used in command procedures to document the command.
|
||
|
|
||
|
|
||
|
Error Messages
|
||
|
~~~~~~~~~~~~
|
||
|
Generally, error messages are of the format:
|
||
|
|
||
|
% FACILIT-L-IDENT, TEXT
|
||
|
| | | | |
|
||
|
| | | | +-- explanation of the error message
|
||
|
| | | |
|
||
|
| | | +--------- abbreviated message text, for reference
|
||
|
| | |
|
||
|
| | +------------- error severity
|
||
|
| |
|
||
|
| +------------------- Vax/VMS facility or component (error source)
|
||
|
|
|
||
|
+----------------------- message number: "%" = first, "-" = subsequent
|
||
|
|
||
|
A percent sign (%) indicates the first error message for a given command.
|
||
|
All subsequent errors for that command are preceded with a hyphen (-).
|
||
|
|
||
|
The facility indicates the source of the error. The source may be the DCL
|
||
|
command line interpreter, one of the various VMS utilities, or a program
|
||
|
image.
|
||
|
|
||
|
The severity level indicator (L) will have one of the following values:
|
||
|
S (successful completion), I (information), W (warning), E (error), or
|
||
|
F (fatal or severe error).
|
||
|
|
||
|
The ident is an abbreviation of the error message text. It can be referenced
|
||
|
in the VAX/VMS System Messages manual.
|
||
|
|
||
|
The text provides an explanation of the error message.
|
||
|
|
||
|
|
||
|
Command line editing
|
||
|
~~~~~~~~~~~~~~~~~~
|
||
|
DCL stores the last 20 command lines entered. You can display a list of them
|
||
|
with:
|
||
|
|
||
|
$ RECALL /ALL
|
||
|
|
||
|
The resulting display might look like:
|
||
|
|
||
|
1 DIR
|
||
|
2 COPY VAX1::$1$DUA5:[BYNON]LOGIN.COM LOGIN.COM;1
|
||
|
3 EDIT LOGIN.COM
|
||
|
$
|
||
|
|
||
|
To recall a specific command from the recall buffer, use the DCL RECALL
|
||
|
command with a command line number as a parameter. For example:
|
||
|
|
||
|
$ RECALL 2
|
||
|
$ COPY VAX1::$1$6DUA5:[BYNON]LOGIN.COM LOGIN.COM;1
|
||
|
|
||
|
|
||
|
Files and Directories
|
||
|
~~~~~~~~~~~~~~~~~~~~
|
||
|
Files are organized much like MS-DOS, with a directory-tree structure. The
|
||
|
user's default directory (assigned by the system administrator) is the "root"
|
||
|
directory. Up to seven subdirectories may be created, each containing as many
|
||
|
subdirectories as you like. The complete file specification looks like:
|
||
|
|
||
|
VAX1 :: DUA0 : [BYNON.PROGRAMMING.FORTRAN]WINDOWS.FOR;3
|
||
|
| | | | | |
|
||
|
| | | | | |
|
||
|
node device directory filename | version
|
||
|
type
|
||
|
|
||
|
The node name identifies a computer system in a network. If no node name is
|
||
|
specified, VMS assumes the file is located on the local node where you're
|
||
|
logged in.
|
||
|
|
||
|
The device name is the physical device where the file is stored. It is a
|
||
|
four-character alphanumeric code which identifies the device type, hardware
|
||
|
controller to which it is attached, and the unit number of the device on the
|
||
|
controller. If you omit the device name from a file specification, VMS assumes
|
||
|
you are referring to your default device.
|
||
|
|
||
|
The directory entry is enclosed in brackets, and is the name of the directory
|
||
|
that contains the file. If you omit the directory name from a file
|
||
|
specification, VMS will assume you are referring to your default directory.
|
||
|
|
||
|
The filename may consist of up to 39 alphanumeric characters.
|
||
|
|
||
|
The file type is a code consisting of up to 39 alphanumeric characters, and it
|
||
|
generally indicates the type of information supplied in the file. Some system
|
||
|
programs and utilities supply a three character default file type.
|
||
|
|
||
|
The version number is a 1 to 5 digit number the system assigns to every file by
|
||
|
default. When a file is created, it is assigned a version number of 1. Each
|
||
|
time the file is edited or another version of it is created, the version number
|
||
|
is automatically incremented by 1. Alternatively, you may specify a version
|
||
|
number of your choice.
|
||
|
|
||
|
No blank spaces are allowed within any portion of a file specification. In
|
||
|
VMS Version 4.x, the maximum lengths are as follows:
|
||
|
|
||
|
node name up to 6 characters
|
||
|
device name four characters
|
||
|
directory name up to 39 characters
|
||
|
subdirectory name up to 39 characters
|
||
|
file name up to 39 characters
|
||
|
file type up to 39 characters
|
||
|
version number up to 5 decimal digits with a value between 1
|
||
|
and 32,767
|
||
|
|
||
|
File specifications must be unique; no two files can have completely identical
|
||
|
specifications. It's conceivable to have many copies of NOTES.TXT in a
|
||
|
subdirectory, but only one NOTES.TXT;8 may exist in the same subdirectory.
|
||
|
|
||
|
Wildcards are similar to those in MS-DOS, with an asterisk (*) representing
|
||
|
a filename or filetype, and a percent sign (%) indicating a single
|
||
|
character.
|
||
|
|
||
|
|
||
|
File operations
|
||
|
~~~~~~~~~~~~~~
|
||
|
Creating and modifying files: $ CREATE TEMP.DAT
|
||
|
TEMP 1
|
||
|
TEMP 2
|
||
|
<CTRL-Z>
|
||
|
|
||
|
Renaming files: $ RENAME TEMP.DAT NEW.DAT
|
||
|
$ RENAME TEMP.DAT [BYNON.PROG]TEMP.DAT
|
||
|
Note: you cannot rename files across devices, just
|
||
|
directories.
|
||
|
|
||
|
Copying files: $ COPY TEMP.DAT NEW.DAT
|
||
|
$ COPY TEMP.DAT,TEST.DAT NEW.DAT
|
||
|
|
||
|
Appending files: $ APPEND TEMP.DAT NEW.DAT
|
||
|
|
||
|
Deleting files: $ DELETE TEMP.DAT;1
|
||
|
$ DELETE *.DAT;*
|
||
|
$ DELETE /CONFIRM .DAT;* (confirm each file)
|
||
|
|
||
|
Displaying files: $ TYPE /PAGE TEMP.DATE (one page at a time)
|
||
|
|
||
|
Directories: $ DIRECTORY
|
||
|
$ DIRECTORY DJA1:[BYNON.PROG]
|
||
|
|
||
|
Printing files: $ PRINT TEMP.DAT
|
||
|
|
||
|
Purging files: $ PURGE *.DAT (erase all but latest version of .DAT files)
|
||
|
|
||
|
Create a dir: $ CREATE/DIRECTORY [.BUDGET]
|
||
|
|
||
|
Set default dir: $ SET DEFAULT [BYNON.PROG]
|
||
|
$ SET DEFAULT [.PROG]
|
||
|
|
||
|
Delete a dir: $ SET DEFAULT [BYNON.PROG]
|
||
|
$ DELETE *.*;*
|
||
|
$ SET DEFAULT [BYNON]
|
||
|
$ SET PROTECTION=(0:D) PROG.DIR;1
|
||
|
$ DELETE BUDGET.DIR;1
|
||
|
|
||
|
|
||
|
Logical Names
|
||
|
~~~~~~~~~~~~
|
||
|
A logical name is a substitute for a file specification, portion of a file
|
||
|
specification, or another logical name. They provide two primary functions:
|
||
|
file and device independence and file specification shorthand.
|
||
|
|
||
|
File and device independence means that you are not constrained by a physical
|
||
|
element, such as a disk or printer name. If you use files nested deeply in
|
||
|
subdirectories, with long names, or on devices or nodes other than your
|
||
|
default, you can define a meaningful logical name to represent it. These
|
||
|
shorthand names are faster to type and easier to remember.
|
||
|
|
||
|
To define a logical name:
|
||
|
|
||
|
$ DEFINE PARTS_DBF DJA2:[DATABASES]PARTS.DAT
|
||
|
|
||
|
This example will associate the logical name PARTS_DBF with the file
|
||
|
specification DJA2 : [DATABASES]PARTS.DAT. Now, PARTS_DBF may be used
|
||
|
anywhere as a substitute for the complete file specification.
|
||
|
|
||
|
Other commands also can be used to assign logical names.
|
||
|
|
||
|
Assign : Associates equivalence names with a logical name
|
||
|
Mount : Mounts a disk or tape volume and assigns a system logical for the
|
||
|
volume.
|
||
|
Allocate: Allocates a system device for private use and optionally (command
|
||
|
qualifier) assigns a logical name to the device.
|
||
|
Open : Opens a file for read or write operations and assigns a logical
|
||
|
name to the file specification.
|
||
|
|
||
|
To display the logical name translations: $ SHOW LOGICAL PARTS_DBF will
|
||
|
display: "PARTS_DBF" = "DJA2:[DATABASES]PARTS.DAT" (LNM$PROCESS_TABLE).
|
||
|
|
||
|
To deassign a logical name: $ DEASSIGN PARTS_DBF
|
||
|
|
||
|
|
||
|
System default logical names
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
SYS$COMMAND The initial file, or input stream, from which the DCL command
|
||
|
line interpreter reads input data. The logical name
|
||
|
SYS$COMMAND is equated to your terminal for interactive
|
||
|
processes.
|
||
|
SYS$DISK Your default disk as assigned in the UAF.
|
||
|
SYS$ERROR The device on which the system displays all error and
|
||
|
informational messages. By default, SYS$ERROR is assigned
|
||
|
to your terminal for interactive processes, and to the batch
|
||
|
job log file for any batch processes.
|
||
|
SYS$INPUT The default file or input stream from which data and commands
|
||
|
are read by either the DCL command line interpreter or
|
||
|
programs executing in your account. By default, SYS$INPUT is
|
||
|
equated to your terminal for interactive processes and to the
|
||
|
batch job stream (or command procedure) for batch processes.
|
||
|
|
||
|
|
||
|
Logical Name Tables
|
||
|
~~~~~~~~~~~~~~~~~
|
||
|
Logical names are stored in system files called logical name tables.
|
||
|
The following are the four most commonly used:
|
||
|
|
||
|
Group table : Contains the logical names available to all users in your
|
||
|
UIC (User Identification Code) group.
|
||
|
Job table : Contains the logical names available to your process and
|
||
|
any subprocess it creates.
|
||
|
Process table: Contains the logical names available to your process only.
|
||
|
System table : Contains the logical names that may be used by all users
|
||
|
of the system.
|
||
|
|
||
|
|
||
|
User Environment
|
||
|
~~~~~~~~~~~~~~
|
||
|
The User Authorization File (UAF) is a system file controlled and modified
|
||
|
by the system manager. A record for each system user is contained in the
|
||
|
UAF.
|
||
|
|
||
|
A User Identification Code (UIC) is an identifier used by VAX/VMS to identify
|
||
|
users and groups of users. It is used to identify processes, directories,
|
||
|
files, and other objects in the system. A UIC may be specified numerically or
|
||
|
alphanumerically, and is made up of two parts, a group and a member, specified
|
||
|
in the format: [group,member]. For example, UIC [10,14] identifies group 10,
|
||
|
user 14. The group number is an octal number in the range 1-37776, and the
|
||
|
member is an octal number in the range 0-177776. An alphanumeric UIC contains
|
||
|
a member name and optionally, a group name in the format: [member] or
|
||
|
[group,member]. The group and member names in an alphanumeric UIC may contain
|
||
|
1 to 31 alphanumeric characters (A-Z, 0-9, underscore, dollar sign).
|
||
|
|
||
|
Each user of the system is limited in the consumption of system
|
||
|
resources, and these limits control the rate at which your process or
|
||
|
any subprocesses you create may consume a resource. There are 32 levels
|
||
|
of priority in the VAX/VMS system, 0 through 31, the highest being 31.
|
||
|
The priorities are divided into two ranges: timesharing (0-15) and
|
||
|
real-time (16-31). The default user priority is 4. Depending on how
|
||
|
heavily the system is being used, your priority may be raised above the
|
||
|
default, but never lowered below it. VAX/VMS maintains 35 privileges,
|
||
|
divided into the following seven categories classified by how much
|
||
|
damage could be done to the system by possessing them:
|
||
|
|
||
|
None No privileges.
|
||
|
Normal The minimum privilege needed to use the system effectively.
|
||
|
Group The ability to effect members of the same UIC group.
|
||
|
Devour The potential to consume noncritical system-wide resources.
|
||
|
System The ability to interfere with normal system operation.
|
||
|
File The potential to bypass file protection security.
|
||
|
All The ability to take over the entire system.
|
||
|
|
||
|
VAX/VMS systems keep a record of overall computer system use by account
|
||
|
holder in a system file called ACCOUNTING.DAT. The system manager uses
|
||
|
this file to produce reports with the Accounting Utility. This can be
|
||
|
used to learn more about how the system is being used, how it performs,
|
||
|
and how a particular user is using the system. It can also be used to
|
||
|
bill users for system time.
|
||
|
|
||
|
|
||
|
Terminal Characteristics
|
||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||
|
Setting display width: $ SET TERMINAL/WIDTH=132
|
||
|
|
||
|
Shutting messages off: $ SET TERMINAL/NOBROADCAST
|
||
|
This prevents other users from phoning you, sending mail messages, and
|
||
|
some system messages from appearing on your screen. If you just want
|
||
|
mail and phone messages screened, use: $ SET BROADCAST=(NOMAIL,NOPHONE).
|
||
|
|
||
|
Increasing type-ahead buffer: $ SET TERMINAL/ALTYPEHD/PERMANENT
|
||
|
|
||
|
Line editing modes: $ SET TERMINAL/INSERT or $ SET TERMINAL/OVERSTRIKE
|
||
|
|
||
|
Defining keys: $ DEFINE/KEY PF1 "SET DEFAULT DUA3:[INV.SUP]"
|
||
|
% DCL-I-DEFKEY, DEFAULT key PF1 has been defined
|
||
|
|
||
|
Showing keys: $ SHOW KEY PF1 (or $ SHOW KEY ALL)
|
||
|
DEFAULT keypad definitions:
|
||
|
PF1 = "SET DEFAULT DUA3:[INV.SUP]"
|
||
|
|
||
|
Deleting keys: $ DELETE/KEY PF1 (or $ DELETE/KEY ALL)
|
||
|
% DCL-I-DELKEY, DEFAULT key PF1 has been deleted
|
||
|
|
||
|
|
||
|
Changing prompt: $ SET PROMPT = "What now?"
|
||
|
|
||
|
Displaying process information: $ SHOW PROCESS (add a qualifier)
|
||
|
|
||
|
Changing process information: $ SET PROCESS/NAME="Bob"
|
||
|
$ SET PROCESS/PRIVILEGES=OPER
|
||
|
|
||
|
|
||
|
File Security
|
||
|
~~~~~~~~~~~~
|
||
|
UIC-based protection permits access to be granted or denied based on
|
||
|
protection codes that reflect four user categories:
|
||
|
|
||
|
System: system manager
|
||
|
Owner : account owner
|
||
|
Group : users in same UIC group
|
||
|
World : all users of system, regardless of UIC
|
||
|
|
||
|
Four type of file access can be granted or denied to members of these user
|
||
|
categories:
|
||
|
|
||
|
Read (R): read the file
|
||
|
Write (W): create or modify the file
|
||
|
Execute (E): run a program
|
||
|
Delete (D): delete the file
|
||
|
|
||
|
Generally, any category of user can be granted or denied file access
|
||
|
with this protection scheme. However, you can read a file in a
|
||
|
subdirectory with EXECUTE access if you know its filename and filetype.
|
||
|
Also, since SYSTEM privileges include the ability to bypass all file
|
||
|
protection, anyone within the SYSTEM category can read a file.
|
||
|
|
||
|
CONTROL access, or the ability to change the protection and ownership of
|
||
|
a volume, is never specified in the UIC-based protection code. This is
|
||
|
the fifth type of protection that can be specified in an access control
|
||
|
list (ACL). It's automatically granted to two user categories when VMS
|
||
|
examines UIC-based protection. Users in the SYSTEM and OWNER categories
|
||
|
receive CONTROL access by default while GROUP and WORLD categories are
|
||
|
denied CONTROL access.
|
||
|
|
||
|
File protection defaults are as follows:
|
||
|
|
||
|
System: RWED
|
||
|
Owner : RWED
|
||
|
Group : RE
|
||
|
World : No access
|
||
|
|
||
|
To determine the existing or default protection of a file, use the SHOW
|
||
|
PROTECTION command. The default in the previous example would be:
|
||
|
$ SHOW PROTECTION
|
||
|
SYSTEM=RWED, OWNER=RWED, GROUP=RE, WORLD=NO ACCESS
|
||
|
|
||
|
If you want to see file protection in directories, use the /PROTECTION
|
||
|
qualifier with the DIRECTORY command.
|
||
|
|
||
|
To change the protection of a file, use the command:
|
||
|
|
||
|
$ SET PROTECTION=(O:RWE,G,W) LOGIN.COM
|
||
|
|
||
|
In this example, the account owner has READ, WRITE, and EXECUTE access
|
||
|
to his LOGIN.COM file. The GROUP and WORLD categories have no access
|
||
|
and SYSTEM access remains unchanged.
|
||
|
|
||
|
Rules for specifying protection codes:
|
||
|
1. Access types must be abbreviated with one letter: R, W, E, or D.
|
||
|
2. User categories may be spelled out or abbreviated.
|
||
|
3. Each user category must be separated from its access types with a colon.
|
||
|
4. If you specify multiple user categories, separate each with a comma
|
||
|
and enclose the entire code in parenthesis.
|
||
|
5. User categories and access types may be specified in any order.
|
||
|
6. If you include a user category, but do not specify an access type
|
||
|
for that category, access is automatically denied.
|
||
|
7. If you omit a user category entirely, protection for that category
|
||
|
is unchanged.
|
||
|
|
||
|
Remember that VAX/VMS evaluates directory protection before file
|
||
|
protection. If you grant WORLD:R access to a file, but the file is in a
|
||
|
directory without WORLD:R access, another user couldn't read the file.
|
||
|
|
||
|
|
||
|
EDT Text Editor
|
||
|
~~~~~~~~~~~~~~
|
||
|
When you enter EDT, you automatically enter line mode, indicated by the
|
||
|
EDT prompt, an asterisk (*). All line mode commands are made at the
|
||
|
asterisk prompt and terminated by pressing <Return>. Lines that you
|
||
|
input are numbered sequentially by the editor. You can reference a line
|
||
|
or group of li^S^Qnes based on the line number or range of line numbers. A
|
||
|
list of basic EDT commands follows. Each command may be abbreviated to
|
||
|
the characters in parenthesis. Complete information on all EDT line
|
||
|
mode commands can be found through the use of the line mode EDT HELP
|
||
|
command.
|
||
|
|
||
|
Commands Function
|
||
|
~~~~~~~
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
Change (C) Change from line to keypad mode. To switch back from
|
||
|
keypad mode to line mode, press <Ctrl-Z>.
|
||
|
Copy (CO) Copy a line or group of lines from one place to another.
|
||
|
If you enter the command CO 5 to 10, line 5 will be
|
||
|
copied to the line immediately preceding line 10. The
|
||
|
command CO 5:10 to 20 would copy the contents of lines 5
|
||
|
through 10 into the area immediately preceding line 20.
|
||
|
Delete (D) Delete a line or group of lines. The command D13 would
|
||
|
delete line 13, while D13:20 will delete lines 13 to 20.
|
||
|
Exit (EX) Terminates the EDT session, saving all changes. This
|
||
|
also creates a new version of the file being edited.
|
||
|
Help (H) Display on-line help on all EDT line mode commands. The
|
||
|
help messages will not be included in the file being edited.
|
||
|
Include (INC) Copy text from an external file into the file being edited.
|
||
|
When the EDT command INCLUDE FILENAME.TYPE is executed,
|
||
|
the contents of FILENAME.TYPE are copied into the file
|
||
|
being edited.
|
||
|
Insert (I) Inserts specified text directly before the current
|
||
|
position in the file. While inserting text, you will
|
||
|
not receive the EDT "*" prompt. Press <Ctrl-Z> to
|
||
|
return to the "*" prompt when you're finished inserting.
|
||
|
Move (M) You can't cut and paste with a line-oriented editor.
|
||
|
Text will be moved to the area immediately preceding a
|
||
|
specified line. The command M 10:15 to 50 would move
|
||
|
lines 10 through 15 to the area immediately preceding
|
||
|
line 50.
|
||
|
Quit (QUI) Exit the EDT editor without saving changes.
|
||
|
Replace (R) Deletes a specified line or group of lines and enters the
|
||
|
INSERT mode so you can add text in that place. The
|
||
|
command R5:10 would delete lines 5 through 10 and switch
|
||
|
to the INSERT mode to permit you to enter new text. To
|
||
|
exit the INSERT mode, press <Ctrl-Z>.
|
||
|
Resequence (RES) Numbers all of the lines in the file that you're
|
||
|
editing in increments of 1. This is useful because
|
||
|
text insertion, movement, or deletion causes the file
|
||
|
to lose numeric sequence.
|
||
|
Substitute (S) Substitute a new text element for an old one in the
|
||
|
format s/oldtext/newtext/range. The old and new text
|
||
|
elements must be enclosed in angle bracket (< >)
|
||
|
delimiters and the range must be specified.
|
||
|
Write (WR) Write a given range of text to a new file.
|
||
|
WRHISTORY.TXT 50:100 would write lines 50 through 100 to
|
||
|
a new file called HISTORY.TXT.
|
||
|
|
||
|
|
||
|
EDT Help Manual
|
||
|
~~~~~~~~~~~~~
|
||
|
To dump the entire EDT Help file to disk, enter the following DCL command
|
||
|
during a terminal session: $ ASSIGN EDTHELP.FIL SYS$OUTPUT. Now, enter
|
||
|
line mode EDT and type: * HELP *. Now exit EDT and enter the DCL
|
||
|
command: $ ASSIGN TTnn: SYS$OUTPUTT (TTnn: is your terminal number).
|
||
|
|
||
|
|
||
|
<:=- Part B : Programming VAX/VMS -=:>
|
||
|
|
||
|
Introduction
|
||
|
~~~~~~~~~~~
|
||
|
A symbol is a name chosen to represent a string of characters, a numeric value,
|
||
|
or a logical (true/false) value. A symbol may be used wherever the value it
|
||
|
represents would normally be found, and can be up to 255 characters long.
|
||
|
Symbols must begin with a character, dollar sign, or underscore, and are not
|
||
|
case-sensitive. Symbols are created like this:
|
||
|
|
||
|
symbol_name = value (local symbol)
|
||
|
symbol_name == value (global symbol)
|
||
|
|
||
|
A global symbol may be used at any command level, but local symbols are lost
|
||
|
when command procedures are finished. For example:
|
||
|
|
||
|
$ WIDE = "SET TERMINAL/WIDTH=132"
|
||
|
|
||
|
Now, anytime you type WIDE at the DCL command line, the terminal width will
|
||
|
be changed to 132 characters. To show the contents of a symbol:
|
||
|
|
||
|
$ SHOW SYMBOL ANSWER
|
||
|
ANSWER = 1584 HEX = 00000630 OCTAL = 000000003060
|
||
|
|
||
|
The SHOW SYMBOL command uses the local symbol table by default. To show
|
||
|
the value of a global symbol, use the /GLOBAL qualifier. To show all
|
||
|
symbols, use the /ALL qualifier (or /GLOBAL/ALL). To delete symbols,
|
||
|
use: $ DELETE/SYMBOL symbol_name command (with /GLOBAL if it's global).
|
||
|
|
||
|
When a DCL command is executed, symbols in the following positions are
|
||
|
automatically translated:
|
||
|
|
||
|
o the beginning of the command
|
||
|
o in a lexical function
|
||
|
o in a WRITE or IF statement
|
||
|
o on the right side of an = or == assignment statement
|
||
|
o inside brackets on the left side of an assignment statement when
|
||
|
you're preforming string substitution
|
||
|
|
||
|
If none of these cases fits, apostrophes will force the translation:
|
||
|
$ DIRECTORY 'PARTS' (after $ PARTS = "DJA2:[DBA]PARTS.DAT")
|
||
|
|
||
|
Symbols are commonly used for shorthand. For example, to clear the screen:
|
||
|
|
||
|
$ ESC[0,8] == 27
|
||
|
$ CLEAR == "[J"
|
||
|
$ HOME == "[H"
|
||
|
$ CLR == WRITE SYS$OUTPUT ESC,HOME,ESC,CLEAR
|
||
|
|
||
|
Now, anytime you enter CLR, the screen will be cleared. Symbols can also be
|
||
|
used to execute command procedures:
|
||
|
|
||
|
$ NETBACK == "@SYS$LOGIN:NETBACKUP"
|
||
|
|
||
|
Finally, foreign commands unknown to DCL can be executed by using symbols:
|
||
|
|
||
|
$ KERMIT == RUN SYS$$SYSTEM:KERMIT
|
||
|
|
||
|
|
||
|
DCL Expressions
|
||
|
~~~~~~~~~~~~~~
|
||
|
Expressions are built by combining data elements with operators. A logical
|
||
|
comparison evaluates the relationship between two components as true or
|
||
|
false (True = 1, False = 0).
|
||
|
|
||
|
Lexical functions are VAX/VMS routines that return process or system
|
||
|
information, or manipulate user-supplied data. Lexical functions are unique
|
||
|
because the result is returned in the function name, allowing it to be used as
|
||
|
a symbol (much like Pascal). Lexical functions are called with the following
|
||
|
format:
|
||
|
|
||
|
F$function_name(parameter, parameter...)
|
||
|
|
||
|
For example, the following lexical function manipulates user-supplied data:
|
||
|
|
||
|
$ STRING = "Go home right now!"
|
||
|
$ STRING = F$EDIT(STRING, "COMPRESS, UPCASE")
|
||
|
$ SHOW SYMBOL STRING
|
||
|
STRING = "GO HOME RIGHT NOW!"
|
||
|
|
||
|
|
||
|
Command Procedures
|
||
|
~~~~~~~~~~~~~~~~~
|
||
|
A command procedure is a file consisting of a sequence of DCL commands which
|
||
|
can be executed interactively or as a batch job (like a .BAT file in MS-DOS or
|
||
|
a REXX EXEC in VM/SP). Command procedures are used in VAX/VMS to perform
|
||
|
repetitive or complex tasks and to save time. With a command procedure, you
|
||
|
can execute many DCL commands with a single statement.
|
||
|
|
||
|
Command procedures aren't bound by simple lists of DCL commands executed in
|
||
|
sequence. They can take advantage of labels, lexical functions, symbols and
|
||
|
relational operators to build sophisticated procedures which act like VAX/VMS
|
||
|
programs. Command procedures are flexible. They can be written to take
|
||
|
specific actions based on responses to questions, or even to perform a given
|
||
|
function depending on the time or date.
|
||
|
|
||
|
|
||
|
Writing Command Procedures
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
A text editor such as EDT or EVE is used to create and edit command procedures,
|
||
|
which should be named "PROCEDURE_NAME.COM". The file type ".COM" is the
|
||
|
default procedure file type, and if a different file type is included, it must
|
||
|
be included when the procedure is invoked.
|
||
|
|
||
|
Each new command line must begin with a dollar sign ($). Multiple spaces or
|
||
|
tabs may be included after the "$" for readability, and command lines may be
|
||
|
extended past a single line by ending the previous line with a hyphen (-) and
|
||
|
not starting the next line with a dollar sign.
|
||
|
|
||
|
Data input to programs, such as responses, must be entered without the dollar
|
||
|
sign. Data lines are used by the program running and are not processed by the
|
||
|
DCL command line interpreter. For example:
|
||
|
|
||
|
$ MAIL <--- invokes the Mail Utility
|
||
|
SEND <--- Mail SEND command
|
||
|
JONES, BOB <--- response to Mail prompt "To:"
|
||
|
Memo <--- response to Mail prompt "Subj:"
|
||
|
Bob, <--- Mail message
|
||
|
|
||
|
How's it going?'?
|
||
|
|
||
|
Joe
|
||
|
$ <--- terminates Mail program
|
||
|
$ EXIT <--- terminates command procedure
|
||
|
|
||
|
|
||
|
Comments
|
||
|
~~~~~
|
||
|
Comments may be included by preceding them with an exclamation point (!),
|
||
|
which causes everything to the right of it to be ignored by the DCL command
|
||
|
interpreter. Comments make command procedures easier to debug and modify
|
||
|
later. Spelling DCL commands out rather than using the abbreviations also
|
||
|
makes the command procedure more readable.
|
||
|
|
||
|
|
||
|
Labels
|
||
|
~~~
|
||
|
Labels are used by the DCL command line interpreter for conditional
|
||
|
processing and repetitive looping. Labels should be placed on separate
|
||
|
lines, making them easier to find. Labels can be 255 characters long, may
|
||
|
not contain blanks, and must be terminated with a colon (:).
|
||
|
|
||
|
|
||
|
Debugging
|
||
|
~~~~~~
|
||
|
The SET VERIFY command tells DCL to display each command as it processes it.
|
||
|
This allows you to see where errors are generated, and how strings are
|
||
|
translated. SET NOVERIFY turns the verify mode off.
|
||
|
|
||
|
The SHOW SYMBOL command displays the contents of defined symbols, and is
|
||
|
used to show the contents of a symbol in a command procedure as it is being
|
||
|
executed.
|
||
|
|
||
|
|
||
|
Invoking Command Procedures
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
Command procedures may be invoked interactively by typing the "at" sign (@)
|
||
|
followed by the procedure name. The file type must also be included if it is
|
||
|
not ".COM" (the default). Command procedures may be invoked at the command
|
||
|
line or from within another command procedure, called nesting. The DCL SUBMIT
|
||
|
command will place your command (job) in a batch queue with other jobs waiting
|
||
|
to be run. Command procedures are generally submitted as batch jobs when you
|
||
|
want them to execute at a specific time, they will take a long time to run, or
|
||
|
when a job must run at a reduced priority. The following command submits the
|
||
|
command procedure ACCOUNT.COM to the VAX/VMS batch processor:
|
||
|
|
||
|
$ SUBMIT ACCOUNT
|
||
|
Job ACCOUNT (queue SYS$BATCH, entry 103) started on SYS$BATCH
|
||
|
|
||
|
The SYS$BATCH queue is the default and is used unless otherwise specified with
|
||
|
the /QUEUE qualifier. When VAX/VMS runs this job, a process with your rights
|
||
|
and privileges will be created and the procedure executed within that process.
|
||
|
|
||
|
|
||
|
Symbols
|
||
|
~~~~~~
|
||
|
Symbols may be local (single equal sign) or global (double equal sign).
|
||
|
Local symbols are recognized by DCL only at the command level at which it
|
||
|
was defined and more deeply nested levels (subsequently called command
|
||
|
procedures). Global symbols are recognized at any command level. Local
|
||
|
symbols should be used when the symbols is only needed for the duration of
|
||
|
the command procedure employing it. You should only define global symbols
|
||
|
if you're going to use them in other command procedures or for the duration
|
||
|
of your login session.
|
||
|
|
||
|
An asterisk can be used to tell the command line interpreter (CLI) to accept
|
||
|
abbreviations. For example:
|
||
|
|
||
|
$ NO*TES == "@SYS$LOGIN:NOTES"
|
||
|
|
||
|
This tells the CLI to accept NO, NOT, NOTE, or NOTES as a valid abbreviation
|
||
|
for the NOTES command. This notation is usevul for long symbol names.
|
||
|
|
||
|
|
||
|
Lexical Functions
|
||
|
~~~~~~~~~~~~~~~~
|
||
|
Lexical functions allow you to obtain basically the same information as DCL
|
||
|
SHOW commands. However, it's easier to manipulate information which comes
|
||
|
from a lexical function. As an example, the following two command give the
|
||
|
same information:
|
||
|
|
||
|
$ SHOW TIME ! DCL SHOW TIME command
|
||
|
12-JUN-1989 14:29:23
|
||
|
$ WRITE SYS$OUTPUT F$TIME() ! lexical function
|
||
|
12-JUN-1989 14:29:25.17
|
||
|
|
||
|
The second command is more usable, however:
|
||
|
|
||
|
$! Show_Date.COM
|
||
|
$!
|
||
|
$ TIME&DATE = F$TIME()
|
||
|
$ DATE = F$EXTRACT(0,11,TIME&DATE)
|
||
|
$ WRITE SYS$OUTPUT DATE
|
||
|
|
||
|
This procedure displays only the date portion of the string returned by the
|
||
|
lexical function F$TIME(). (Use @SHOW_DATE to invoke it) VAX/VMS supports
|
||
|
lexical functions to manipulate text strings, convert data types, and return
|
||
|
information about the system, your process, symbols, files and devices.
|
||
|
|
||
|
|
||
|
Parameters
|
||
|
~~~~~~~~~
|
||
|
Eight reserved symbols (P1 through P8) are available to command procedures to
|
||
|
supply data to process. By using these parameters in a command procedure,
|
||
|
different data can be specified each time it's run. Parameter specification is
|
||
|
done on the command line where the procedure is called. Unless designed to,
|
||
|
the command procedure will not prompt for parameters. Parameters are separated
|
||
|
with spaces and may be character strings, integers, or symbols. If you want to
|
||
|
skip a parameter, us a null string (" ").
|
||
|
|
||
|
$! Add.Com
|
||
|
$! command procedure to demonstrate passing parameters
|
||
|
$! (add the first and third parameter)
|
||
|
$!
|
||
|
$ WRITE SYS$OUTPUT P1+P3
|
||
|
|
||
|
$ @ADD 12 " " 14
|
||
|
26
|
||
|
|
||
|
If a command procedure requires multiple letters or words as a single
|
||
|
parameter, enclose it in quotes and it will be treated as one parameter and
|
||
|
not converted to uppercase.
|
||
|
|
||
|
|
||
|
Terminal Output
|
||
|
~~~~~~~~~~~~
|
||
|
The WRITE and TYPE commands send data to the terminal. TYPE is used to
|
||
|
display the contents of a file, but may also be used to print lines of text
|
||
|
from within a command procedure. TYPE may only be used to output text
|
||
|
strings. Since the WRITE command is processed be DCL, expressions, symbols
|
||
|
and lexical functions are evaluated before the data is sent to the
|
||
|
terminal.
|
||
|
|
||
|
The output expression must translate to a string and be sent to the logical
|
||
|
device SYS$OUTPUT, but may be a string, lexical function, symbol, or any
|
||
|
combination of the three. Here's an example of a command procedure that
|
||
|
uses terminal output:
|
||
|
|
||
|
$! Writing a simple text string
|
||
|
$!
|
||
|
$ WRITE SYS$OUTPUT "This is a test..."
|
||
|
$!
|
||
|
$! Displaying multiple lines at the terminal
|
||
|
$!
|
||
|
$ TYPE SYS$OUTPUT Warning!
|
||
|
It's been 30 days since you changed
|
||
|
your password. Change it now!
|
||
|
$!
|
||
|
$! Writing a string with a lexical function
|
||
|
$!
|
||
|
$ WRITE SYS$OUTPUT " "HI' You are in directory "F$DIRECTORY()' "
|
||
|
|
||
|
|
||
|
Terminal Input
|
||
|
~~~~~~~~~~~
|
||
|
The INQUIRE command's default device is the terminal keyboard, while the
|
||
|
READ command must be told where to accept data from. The INQUIRE command
|
||
|
prompts for input, reads data and assigns it to a symbol. All data is
|
||
|
accepted as a character string and is converted to uppercase and compressed
|
||
|
(extra blanks removed). The READ command prompts for input if the /PROMPT
|
||
|
qualifier is used, accepts data from a specified source and assigns it to a
|
||
|
symbol. The data is accepted with no string conversion or compression
|
||
|
occurring. Here's an example of a command procedure that uses terminal
|
||
|
input:
|
||
|
|
||
|
$! Puts whatever you type in the symbol NAME
|
||
|
$! the /NOPUNCTUATION qualifier will suppress the colon
|
||
|
$! and space INQUIRE puts at the end of the prompt
|
||
|
$!
|
||
|
$ INQUIRE /NOPUNCTUATION NAME "What is your name? "
|
||
|
$!
|
||
|
$! Example of READ using SYS$INPUT (terminal) for data
|
||
|
$!
|
||
|
$ READ /PROMPT = "First value: " SYS$INPUT VALUE_1
|
||
|
$ READ /PROMPT = "Second value: " SYS$INPUT VALUE_2
|
||
|
$ WRITE SYS$OUTPUT VALUE_1," + ",VALUE_2," = ",VALUE_1+VALUE_2
|
||
|
|
||
|
|
||
|
File I/O
|
||
|
~~~~~~~
|
||
|
The basic steps to read and write files from within command procedures are
|
||
|
similar to most other languages. Use the OPEN command to open the file. If it
|
||
|
does not exist, OPEN will create it. Use the READ or WRITE commands to read or
|
||
|
write text records from the file. Use the CLOSE command to close the
|
||
|
file when you're done.
|
||
|
|
||
|
To open a file for writing, you must use the /APPEND or /WRITE qualifier. The
|
||
|
/WRITE qualifier creates a new file and places the record pointer at the
|
||
|
beginning of the file. If the file already exists, a new version will be
|
||
|
created by OPEN/WRITE. The /APPEND qualifier is used to add records to the end
|
||
|
of an existing file. The file must already exist before using the OPEN/APPEND
|
||
|
command, and when the file is opened, the record pointer is placed at the end
|
||
|
of the file.
|
||
|
|
||
|
To open a file for reading, use the /READ qualifier (the default for the
|
||
|
OPEN command). A file opened for reading may not be written to, and the
|
||
|
record pointer will initially be placed at the first record in the file.
|
||
|
Each time a record is read, the pointer is moved down to the next record.
|
||
|
The WRITE/UPDATE must be used to write over an existing record. Here's an
|
||
|
example of a command procedure using file input and output:
|
||
|
|
||
|
$ OPEN/APPEND OUTPUT_FILE NEW.DAT
|
||
|
$ OPEN/READ INPUT_FILE OLD.DAT
|
||
|
$ READ INPUT_FILE RECORD
|
||
|
$ WRITE SYS$OUTPUT "First record from OLD.DAT - ",RECORD
|
||
|
$ WRITE OUTPUT_FILE "First record from OLD.DAT - ",RECORD
|
||
|
|
||
|
To open a file for both reading and writing, use both the /READ and /WRITE
|
||
|
qualifiers. The record pointer will be placed at the first record in the file.
|
||
|
Using this method, however, you can only overwrite the record you most recently
|
||
|
read, and records you replace must be the same length.
|
||
|
|
||
|
|
||
|
Redirecting Command Procedure I/O
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
Command procedures often invoke VAX/VMS utilities, and these programs will
|
||
|
normally get input from the logical device SYS$INPUT. While executing a
|
||
|
command procedure, SYS$INPUT is directed to the command procedure itself, and
|
||
|
this is why you can put command and data lines for a utility or program
|
||
|
directly in the procedure. SYS$COMMAND defaults to the terminal from where a
|
||
|
command procedure is being executed, and by redirecting SYS$INPUT to
|
||
|
SYS$COMMAND you can use utilities and other programs interactively from command
|
||
|
procedures:
|
||
|
|
||
|
$ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND:
|
||
|
$ EDIT JUNK.DAT
|
||
|
|
||
|
The /USER_MODE qualifier causes the re-assignment to be in effect only for
|
||
|
the next command.
|
||
|
|
||
|
Normally command procedure output is displayed at your terminal. You may
|
||
|
redirect output to a file by using the /OUTPUT qualifier:
|
||
|
|
||
|
$ @SHOW_TIME/OUTPUT = TIME.DAT
|
||
|
|
||
|
By default, DCL error and severe error messages are directed to the file
|
||
|
represented by the logical name SYS$ERROR, which usually points to your
|
||
|
terminal. If you want to log error messages, simply redirect SYS$ERROR to
|
||
|
a file. If you redirect SYS$ERROR without also redirecting SYS$OUTPUT, DCL
|
||
|
will send error messages to both, and you'll receive the error messages
|
||
|
twice -- at your terminal and in the file.
|
||
|
|
||
|
To completely suppress error messages you can redirect both SYS$ERROR
|
||
|
and SYS$OUTPUT to the null device (NL:) or you can use the SET MESSAGE
|
||
|
command to turn off all message output. To suppress all messages, use:
|
||
|
SET MESSAGE/NOTEXT/NOIDENTIFICATION/NOFACILITY/NOSEVERITY.
|
||
|
|
||
|
|
||
|
Branching and Conditionals
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
You can use the DCL IF/THEN statements and conditional operators withing
|
||
|
command procedures to cause the execution of a command based on the
|
||
|
evaluation of a condition. The basic use is: $ IF condition THEN command.
|
||
|
The condition is a Boolean expression (True or False) and the command is
|
||
|
any legal DCL command. The following is a list of conditional operators:
|
||
|
|
||
|
Operator Function
|
||
|
~~~~~~~
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
.EQ. / .EQS. Determines if two numbers/character strings are equal
|
||
|
.GE. / .GES. Tests to see whether the first number/character string is
|
||
|
greater than or equal to the second
|
||
|
.GT. / .GTS. Determines if the first number/character string is greater
|
||
|
than the second
|
||
|
.LE. / .LES. Tests to see if the first number/character string is less
|
||
|
than or equal to the second
|
||
|
.LT. / .LTS. Determines if the first number/character string is less than
|
||
|
the second
|
||
|
.NE. / .NES. Tests to see whether the two numbers/character strings are
|
||
|
not equal
|
||
|
.AND. Combines two numbers with a logical AND (boolean algebra)
|
||
|
.OR. Combines two numbers with a logical OR (boolean algebra)
|
||
|
.NOT. Logically negates a value
|
||
|
|
||
|
The following is a command procedure using conditional branching:
|
||
|
|
||
|
$! Time.Com
|
||
|
$!
|
||
|
$ TIME = F$TIME()
|
||
|
$ HOUR = F$EXTRACT(12,2,TIME)
|
||
|
$ IF HOUR .LT. 12 THEN GOTO MORNING
|
||
|
$ IF HOUR .LT. 17 THEN GOTO AFTERNOON
|
||
|
$ IF HOUR .LT. 18 THEN GOTO EVENING
|
||
|
$ GOTO END
|
||
|
$ MORNING:
|
||
|
$ WRITE SYS$OUTPUT "Good morning!"
|
||
|
$ AFTERNOON:
|
||
|
$ WRITE SYS$OUTPUT "Good afternoon!"
|
||
|
$ EVENING:
|
||
|
$ WRITE SYS$OUTPUT "Good evening!"
|
||
|
$ END:
|
||
|
$ EXIT
|
||
|
|
||
|
|
||
|
Loops
|
||
|
~~
|
||
|
Loops are used to repeat a statement or group of statements until a
|
||
|
given condition is met. DCL supports both DO WHILE and DO UNTIL loops.
|
||
|
The DO WHILE loop tests the condition before evaluation:
|
||
|
|
||
|
$ LOOP:
|
||
|
$ IF .NOT. condition THEN GOTO END
|
||
|
.
|
||
|
.
|
||
|
.
|
||
|
$ GOTO LOOP
|
||
|
$ END:
|
||
|
$ EXIT
|
||
|
|
||
|
The DO UNTIL loop executes the statement(s) and then tests the condition:
|
||
|
|
||
|
$ LOOP:
|
||
|
.
|
||
|
.
|
||
|
.
|
||
|
$ IF condition THEN GOTO LOOP
|
||
|
$ EXIT
|
||
|
|
||
|
|
||
|
Subroutines
|
||
|
~~~~~~~~
|
||
|
The DCL command GOSUB transfers execution control to a label and the RETURN
|
||
|
command terminates subroutine execution, returning control to the statement
|
||
|
after the GOSUB command. Subroutines are useful where you need to do the same
|
||
|
series of commands repeatedly in different parts of a command procedure. They
|
||
|
also make procedures easier to read and more compact. The DCL commands GOSUB
|
||
|
and RETURN are not supported in VAX/VMS versions before VAX/VMS Version 4.4.
|
||
|
The following is an example procedure using a subroutine:
|
||
|
|
||
|
$! Personal.Com
|
||
|
$!
|
||
|
$! opens the personal info file
|
||
|
$!
|
||
|
$ OPEN/WRITE OUTPUT_FILE PERINFO.DAT
|
||
|
$!
|
||
|
$! collect info
|
||
|
$!
|
||
|
$ INQUIRE RECORD "Enter full name"
|
||
|
$ GOSUB WRITE_FILE
|
||
|
$ INQUIRE RECORD "Enter address"
|
||
|
$ GOSUB WRITE_FILE
|
||
|
$ INQUIRE RECORD "Enter phone number"
|
||
|
$ GOSUB WRITE_FILE
|
||
|
$ CLOSE OUTPUT_FILE
|
||
|
$ EXIT
|
||
|
$!
|
||
|
$! subroutine WRITE_FILE
|
||
|
$!
|
||
|
$ WRITE_FILE:
|
||
|
$ WRITE OUTPUT_FILE RECORD
|
||
|
$ RETURN
|
||
|
|
||
|
|
||
|
Error Handling
|
||
|
~~~~~~~~~~~~~
|
||
|
The command interpreter will execute an EXIT command if a severe error occurs,
|
||
|
terminating the procedure and returning control to the previous command level,
|
||
|
unless the DCL ON command is used to specify an action for the command
|
||
|
interpreter to take. The ON command supports the three keywords WARNING,
|
||
|
ERROR, and SEVERE_ERROR. To override error handling for procedure warnings,
|
||
|
for example, use something like this:
|
||
|
|
||
|
$ ON WARNING THEN EXIT
|
||
|
or
|
||
|
$ ON WARNING THEN GOTO label
|
||
|
|
||
|
WARNING causes the command procedure to take action if a warning, error, or
|
||
|
severe error occurs. ERROR causes the action if an error or severe error
|
||
|
occurs, and SEVERE_ERROR causes the action only if a fatal error occurs.
|
||
|
|
||
|
$STATUS and $SEVERITY are reserved DCL global symbols, and each time a command
|
||
|
is executed, values are assigned to these symbols. $STATUS holds the full
|
||
|
condition code of the last statement and $SEVERITY holds an error severity
|
||
|
level. The condition code in $STATUS is valid to the VAX/VMS MESSAGE facility
|
||
|
and can be used in conjunction with F$MESSAGE to obtain the actual text message
|
||
|
associated with the code:
|
||
|
|
||
|
$ SET DEFAULT DUB1:[BYNON]
|
||
|
$ WRITE SYS$OUTPUT $STATUS $X00000001
|
||
|
$ WRITE SYS$OUTPUT F$MESSAGE(%X00000001)
|
||
|
% SYSTEM-S-NORMAL, normal successful completion
|
||
|
|
||
|
All DCL commands will return a condition code, but not all condition codes
|
||
|
have text messages. Condition codes without text messages will return the
|
||
|
message "%NONAME-E-NOMSG Message number (8-digit code)".
|
||
|
|
||
|
The message text isn't very useful for making conditional decisions though, so
|
||
|
$SEVERITY is used. It contains one of five possible values extracted from the
|
||
|
first three bits of $STATUS. Here are the codes:
|
||
|
|
||
|
Code Definition
|
||
|
~~~ ~~~~~~~~~~
|
||
|
0 Warning
|
||
|
1 Success
|
||
|
2 Error
|
||
|
3 Information
|
||
|
4 Severe Error
|
||
|
|
||
|
Odd values (1,3) indicate success while even values (0,2,4) indicate failure.
|
||
|
There are basically two ways to use the status and severity codes to handle
|
||
|
errors. The first is to treat $STATUS as a Boolean value:
|
||
|
|
||
|
$ SET NOON
|
||
|
$ command ! a DCL command
|
||
|
$ IF $STATUS THEN GOTO NO_ERR ! test $STATUS for T or F
|
||
|
.
|
||
|
. ! handle the error
|
||
|
.
|
||
|
$ NO_ERR ! continue processing
|
||
|
.
|
||
|
.
|
||
|
.
|
||
|
$ EXIT
|
||
|
|
||
|
The second method is to trap the error with the ON WARNING command, then use
|
||
|
the severity level to determine an appropriate course of action:
|
||
|
|
||
|
$ SET NOON
|
||
|
$ ON WARNING GOTO ERR_TRAP
|
||
|
$ command ! a DCL command
|
||
|
$ command ! a DCL command
|
||
|
.
|
||
|
.
|
||
|
.
|
||
|
$ EXIT
|
||
|
$!
|
||
|
$! error trap code
|
||
|
$!
|
||
|
$ ERR_TRAP:
|
||
|
$ SEVERITY = $SEVERITY ! save the error code
|
||
|
$ IF SEVERITY = 0 THEN command ! if warning...
|
||
|
$ GOTO DONE
|
||
|
$ IF SEVERITY = 2 THEN command ! if error...
|
||
|
$ GOTO DONE
|
||
|
$ IF SEVERITY = 4 THEN command ! if severe error...
|
||
|
$ DONE:
|
||
|
.
|
||
|
.
|
||
|
.
|
||
|
$ EXIT
|
||
|
|
||
|
Error checking can be completely disabled with the SET NOON command. When
|
||
|
this is in effect, the command interpreter continues updating the condition
|
||
|
code, but does not perform any error checking. The DCL command SET ON
|
||
|
restors error checking to normal. For example:
|
||
|
|
||
|
$ SET NOON ! turn off error checking
|
||
|
$ command ! a DCL command
|
||
|
$ SET ON ! restor error checking
|
||
|
|
||
|
|
||
|
Termination
|
||
|
~~~~~~~~~~
|
||
|
The EXIT command will terminate the current command procedure and return
|
||
|
control to the command level that called it while the STOP command terminates
|
||
|
all command procedures (if nested) and returns control to DCL.
|
||
|
|
||
|
|
||
|
Example Command Procedures
|
||
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
The following are two example command procedures to demonstrate some of
|
||
|
the previously discussed techniques.
|
||
|
|
||
|
Login.Com
|
||
|
~~~~~~~~
|
||
|
$! Login.Com - executed each time you log in
|
||
|
$!
|
||
|
$! Check for a network or batch login
|
||
|
$!
|
||
|
$ IF F$MODE() .EQS. "NETWORK" THEN GOTO NETWORK
|
||
|
$ IF F$MODE() .EQS. "BATCH" THEN GOTO BATCH
|
||
|
$!
|
||
|
$! Define process permanent symbols for convenience
|
||
|
$!
|
||
|
$ SD == "SET DEFAULT"
|
||
|
$ SH == "SET HOST"
|
||
|
$ WI*DE == "SET TERMINAL/WIDTH=132"
|
||
|
$ NA*RROW == "SET TERMINAL/WIDTH=80"
|
||
|
$ DIR*ECTORY == "DIRECTORY/SIZE"
|
||
|
$ PU*RGE == "PURGE/LOG/KEEP=2" ! keep latest 2 version
|
||
|
$ HO*ME == "SET DEFAULT SYS$LOGIN:"
|
||
|
$ WHO == "SHOW USERS"
|
||
|
$ EVE == "EDIT/TPU"
|
||
|
$ EDT == "EDIT/EDT/COMMAND=SYS$LOGIN:EDTINI.EDT"
|
||
|
$ BR*OWSE == "TYPE/PAGE"
|
||
|
$!
|
||
|
$! Define special keys
|
||
|
$!
|
||
|
$ DEFINE/KEY/NOLOG/TERM PF1 "DIR" ! term ends with <enter>
|
||
|
$ DEFINE/KEY/NOLOG PF2 "EDIT"
|
||
|
$ DEFINE/KEY/NOLOG/TERM/NOECHO PF3 "LOGOUT"
|
||
|
$ DEFINE/KEY/NOLOG/TERM/NOECHO HELP "SHOW KEY/ALL"
|
||
|
$!
|
||
|
$! Modify terminal characteristics
|
||
|
$!
|
||
|
$ SET TERMINAL/INSERT ! insert mode
|
||
|
$ SET PROMPT = "[BYNON]> "
|
||
|
$!
|
||
|
$! Show time and quit
|
||
|
$!
|
||
|
$ SHOW TIME
|
||
|
$ EXIT
|
||
|
$!
|
||
|
$! If it's a network login, we can now
|
||
|
$! perform some other commands if desired.
|
||
|
$! Just quit for now though.
|
||
|
$!
|
||
|
$ NETWORK:
|
||
|
$ EXIT
|
||
|
$!
|
||
|
$! If it's a batch job login, set verification on and quit.
|
||
|
$!
|
||
|
$ BATCH:
|
||
|
$ SET VERIFY
|
||
|
$ EXIT
|
||
|
|
||
|
|
||
|
Subdir.Com
|
||
|
~~~~~~~~~
|
||
|
$! Subdir.Com - how to search and parse character strings
|
||
|
$!
|
||
|
$ WRITE SYS$OUTPUT F$DIRECTORY()+ " Subdirectories:"
|
||
|
$ WRITE SYS$OUTPUT " "
|
||
|
$!
|
||
|
$! Search for subdirectory names and display them on the terminal
|
||
|
$!
|
||
|
$ DIR$LOOP:
|
||
|
$ FILE = F$SEARCH("*.DIR")
|
||
|
$!
|
||
|
$! If DCL returns a null string (" ") we're done
|
||
|
$!
|
||
|
$ IF FILE .EQS. " "THEN GOTO END$DIR$LOOP
|
||
|
$!
|
||
|
$! Find the position of the period
|
||
|
$!
|
||
|
$ DOT = F$LOCATE(".",FILE)
|
||
|
$!
|
||
|
$! Find the position of the right bracket
|
||
|
$!
|
||
|
$ BRACKET = F$LOCATE("]",FILE)
|
||
|
$!
|
||
|
$! Extract the string between the dot and bracket
|
||
|
$!
|
||
|
$ FILE = F$EXTRACT(BRACKET+1,DOT-BRACKET-1,FILE)
|
||
|
$!
|
||
|
$! Display the subdirectory name and start over
|
||
|
$!
|
||
|
$ WRITE SYS$OUTPUT " ' 'FILE' "
|
||
|
$ GOTO DIR$LOOP
|
||
|
$ END$DIR$LOOP:
|
||
|
$ EXIT
|
||
|
|
||
|
<END PART I>
|
||
|
______________________________________________________________________________
|