![]() |
![]() HP OpenVMS Systems Documentation |
![]() |
OpenVMS User's Manual
14.20.2 Using the PIPE Command for Pipeline ExecutionA pipeline is a sequence of pipeline-segment commands connected by pipes, represented by the vertical-bar (|) separator. A pipeline-segment command is a DCL command that appears in a pipeline. The pipe connects the SYS$OUTPUT of one pipeline-segment command to the SYS$INPUT of the next command. The format of a pipeline is as follows:
Each pipeline-segment command runs in a separate subprocess with its SYS$OUTPUT connected to the SYS$INPUT of the next pipeline-segment command. These subprocesses execute in parallel; however, they are synchronized to the extent that each pipeline-segment command, except the first, reads the standard output of its predecessor as its standard input. A pipeline completes execution when the last pipeline-segment command is finished. It is very common to use "filter applications" in a pipeline. A filter application is a program that takes data from SYS$INPUT, transforms it in a specific way, and writes it to SYS$OUTPUT. Some aspects of DCL function differently in the context of a pipeline. For example:
14.20.3 Using the PIPE Command for Subshell ExecutionA subshell is one or more command sequences separated by separators and enclosed in parentheses. The format of a subshell is as follows:
The command sequences in a subshell are executed in a subprocess environment. DCL waits for the subshell to complete before executing the next command sequence. The ( ) separator is similar to the SPAWN/WAIT command.
When using the PIPE command in this format, handle symbol substitution
carefully. After defining a symbol, precede subsequent references to
that symbol with an ampersand (&) to delay symbol substitution.
Otherwise symbol substitution takes place during phase 1 of command
processing, at which time the symbol definition is unreliable.
Command sequences can be executed in a subprocess environment by using the following form:
DCL does not wait for the command sequences to finish. Control passes
back to DCL once the background subprocess is created.
A command sequence can redirect its SYS$INPUT, SYS$OUTPUT, or SYS$ERROR to a file during execution of the command as follows:
A pipeline-segment command can also redirect its SYS$INPUT, SYS$OUTPUT or SYS$ERROR. However, SYS$OUTPUT redirection is allowed only for the last pipeline-segment command, and SYS$INPUT redirection is allowed only for the first pipeline-segment command. Note that a PIPE command redirection is different from one created using the DEFINE or ASSIGN command. The differences are as follows:
When SYS$OUTPUT is redirected, the redirected output file is always created, whether or not the command sequence actually writes to SYS$OUTPUT. If a version of a file with the same name as the redirected output file already exists, a new version of that file is created. (This behavior is the same as using the DEFINE or ASSIGN command to redefine SYS$OUTPUT in supervisor mode.) Note that the redirected file is created before the command sequence is executed. If the redirected file is also used in the command sequence, the operation may fail, as in the following example:
When SYS$ERROR is redirected, the redirected error file is only created
when the command sequence actually writes to the SYS$ERROR during
execution, and there is no existing file with the same name as the
redirected error file. If a file with the same name as the redirected
error file already exists, that file is opened as the redirected error
file. The error output generated by this command sequence is then
appended to the end of the redirected error file. (This behavior is the
same as using the DEFINE or ASSIGN command to redefine SYS$ERROR in
supervisor mode.)
You can interrupt a PIPE command by pressing Ctrl/Y. If the PIPE command is executing in a pipeline or a subshell command sequence, the command sequence and the PIPE command are deleted. In this case, a CONTINUE command entered immediately after the interrupt will not resume the execution of the PIPE command.
If the PIPE command is executing a command sequence other than a
subshell or a pipeline command sequence, DCL behaves as if the command
sequence were entered as a DCL command without the PIPE command verb
and interrupted by Ctrl/Y. See Section 13.11 for more information about
the Ctrl/Y interrupt.
A PIPE command can generate a number of subprocesses during execution. Often, the applications invoked by command sequences do not depend on the process logical names and symbol names. In this case, the spawning of subprocesses can be accelerated by using the /NOLOGICAL_NAMES and /NOSYMBOLS qualifiers, which suppress the passing of process logical names and symbols to the subprocesses created by the PIPE command. The following examples use the PIPE command:
Chapter 15
|
$ DIR_NAME = F$ENVIRONMENT("DEFAULT") $ SET DEFAULT DISK4:[TEST] . . . $ SET DEFAULT 'DIR_NAME' |
$! Redirect the output of the SHOW DEFAULT command to a file. $ DEFINE/SUPERVISOR_MODE SYS$OUTPUT DISK4:[TEST]TEMPFILE.DAT $ SHOW DEFAULT $ DEASSIGN SYS$OUTPUT $! $ OPEN/READ DIR_FILE DISK4:[TEST]TEMPFILE.DAT ! Open the file. $ READ DIR_FILE DIR_NAME, ! Read the file. $ SET DEFAULT 'DIR_NAME' ! Reset the directory. $ CLOSE DIR_FILE ! Close the file. $ DELETE DISK4:[TEST]TEMPFILE.DAT;* ! Delete the file. |
You often change process characteristics for the duration of a command procedure and then restore them. You can use the following lexical functions to obtain information about your process:
F$DIRECTORY | Returns the current default directory string. |
F$ENVIRONMENT | Returns information about the command environment for your process. |
F$GETJPI | Returns accounting, status, and identification information about your process or about other processes on the system. |
F$MODE | Shows the mode in which your process is executing. |
F$PRIVILEGE | Indicates whether your process has the specified privileges. |
F$PROCESS | Returns the name of your process. |
F$SETPRV | Sets the specified privileges. This function also indicates whether the specified privileges were previously enabled before you used the F$SETPRV function. |
F$USER | Returns your user identification code (UIC). |
F$VERIFY | Indicates whether verification is on or off. |
The following table shows process characteristics that are commonly changed in command procedures. It also gives the lexical functions that save these characteristics and the DCL commands that restore the original settings.
Characteristic | Operation | Command or Lexical Function |
---|---|---|
Control characters | Save | F$ENVIRONMENT("CONTROL") |
Restore | SET CONTROL | |
DCL prompt | Save | F$ENVIRONMENT("PROMPT") |
Restore | SET PROMPT | |
Default protection | Save | F$ENVIRONMENT("PROTECTION") |
Restore | SET PROTECTION/DEFAULT | |
Key state | Save | F$ENVIRONMENT("KEY_STATE") |
Restore | SET KEY | |
Message format | Save | F$ENVIRONMENT("MESSAGE") |
Restore | SET MESSAGE | |
Privileges | Save | F$PRIVILEGE or F$SETPRV |
Restore | F$SETPRV or SET PROCESS/PRIVILEGES | |
Verification | Save | F$VERIFY or F$ENVIRONMENT |
Restore | F$VERIFY or SET VERIFY |
If you save process characteristics, you must ensure that an error or
Ctrl/Y interruption does not cause the procedure to exit before you
restore the original characteristics. (See Chapter 13 for more
information on handling errors and Ctrl/Y interruptions.)
15.2.1 Changing Verification Settings
You can use the F$VERIFY lexical function to disable verification for the duration of a command procedure. This prevents users from displaying a procedure's contents while executing the procedure.
There are two types of verification:
By default, the SET [NO]VERIFY command and the F$VERIFY function turn both types of verification on or off. In general, the procedure and image verification settings in a procedure are the same (both on or both off). However, if you decide to change the settings, save each verification setting separately.
In the following example, the symbol TEMP is used to enable and disable verification:
$ ! Enable verification $ ! $ TEMP = F$VERIFY(1) $ LOOP: $ INQUIRE FILE "File name" $ IF FILE .EQS."" THEN EXIT $ PRINT 'FILE' $ GOTO LOOP $ ! Disable verification $ ! $ TEMP = F$VERIFY(0) $ EXIT |
In the following example, the verification settings are saved:
$ ! Save each verification state $ ! Turn both states off $ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE") $ SAVE_VERIFY_PROCEDURE = F$VERIFY(0) . . . $ ! Restore original verification states $ SAVE_VERIFY_IMAGE = F$VERIFY(SAVE_VERIFY_PROCEDURE,- SAVE_VERIFY_IMAGE) |
The F$ENVIRONMENT function returns the current image verification setting and assigns this value to the symbol SAVE_VERIFY_IMAGE. Next, the F$VERIFY function returns the current procedure verification setting and assigns this value to the symbol SAVE_VERIFY_PROCEDURE. The F$VERIFY function disables both image and procedure verification. You can use the F$ENVIRONMENT function to obtain the procedure verification setting before you disable verification with F$VERIFY. However, it is shorter to use F$VERIFY to accomplish both tasks in one command line, as shown in the previous example.
At the end of this procedure, the F$VERIFY function restores the original settings (specified by the symbols SAVE_VERIFY_PROCEDURE and SAVE_VERIFY_IMAGE.)
If you are using time-stamping, remember that it applies only if verification is enabled. For more information on time-stamping and the SET PREFIX command, refer to the OpenVMS DCL Dictionary or DCL help. |
Previous | Next | Contents | Index |