| United States-English |
|
|
|
![]() |
HP OpenVMS Systems Documentation |
OpenVMS 用户手册
14.20.2 使用 PIPE 命令执行流水线流水线是一串用管道连接的流水线段命令,以垂直条 (|) 分隔符表示。流水线段命令是出现在流水线中的 DCL 命令。管道把一个流水线段命令的 SYS$OUTPUT 连接到下一个命令的 SYS$INPUT。流水线的格式如下所示:
每个流水线段命令在一个单独子进程中运行,它的 SYS$OUTPUT 连接到下一个流水线段命令的 SYS$INPUT。这些子进程并行执行;然而,它们同步到这种程度:除第一个之外,每个流水线段命令读取上一个的标准输出作为它的标准输入。当最后一个流水线段命令完成时,流水线就执行完成。 在流水线中使用 "筛选应用程序" 是很普通的。筛选应用程序是这样一个程序,它从 SYS$INPUT 获取数据,按特定方法改变它,然后把它写入 SYS$OUTPUT。 DCL 函数有些方面会在流水线的上下文中有所不同。例如:
14.20.3 使用 PIPE 命令执行子外壳子外壳是一个或多个用分隔符分隔的命令序列,并且括入圆括号中。子外壳的格式如下所示:
子外壳的命令序列在子进程环境中执行。在执行下一个命令序列之前,DCL 等待子外壳完成。( ) 分隔符类似于 SPAWN/WAIT 命令。
按这个格式使用 PIPE 命令时,要小心地处理符号替换。在定义符号后,在以后引用这个符号之前使用和号 (&)
延迟符号替换。否则符号替换将发生在命令处理的第一阶段期间,而在这个时间符号定义是不可靠的。 使用以下格式,命令序列可以在子进程环境中执行:
DCL 不等待命令序列完成。一旦建立后台子进程,就把控制传递回 DCL。
在命令执行期间,命令序列可以把它的 SYS$INPUT、SYS$OUTPUT 或 SYS$ERROR 重定向到一个文件,如下所示:
流水线段命令也可以重定向它的 SYS$INPUT、SYS$OUTPUT 或 SYS$ERROR。然而,只允许最后一个流水线段命令重定向 SYS$OUTPUT,并且只允许第一个流水线段命令重定向 SYS$INPUT。 注意,PIPE 命令重定向不同于使用 DEFINE 或 ASSIGN 命令建立的重定向。其差别如下:
当 SYS$OUTPUT 重定向时,总是建立重定向的输出文件,而不管命令序列是否实际上写入 SYS$OUTPUT。如果已经存在与重定向输出文件同名的文件版本,那么就建立这个文件的新版本。(这个行为与在监督程序模式下使用 DEFINE 或 ASSIGN 命令重新定义 SYS$OUTPUT 一样。) 注意,重定向的文件在这个命令序列执行之前就已建立。如果重定向的文件也在这个命令顺序中使用,那么操作可能失败,如以下例子所示:
当 SYS$ERROR 被重定向时,重定向的出错文件只当命令序列在执行期间实际写入 SYS$ERROR 时才建立,并且没有现有文件与重定向的出错文件同名。如果与重定向出错文件同名的文件已经存在,那么这个文件就被打开为重定向的出错文件。然后,这个命令序列产生的出错输出被附加到重定向出错文件的末端。(这个行为与在监督程序模式下使用 DEFINE 或 ASSIGN 命令重新定义 SYS$OUTPUT 一样。)
按下 Ctrl/Y,可以中断 PIPE 命令。如果 PIPE 命令正在流水线或子外壳命令序列中执行,这个命令序列和 PIPE 命令就会被删除。在这种情况下,立即在中断后输入 CONTINUE 命令将不会恢复 PIPE 命令的执行。
如果 PIPE 命令正在执行一个命令序列,而不是子外壳或流水线命令序列,那么 DCL 这时对这个命令序列的处理就象一个不带 PIPE 命令动词的 DCL 命令,并且被 Ctrl/Y 中断。有关 Ctrl/Y 中断的详情,请参阅
13.11 节。 在执行期间,PIPE 命令可以产生许多子进程。通常,被命令序列调用的应用程序不依赖于进程逻辑名和符号名。在这种情况下,使用 /NOLOGICAL_NAMES 和 /NOSYMBOLS 限定词可以加速子进程的派生,它们抑制把进程逻辑名和符号传递给 PIPE 命令建立的子进程。 以下例子使用 PIPE 命令:
第 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. |
在命令过程中经常需要更改进程特征,然后使之恢复。您可以使用以下词法函数获得进程信息:
| F$DIRECTORY | 返回当前默认目录字符串。 |
| F$ENVIRONMENT | 返回进程的命令环境的信息。 |
| F$GETJPI | 返回有关您的进程或系统上的其他进程的计帐、状态和标识信息。 |
| F$MODE | 展示进程执行的模式。 |
| F$PRIVILEGE | 指出进程是否有指定特权。 |
| F$PROCESS | 返回进程的名称。 |
| F$SETPRV | 设置指定特权。这个函数也指出指定特权是否在使用这个 F$SETPRV 函数之前允许。 |
| F$USER | 返回用户标识码 (UIC)。 |
| F$VERIFY | 指出是否校验。 |
下表展示经常在命令过程中更改的进程特征。表中也给出保存这些特征的词法函数和恢复其原始设置的 DCL 命令。
| 特征 | 操作 | 命令或词法函数 |
|---|---|---|
| 控制字符 | 保存 | F$ENVIRONMENT("CONTROL") |
| 恢复 | SET CONTROL | |
| DCL 提示 | 保存 | F$ENVIRONMENT("PROMPT") |
| 恢复 | SET PROMPT | |
| 默认保护 | 保存 | F$ENVIRONMENT("PROTECTION") |
| 恢复 | SET PROTECTION/DEFAULT | |
| 键状态 | 保存 | F$ENVIRONMENT("KEY_STATE") |
| 恢复 | SET KEY | |
| 消息格式 | 保存 | F$ENVIRONMENT("MESSAGE") |
| 恢复 | SET MESSAGE | |
| 特权 | 保存 | F$PRIVILEGE 或 F$SETPRV |
| 恢复 | F$SETPRV 或 SET PROCESS/PRIVILEGES | |
| 校验 | 保存 | F$VERIFY 或 F$ENVIRONMENT |
| 恢复 | F$VERIFY 或 SET VERIFY |
如果要保存进程特征,必须确保一个出错或
Ctrl/Y 中断不会引起过程在恢复其原始特征之前退出。(有关出错处理和 Ctrl/Y 中断的详情,请参阅第 13 章。)
15.2.1 更改校验设置
您可以使用 F$VERIFY 词法函数撤消在命令过程期间的校验。这阻止用户在执行过程期间显示过程的内容。
有两类校验:
按照默认,SET [NO]VERIFY 命令和 F$VERIFY 函数启用或停掉这个两类校验。一般而言,在过程中过程和映象校验设置是一样的 (两个都启用,或两个都停掉)。然而,如果决定更改这个设置,那么分别保存每个校验设置。
在以下例子中,符号 TEMP 用于允许和撤消校验:
$ ! 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 |
在以下例子中,保存校验设置:
$ ! 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)
|
F$ENVIRONMENT 函数返回当前映象校验设置,并把这个值赋予符号 SAVE_VERIFY_IMAGE。然后,F$VERIFY 函数返回当前过程校验设置,并把这个值赋予符号 SAVE_VERIFY_PROCEDURE。F$VERIFY 函数撤消这两个映象和过程校验。在用 F$VERIFY 撤消校验之前,可以使用 F$ENVIRONMENT 函数获得过程校验设置。然而,在一个命令行中使用 F$VERIFY 完成这两个任务的代码较短,如上一个例子所示。
在这个过程的末端,F$VERIFY 函数恢复其原始设置 (由符号 SAVE_VERIFY_PROCEDURE 和 SAVE_VERIFY_IMAGE 指定。)
如果使用时间戳,要记住只当允许校验时才应用它。有关时间戳和 SET PREFIX 命令的详情,请参阅 OpenVMS DCL Dictionary 或 DCL 求助。 |
| 前页 | 后页 | 目录 | 索引 |
| ** About PDF files: The PDF files on this Web site can be read online or printed using Adobe® Acrobat® Reader. If you do not have this software installed on your system, you may download it from the Adobe Web site. | ||
|
|||||||||||||||