OpenVMS 用户手册
13.11.2 停止特权映象
在中断执行特权映象时,如果要保存映象的上下文可以输入 CONTINUE、SPAWN 或 ATTACH 命令。如果输入任何其他命令 (除在派生或附加子进程内的命令之外),特权映象就被强制退出。
13.12 设置 Ctrl/Y 动作例行程序
以下几节描述如何设置 Ctrl/Y 动作例行程序。13.12.1 使用 ON 命令
ON
命令定义在出错情况下采取的动作,它提供一个方法为在命令过程执行期间发生的 Ctrl/Y
中断定义一个动作例行程序。您指定的动作取代默认 Ctrl/Y 动作
(即在 Ctrl/Y 命令级提示输入命令)。例如:
如果过程执行这个 ON 命令,那么在过程执行期间的后续 Ctrl/Y
中断使这个过程退出。控制被传递给上一个命令级。
当按下 Ctrl/Y 中断使用 ON CONTROL_Y 的过程时,采取以下动作:
- 如果当前执行的命令是在命令解释程序中执行的命令,就完成这个命令并采取 Ctrl/Y 动作。
- 如果当前命令或程序是通过一个映象执行,而不是命令解释程序,这个映象就被强制退出并采取 Ctrl/Y 动作。然而,如果这个映象已声明一个退出处理程序,那么这个退出处理程序就在采取 Ctrl/Y 动作之前执行。在 Ctrl/Y 动作之后不能继续这个映象。
13.12.2 输入 Ctrl/Y 的效果
执行 Ctrl/Y 不会自动重新设置默认的 Ctrl/Y 动作 (即在 Ctrl/Y 命令级提示输入命令)。Ctrl/Y 动作保持有效直到发生以下条件之一:
- 过程终止 (类似按下 Ctrl/Y、执行 EXIT 或 STOP 命令或默认出错条件处理动作的结果)。
- 执行另一个 ON CONTROL_Y
命令。
- 执行 SET NOCONTROL=Y 命令的过程 (请参阅
13.13 节)。
Ctrl/Y 动作可以在每个活动命令级指定,并且只影响指定此命令级。
以下例子展示的命令过程执行时,每个 Ctrl/Y 中断导致执行 SHOW TIME
命令。在每个 SHOW TIME 命令执行之后,过程恢复执行在中断命令之后的命令。
$ ON CONTROL_Y THEN SHOW TIME
|
图 13-2 说明 Ctrl/Y 中断后的执行流。
图 13-2 Ctrl/Y 动作后的执行流
- 在执行 TYPE
命令期间发生 Ctrl/Y 中断。
- 然后,控制传递到标号 CLEAN_UP。
- 在执行这个例行程序之后,命令过程退出并返回到交互命令级。
- 在 TYPE 命令执行期间发生
Ctrl/Y 中断。
- 执行在 ON 命令中指定的 WRITE 命令。
- 命令过程继续执行在中断命令之后的命令。
图 13-3
说明在嵌套命令过程执行期间按下 Ctrl/Y
时会发生什么事情。
图 13-3 在嵌套过程中的 Ctrl/Y
- 执行 SEARCH.COM 时,如果发生 Ctrl/Y 中断,那么控制被传递到标号 CLEAN_UP。
- 执行 SUBSEARCH.COM 时,如果发生 Ctrl/Y
中断,控制则被传递到 SEARCH.COM 中的标号 NEXT_STEP。
- 因为在 SUBSEARCH.COM 中没有指定 Ctrl/Y
动作,因此发生 Ctrl/Y 中断时,过程退到上一个命令级。
- 执行 SUBSUB.COM 时,如果发生 Ctrl/Y 中断,则执行
SHOW TIME。
13.13 撤消和允许 Ctrl/Y 中断
以下几节描述如何撤消和允许 Ctrl/Y
中断。
13.13.1 使用 SET NOCONTROL=Y
SET NOCONTROL=Y 命令撤消 Ctrl/Y
处理。即是说,如果命令过程执行 SET NOCONTROL=Y 命令,按下 Ctrl/Y
就没有效果。
SET NOCONTROL=Y 命令也取消当前用 ON CONTROL_Y 命令建立的 Ctrl/Y 动作。要重新建立默认
Ctrl/Y 动作,使用以下两个命令:
$ SET NOCONTROL=Y
$ SET CONTROL=Y
|
SET NOCONTROL=Y 命令撤消 Ctrl/Y 处理,并取消当前 ON CONTROL_Y 动作。SET CONTROL=Y 命令允许 Ctrl/Y
处理。在这一点上,默认动作就被复原。即是说,如果在过程执行期间按下 Ctrl/Y,那么命令解释程序就在 Ctrl/Y 命令级提示输入命令。
可以在任何命令级使用 SET NOCONTROL=Y 命令。它影响所有命令级,直到 SET CONTROL=Y 命令重新允许
Ctrl/Y 处理。
13.13.2 使用 SET CONTROL=Y
ON CONTROL_Y 命令保持有效,直到执行另一个 ON CONTROL_Y 或 SET NOCONTROL=Y 命令,或者命令过程退出。
当 Ctrl/Y 撤消时,要退出无尽循环必须从另一个终端使用 DCL 命令 STOP 删除您的进程。如果撤消默认 Ctrl/Y 动作,就尽快重新设置它。要重新设置默认 Ctrl/Y
动作,就执行 SET NOCONTROL=Y 命令,后面跟随 SET CONTROL=Y 命令。
在这个命令过程中,当文件正在被键入时按下 Ctrl/Y 就把控制传递给标号 END_TYPE:
.
.
.
$! Type a file
$ IF COMMAND .NES. "TY" THEN GOTO END_TYPE
$ ON CONTROL_Y THEN GOTO END_TYPE
$ TYPE 'FILESPEC'
$END_TYPE:
$!
$! Reset default
$ SET NOCONTROL=Y
$ SET CONTROL=Y
.
.
.
|
注意
ON CONTROL_Y 和 SET NOCONTROL=Y 命令用于特殊的应用程序。一般而言,Compaq
不建议您撤消
Ctrl/Y 中断。当 Ctrl/Y 撤消时要退出一个无尽循环,必须删除 (从另一个终端) 执行这个循环过程的进程。
|
13.14 在命令过程中使用条件码检测出错
在命令过程中的每个 DCL
命令执行完成时,命令解释程序保存描述命令终止原因的条件代码。这个代码可以指出成功完成,或者标识一个通知或出错消息。
命令解释程序检查在执行命令过程的每个命令之后的条件代码。如果发生一个需要特殊动作的出错,系统就执行这个动作。否则,执行过程的下一个命令。
13.14.1 显示条件码 ($STATUS)
命令解释程序把条件代码保存为在保留全局符号 $STATUS 中的 32 位长字。$STATUS 符号符合系统管理代码的格式,如下所示:
- 位 0--2 包含消息的严重级。
- 位 3--15 包含消息编号。
- 位 16--27 包含与产生消息的设施关联的数。
- 位 28--31 包含内部的控制标记。
命令成功完成时,$STATUS 有一个奇数值。(位 0--2 包含 1 或 3。)
发生任何类型的警告或出错时,$STATUS 有一个偶数值。(位 0--2 包含 0、2 或 4。) 命令解释程序维护和显示
$STATUS 当前的十六进制值。通过输入 SHOW SYMBOL $STATUS 命令,可以显示 $STATUS 的 ASCII 翻译。
在以下例子中,文件名 (%FRED.LIS) 输入错误:
$ CREATE %FILE.LIS
%CREATE-E-OPENOUT, error opening %FRED.LIS; as output
-RMS-F-WLD, invalid wildcard operation
$ SHOW SYMBOL $STATUS
$STATUS = " %X109110A2"
$ WRITE SYS$OUTPUT F$MESSAGE(%X109110A2)
%CREATE-E-OPENOUT, error opening !AS as output
|
13.14.2 使用 EXIT 命令返回条件码
命令过程退出时,命令解释程序在 $STATUS 中返回上一个命令的条件代码。条件代码提供有关最近命令是否成功执行的信息。
在命令过程中使用 EXIT 命令时,可以指定一个值取代 DCL 将赋予 $STATUS 的值。这个值,被称为状态码,必须指定为一个整型表达式。
命令过程包含建立多个命令级的嵌套过程时,可以使用 EXIT 命令返回一个明确取代默认条件码的值。
检查以下两个命令过程:
$! This is file A.COM
$!
$ @B
.
.
.
|
$! This is file B.COM
$!
$ ON WARNING THEN GOTO ERROR
.
.
.
$ ERROR:
$ EXIT 1
|
B.COM 中的
ON 命令意味着,当 B.COM
执行时如果有任何警告、出错或严重出错,这个过程就被指引到标号 ERROR。这里,条件代码明确设置为 1,指出成功。因此,当 B.COM 终止时,它传递一个成功代码给 A.COM,而不管是否出错。13.14.3 决定严重级
$STATUS 的低端 3 位表示引起命令终止条件的严重性。这部分条件代码包含在保留的全局符号 $SEVERITY 中。$SEVERITY
符号的值可以是 0
至 4 ,其中每个值表示以下严重级之一:
| 值 |
严重性 |
|
0
|
警告
|
|
1
|
成功
|
|
2
|
出错
|
|
3
|
通知
|
|
4
|
致命的 (严重的) 出错
|
注意,成功和通知代码有奇数值,而警告和出错代码有偶数值。13.14.4 测试成功完成
使用对 $SEVERITY 或 $STATUS 执行逻辑测试的 IF 命令,可以测试命令是否成功完成,如下所示:
$ IF $SEVERITY THEN GOTO OKAY
$ IF $STATUS THEN GOTO OKAY
|
如果 $SEVERITY 和 $STATUS 有真 (奇) 值,
这些 IF 命令就把控制流转移到标号 OKAY。当 $SEVERITY 和 $STATUS
的当前值是奇数时,命令或程序就成功完成。如果命令或程序没有成功完成,那么 $SEVERITY 和 $STATUS
就是偶数;因此,IF 表达式为假。
代替测试条件是否为真,您可以测试它是否是假。例如:
$ IF .NOT. $STATUS THEN ...
|
命令解释程序使用条件代码的严重级确定是否采取 ON 命令定义的动作,如 13.9 节
所述。13.15 使用不设置 $STATUS 的命令
调用系统公用程序的大多数 DCL 命令完成时会产生状态值和出错消息。然而,有几个命令成功完成时不更改 $STATUS 和 $SEVERITY 的值。这些命令如下所示:
|
CONTINUE
|
DECK
|
DEPOSIT
|
|
EOD
|
EXAMINE
|
GOTO
|
|
IF
|
RECALL
|
SET SYMBOL/SCOPE
|
|
SHOW STATUS
|
SHOW SYMBOL
|
STOP
|
|
WAIT
|
|
|
如果这些命令的任意一个导致不成功状态,那么其条件代码将被放入 $STATUS,而其严重级被放入
$SEVERITY。
13.16 注册命令过程
注册命令过程是一个每次注册时操作系统就会自动执行的命令过程。在提交的每个批量作业开始时,系统也执行这个过程。
有两类注册命令过程:
13.16.1 全系统注册命令过程
全系统注册命令过程有以下特征:
- 全系统注册命令过程在您的个人注册命令过程之前执行。
- 当全系统注册命令过程终止时,该过程把控制传递给您的个人注册命令过程。
- 全系统注册命令过程允许系统管理员确保某些命令总是在您注册时执行。
要建立全系统注册命令过程,您的系统管理员使逻辑名 SYS$SYLOGIN 等同于适当的注册命令过程。系统管理员可以指定这个注册命令过程用于所有系统用户或某些用户组。13.16.2 个人注册命令过程
您可以建立一个个人注册命令过程使每次注册时执行同样的命令。
系统管理员为注册命令过程分配文件说明。在大多数安装中,注册命令过程被称为 LOGIN.COM。因此,应该把注册命令过程命名为 LOGIN.COM,除非系统管理员告诉您其他文件名。
以下是一个 LOGIN.COM 过程的例子:
$IF F$MODE() .NES. "INTERACTIVE" THEN EXIT
$SET TERMINAL/INSERT
$DIR :== DIR/DATE/SIZE
$EDIT :== EDIT/EDT
$EXIT
|
13.16.3 受约束帐户的注册命令过程
把特殊命令过程的名称放入用于您的帐户的 LGICMD
字段,您的系统管理员可以设置受约束帐户。如果注册到一个受约束帐户,那么在命令过程中只可以执行为您帐户指定的功能;不能使用全部的 DCL 命令。有关受约束帐户的详情,请参阅 OpenVMS System Manager's Manual。13.17 扩展文件说明和分析样式
需要特定文件名分析样式的命令过程可以在过程中包括转换样式的命令。以下命令过程保存当前分析样式,设置分析样式为 TRADITIONAL,执行 (未指定的) 命令,然后恢复已保存的分析样式。
$ original_style= f$getjpi("","parse_style_perm")
$ SET PROCESS/PARSE_STYLE=TRADITIONAL
.
.
.
$ SET PROCESS/PARSE_STYLE='original_style'
|
第一个命令使 'original_style' 等同于当前分析样式。第二个命令把分析样式设置为 TRADITIONAL。最后一个命令把分析样式重新设置为其原始样式。13.18 在 DCL 命令参数中使用扩展文件名
在 ODS-5 环境下,使用文件名作为参数的命令过程可以产生不同的结果。
您可以从 TRADITIONAL 转换为 EXTENDED
分析样式,而如果您选择这么做,可能影响以下区域 (本节描述):
- 命令过程文件说明
- 字母大小写保留和 $FILE
- 和号替换与省略号替换
有关转换分析样式的详情,请参阅 5.3 节。13.18.1 命令过程文件说明
如果使用间接命令过程,可能需要用引号括住一些过程变元。
以下例子展示当使用同一命令文件 SS.COM 时,TRADITIONAL 和 EXTENDED 分析样式的输出差别:
$ create ss.com
$ if p1 .nes. "" then write sys$output "p1 = ",p1
$ if p2 .nes. "" then write sys$output "p2 = ",p2
$ if p3 .nes. "" then write sys$output "p3 = ",p3
|
- 设置分析样式为 TRADITIONAL 并运行 SS.COM
可产生以下输出:
$ set process/parse_style=traditional
$ @ss ^ parg2 parg3
p1 = ^
p2 = PARG2
p3 = PARG3
|
注意,音调符号 (^) 是第一个变元 (不是换码符),而且对于 p2 和 p3 过程变元,字母大小写是不保持的。
- 设置分析样式为 EXTENDED,则当运行同一命令过程时产生以下输出:
$ set process/parse_style=extended
$ @ss ^ parg2 parg3
p1 = ^ PARG2
p2 = PARG3
|
注意,命令过程把音调符号 (^) 识别为换码符,把空格标识为文字字符而不是变元分隔符,并且 "^ PARG2"
是第一个变元。也不保持字母大小写。
- 为音调符号 (^) 添加引号产生以下结果:
$ @ss "^" parg2 parg3
p1 = ^
p2 = PARG2
p3 = PARG3
|
因为音调符号 (^) 是在引用的字符串内,它不被处理为一个换码符。 - 把引号添加到 p3 变元,产生以下结果:
$ @ss "^" parg2 "parg3"
p1 = ^
p2 = PARG2
p3 = parg3
|
注意,为 p3 过程变元保持字母大小写。
- 分析样式设置为 TRADITIONAL 时,以下命令把音调符号 (^) 和 parg2 和 parg3
字符串处理为过程变元,并且命令过程产生以下结果:
$ set process/parse_style=traditional
$ @ss^ parg2 parg3
p1 = ^
p2 = PARG2
p3 = PARG3
|
- 分析样式设置为 EXTENDED 时,音调符号 (^) 被视为换码符,把空格标识为一个文字字符。在以下展示的例子中,DCL 寻找文件 "SS^_PARG2.COM",因而出错:
$ set process/parse_style=extended
$ @ss^ parg2 parg3
-RMS-E-FNF, file not found
|
13.18.2 字母大小写保留和 $FILE
DCL 尝试保持文件说明的字母大小写。只有用命令定义公用程序 (CDU)
定义的命令,才能做到这一点。DCL 保持在命令定义文件 (.CLD) 中使用 $FILE 分析类型定义的任何项目的字母大小写。
有关详情,请参阅 OpenVMS Command Definition, Librarian, and Message Utilities Manual。13.18.3
和号替换与省略号替换
与省略号替换不同,可以使用和号 (&) 替换在传统分析中保持字母大小写。
以下传统分析例子展示一串更改字符串字母大小写的命令:
$ set process/parse_style=traditional
$ x = "string"
$ define y 'x'
$ sho log y
"Y" =
"STRING" (LNM$PROCESS_TABLE)
$ define y &x
%DCL-I-SUPERSEDE, previous value of Y
has been superseded
$ sho log y
"Y" =
"string" (LNM$PROCESS_TABLE)
|
注意,使用和号 (&) 保持赋值给 x 变量的字符串字母大小写。
省略号替换发生在命令行设置为大写字母之前,而和号替换发生在命令行设置为大写字母之后。
以下扩展分析例子展示同样的一列命令:
$ set process/parse_style=extended
$ define y 'x'
%DCL-I-SUPERSEDE, previous value of Y has been superseded
$ sho log y
"Y" = "string" (LNM$PROCESS_TABLE)
$ define y &x
%DCL-I-SUPERSEDE, previous value of Y has been superseded
$ sho log y
"Y" = "string" (LNM$PROCESS_TABLE)
|
注意,y 变量的两个字符串都返回小写字母。这是因为 DEFINE 命令使用 $FILE,它保持字母大小写。
因此,和号替换可以用来指定扩展文件名,即使分析样式设置为 TRADITIONAL,如以下例子所示:
$ set process/parse=extended
$ cre file^ name.doc
Contents of an ODS5 file
Exit
$ set process/parse=traditional
$ a = "file^ name.doc"
$ type file^ name.doc
%DCL-W-PARMDEL, invalid parameter delimiter - check use of special characters
\^NAME\
$ type 'a'
%DCL-W-PARMDEL, invalid parameter delimiter - check use of special characters
\^NAME\
$ type &a
Contents of an ODS5 file
|
|