命令最新的电脑操作系统

最新的电脑操作系统  时间:2021-05-02  阅读:()
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum第1章OpenVMS操作系统使用入门OpenVMS是一种交互式虚拟存储操作系统.
当您注册到计算机时,您和系统就使用DIGITAL命令语言(DCL)进行对话.
您通过键盘输入命令来使用DCL,系统读取和翻译您输入的命令.
系统的响应是执行命令,如果不能解释您输入的命令就在屏幕上显示一条出错消息.
这章描述与OpenVMS操作系统交互您需要知道的基本信息:注册从PC注册为您的帐户挑选密码读取通知消息注册类型和注册种类注册失败更改密码密码和帐户满期时间密码保护指南认识系统响应获得关于系统的求助信息注销退出系统不危及系统安全地注销网络关于本章引用的所有命令的完整描述,请参阅OpenVMSDCLDictionary和联机求助.
1.
1注册注册包括获得对系统的存取权和把您自己标识为一个授权用户.
当您注册时,系统建立一个您可以输入命令的环境.
这个环境称为您的进程.
您注册和注销OpenVMS操作系统的方法依赖于系统是如何在您的站点设置的.
这节提供对注册和注销操作系统的一般描述.
与您的系统管理员核对用于您的站点的注册和注销过程.
要与操作系统进行交互,您必须注册为用户帐户.
帐户是注册时系统识别您的一个名称或号码.
该名称或号码告诉系统您的文件存储在何处和您对其他文件的存取类型.
您的系统管理员(或您在安装时授权系统使用的人)通常设置帐户并根据您的需要授予特权.
授予您帐户的存取类型权和特权确定您是否有权存取文件、映象或可能影响系统性能或其他用户的公用程序.
要存取帐户,您需要输入用户名和密码.
系统管理员通常给提供用户名和初始密码.
用户名标识在系统中的您并与其他用户区别.
密码用于保护您.
如果您保持它的秘密,其他用户就不能使用在您的用户名下的系统资源.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum要注册系统,使用以下过程:步骤任务1系统显示一个提示要输入您的用户名:Username:键入您的用户名并按下Enter键.
您有大约30秒时间做这件事;否则,系统"超时".
如果发生超时,您必须再次开始注册过程.
系统在屏幕上显示您键入的用户名.
例如:Username:CASEY系统提示您键入密码:Password:2键入您的密码并按下Enter键.
系统不显示您的密码,有时称为"不回应".
3您也许需要输入第二个密码或者使用自动生成的密码,这取决于系统管理员对您的帐户的设置(参阅1.
3.
4节).
1.
1.
1成功注册如果注册成功,系统在屏幕的左边线显示一个美元符($).
美元符是默认的DCL提示;它指出系统已准备使用.
以下例子展示一个成功注册:Username:CASEYPassword:WelcometoOpenVMSonnodeMARSLastinteractiveloginonFriday,11-DEC-200208:41Lastnon-interactiveloginonThursday,10-DEC-200211:05$1.
1.
2注册出错UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果您在输入用户名或密码时出错或者如果密码已过期,系统将显示用户授权失败的消息,而您则不能注册.
如果您出错,按下Enter键再试.
如果密码已过期,您需要更改您的密码;系统将自动显示SetPassword:提示.
有关在这种情况下更改密码的详情,请参阅1.
7节.
如果您有任何其他注册难题,请为您设置帐户的人帮助.
1.
2从PC注册以前,您通过由监视器和键盘组成的视频终端连接到主计算机.
所有计算能力驻留在运行OpenVMS操作系统的主计算机上,该主计算机经常安装在一个中心计算机房里.
现今,则普遍使用有独立计算能力的个人计算机(PC)或工作站进行工作.
在这种情形下,您通过终端仿真程序连接到运行OpenVMS的主计算机.
终端仿真程序让您通过TCP/IP网络、互连网或内部互连网连接到OpenVMS系统.
使用终端仿真程序提供的界面,您与操作系统的交互显示在PC监视器上.
要以这种方法连接到OpenVMS,您先启动终端仿真程序,选择您要连接的系统,然后注册到OpenVMS操作系统,如本章所述.
1.
3为您的帐户挑选密码要挑选一个安全密码,使用以下指南:在密码中包括数字和字母.
虽然一个只包含字母的6字符密码是相当安全的,然而包含字母和数字两者的6字符密码将更加安全.
挑选包含6到10个字符的密码.
适当长度使密码更加安全.
您可以挑选长达32个字符的密码.
不要从字典或从您的本国语言选择密码.
避免挑选很容易与您的计算机站点或您自己关联的单字,例如产品名称或您的小车型号.
每次挑选新的密码.
不要重新使用旧的密码.
您的系统管理员或安全管理员可以设置附加限制,例如,不允许密码长度短于10个字符或不允许重复密码.
以下表格提供安全密码和高风险密码(其他人可能很容易猜测的字)的示例:安全密码高风险密码胡说音节:aladaskgameojfuvcuejoxtyois与个人密切相关的字:您的姓名您的爱人名您的宠物名您的城市名您的车名混合字符串:492_weid$924spazu_$rags与工作相关的术语:您的公司名特殊工程您的工作组名UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum1.
3.
1获得您的初始密码典型情况是,当您知道系统已为您建立一个帐户时,您被告知是否需要一个用户密码.
如果用户密码有效,您的系统管理员通常将为您第一次注册分配一个特定的密码.
这个密码与有关您的帐户如何能够使用的其他信息,都放在系统用户授权文件(UAF)中.
不要使用其他人容易猜测的密码.
请为您建立帐户的人指定一个难以猜测的密码.
如果您不能控制给您的密码,您也许会得到一个与您的名字一样的密码.
如果这样,您注册后立即就更改密码.
(把名或姓用作密码是一种习惯,但从安全角度来看它是不合需要的.
)在建立帐户的时候,您应该被告知密码的最短长度和您是否能够挑选新密码或者系统系统是否为您生成密码.
1.
3.
2更改您的初始密码在建立您的帐户后不久便注册帐户去更改您的密码.
如果帐户建立后经过一段时间您才进行第一次注册,其他用户可能成功地注册您的帐户,获得损害系统的机会.
同样地,如果您忽视更改密码或者不能做这件事,系统依然易受攻击.
可能的损害极大地依赖于其他有效的安全措施.
有关更改密码的其他信息,请参阅1.
7节.
1.
3.
3密码限制系统检查密码的可接受性如下:自动把新密码与系统字典比较.
确保密码不是本国语言字.
维护旧密码的历史列表,将每一个新密码与该表比较,确保不重新使用密码.
实施最短的密码长度,这是系统管理员在您的UAF记录指定的.
系统拒绝在系统字典可以查找到的、曾经使用的,和比UAF中指定的最短密码长度还短的任何密码.
1.
3.
4密码类型OpenVMS操作系统识别几种密码类型:用户密码多数帐户需要.
在输入用户名后,提示输入的密码.
如果帐户需要主密码和次密码,必须输入这两个密码.
系统密码安全管理员决定需要的控制对特定终端的存取权.
通常有必要使用系统密码控制对终端的存取,以避免未授权使用,例如拨号和公用终端线路.
主密码为需要主和次密码的帐户输入的两个密码的第一个密码.
次密码为需要主和次密码的帐户输入的两个密码的第二个密码.
次密码为用户帐户提供附加级别的安全.
典型情况是,主用户不知道次密码;监督者或其他关键人物必须当面提供它.
对于某些应用,监督者也可以决定使用该帐户时保持在场.
因而,次密码帮助控制注册,而且这样UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum的动作发生在注册后.
次密码可以是耗时且不便的.
只有在需要最大安全的场合,才有必要使用次密码.
帐户需要双密码的一个例子是,跳过正常的存取控制准许紧急修补数据库.
1.
3.
5输入系统密码安全管理员会告诉您是否必须指定一个系统密码来注册一个或多个指定使用的终端.
向安全管理员请问当前的系统密码、更改频率以及当它更改后如何获得新的系统密码.
要指定系统密码,做以下几步:步骤任务1按下Enter键直到终端用识别字符响应,一般是铃声.
2键入系统密码并按下Enter键.
没有提示并且系统不显示您键入的字符.
如果您没有指定正确的系统密码,系统不通知您.
(最初,您可能认为系统出现故障,除非您知道这个终端需要系统密码.
)如果您没有接收到系统响应,就假定您输入了错误的密码并且再试.
3当您输入了正确的系统密码时,您就会接收到系统的宣告消息(如果有一个),跟随用户名:提示.
例如:MAPLE-AmemberoftheForestClusterUnauthorizedAccessisProhibitedUsername:1.
3.
6输入次密码安全管理员在建立您的帐户时决定您的帐户是否需要使用次密码.
当您的帐户需要主和次密码时,您需要两个密码来注册.
安全管理员在您的UAF指定的最小密码长度将应用于这两个密码.
如同单个密码注册,系统为整个注册过程分配有限数量的时间.
如果您不按时输入次密码,那么注册期将过期.
以下例子展示需要主和次密码的注册:WILLOW-AmemberoftheForestClusterWelcometoOpenVMSonnodeWILLOWUsername:RWOODSPassword:Enter]Password:Enter]LastinteractiveloginonFriday,11-DEC-200210:22$UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum1.
3.
7不同类型帐户的密码要求四类用户帐户可用于OpenVMS系统:密码保护的帐户,您或安全管理员会周期性地更改密码.
这种类型的帐户是最普通的.
总是需要密码的帐户,但是禁止您更改密码.
通过锁定密码(在UAF中设置LOCKPWD标记),安全管理员控制对密码的所有更改.
受限帐户限制您使用系统并且有时需要密码.
开放帐户不需要密码.
当您注册到一个公开帐户时,系统不向您提示密码,而您也不必输入一个.
您可以立即开始输入命令.
因为开放帐户允许任何人获得对系统的存取权,因此他们只使用在带最小安全需求的站点中.
1.
4读取通知信息当您从直接连接到计算机的终端注册时,OpenVMS系统显示通知性系统消息,如以下例子所示.
WILLOW-AmemberoftheForestCluster(1)UnlawfulAccessisProhibitedUsername:RWOODSPassword:您有以下断开的进程:2)终端进程名映象名VT320:RWOODS(没有)WelcometoOpenVMSonnodeWILLOW(3)LastinteractiveloginonWednesday,11-DEC-200210:20(4)Lastnon-interactiveloginonMonday,30-NOV-200217:39(5)2failuressincelastsuccessfullogin(6)Youhave1newmailmessage.
$注意以下关于例子的说明:1.
宣告消息标识节点(和,如果有关,OpenVMS簇名称).
它也可以警告未被授权的用户禁止非法存取.
系统管理员或安全管理员可以控制这个消息的外观和内容.
2.
断开进程消息通知您在上次成功注册后断开一段时间但是仍然可用的进程.
您可以选择重新连接旧的进程,回到您断开之前的状态.
只有当以下条件存在时,系统才显示断开的消息:o发生中断的终端设置为虚拟终端.
o您的终端设置为一个可以断开的终端.
o在新近的对话期中,在您注销之前断开终端到中央处理器(CPU)的连接.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum一般而言,安全管理员应该允许您重新连接,因为这种能力不会对系统安全引起特殊的问题.
然而,安全管理员可以通过更改终端设置和禁止系统上的虚拟终端来撤消这个功能.
(有关设置和重新连接虚拟终端的详情,请参阅OpenVMS系统管理员手册.
)3.
欢迎消息指出正在运行的OpenVMS操作系统的版本号和您注册的节点名称.
系统管理员可以挑选不同的消息或完全取消这个消息.
4.
最后成功交互注册消息提供最后完成的本地、拨号或远程注册的时间.
(系统不计来自其父进程是这些注册类型之一的子进程的注册.
)5.
最后成功非交互注册消息提供最后非交互(批量或网络)注册完成的时间.
6.
注册失败次数消息指出尝试注册失败的次数.
(只计数因错误密码而导致的注册失败.
)为吸引您的注意,在出现消息后有一铃声.
7.
新邮件消息指出您是否有任何未读的邮件消息.
1.
4.
1抑制消息安全管理员可以取消包括节点名和操作系统标识的宣告和欢迎消息.
因为注册过程根据不同操作系统而不同,因此没有这个消息是难以注册的.
最后注册成功和失败消息是可选的.
安全管理员可以按组允许或撤消该消息.
带中级或高级安全的站点需要显示这些消息,因为它们可以指出非法存取企图.
另外,通过展示系统正在监控注册,这些消息可以是对潜在非法用户的一种威慑.
1.
4.
2成功注册消息每次您注册时,系统重置最后成功注册的值和注册失败的次数.
如果您交互地存取您的帐户而在注册时不指定错误的密码,那么您可以不参阅最后成功非交互注册和注册失败消息.
1.
5注册类型和注册种类注册可以是交互或非交互之一.
当您交互地注册时,您要输入用户名和密码.
在非交互注册中,系统执行对您的标识和证实;不向您提示用户名和密码.
除交互和非交互注册外,OpenVMS操作系统识别不同种类的注册.
您如何注册系统确定您属于哪一种注册种类.
基于您的注册种类以及当日时间或当周日期,系统管理员控制您对系统的存取权.
1.
5.
1交互注册交互注册包括以下注册种类:本地从直接连接中央处理机的终端或从直接与中央处理机通信的终端服务器注册.
拨号注册到使用调制解调器和电话线与计算机系统建立连接的终端.
依赖于系统使用的终端,您可能最初需要执行很少的附加步骤.
站点安全管理员可以为您提供必要的细节.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum远程通过输入DCL命令SETHOST,您注册到网络上的一个节点.
例如,要存取远程节点HUBBUB,输入以下命令:$SETHOSTHUBBUB如果您对节点HUBBUB的一个帐户有存取权,您可以从本地节点注册到那个帐户.
您对节点HUBBUB上的设施有存取权,但是仍然保持与本地节点的物理的连接.
有关远程对话期的详情,请参阅1.
12.
2节.
1.
5.
2非交互注册非交互注册包括以下种类:网络注册当您开始一个在远程节点上的网络任务时,系统执行网络注册,例如显示存储在另一个节点目录上的目录内容或复制文件.
您的当前系统和远程系统两者都必须是同样网络上的节点.
在文件说明中,您标识目标节点并提供包括用于远程节点的用户名和密码的存取控制字符串.
例如,当在远程节点PARIS有一个帐户的用户GREG输入以下命令时,将发生一个网络注册:$DIRECTORYPARIS"GREG8G4FR93A"::WORK2:[PUBLIC]*.
*;*这个命令显示在磁盘WORK2上公用目录的所有文件列表.
它也展现密码8G4FR93A.
一个执行同样任务的更加安全的方法是使用节点PARIS的一个代理帐户.
有关代理注册的例子,请参阅10.
5.
3节.
批量注册s当您提交的批量作业运行时,系统执行批量注册.
在提交作业时确定对建立作业的授权.
当系统准备执行作业时,作业控制程序建立一个注册到您的帐户的非交互进程.
当作业注册时不需要密码.
1.
6注册失败因任何原因注册可能失败.
您的密码之一可能已更改或者您的帐户可能已过期.
您也许尝试通过网络或从调制解调器注册,但是没有被授权这样做.
下表概述注册失败的普通原因:失败指示原因没有终端的响应终端有缺陷,终端需要系统密码,或者终端没有通电.
没有任何终端的响应系统已关闭.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum当您输入系统密码时没有终端的响应系统密码已更改.
系统消息:"用户授权失败"在您的用户名或密码中键入出错.
帐户或密码已过期.
"没有授权从这个来源注册"禁止特定种类的注册(本地、拨号、远程、交互、批量或网络).
"没有授权在这个时间注册"您无权在当周的这一天或当日的这一小时注册.
"用户授权失败"(和发生未知的用户失败)在这个终端上发现使用您的用户名进行非法存取企图,而系统临时撤消在该终端使用您的用户名进行任何注册.
以下各节更加详细地描述注册失败的原因.
1.
6.
1需要系统密码的终端如果尝试使用的终端需要系统密码而您却不知道,那么您就不能注册.
所有尝试将导致注册失败,直到您输入正确的系统密码.
如果您知道系统密码,执行在1.
3.
5节描述的步骤.
如果尝试失败,可能是已更改了系统密码.
如果您不知道系统密码且认为难以知道,设法在另一个终端注册或请求新的系统密码.
1.
6.
2注册种类限制如果您尝试一种在您的UAF记录中禁止的注册,您将注册失败.
例如,安全管理员可以限制您不能从网络注册.
如果您尝试网络注册,您就会接收到一个消息告诉您没有授权从这个来源注册.
安全管理员可以限制您的注册包括或排除以下任何种类的注册:本地、远程、拨号、批量或网络.
1.
6.
3轮班限制注册困难的另一个原因是没有观察您的轮班限制.
系统管理员或安全管理员可以基于当日时间或当周日期控制对系统的存取权.
这些限制强加在各种注册上.
安全管理员可以把同样的工作时间限制应用在所有种类的注册上或者为不同的注册种类挑选放置不同的限制.
如果您尝试在所用种类注册禁止的时间内注册,将注册失败.
系统会通报您没有授权在这个时间注册.
1.
6.
4轮班限制期间的批量作业当轮班限制应用于批量作业时,如果提交预定运行的作业已超出准许工作时间,则不会运行.
系统不会在您的下一个可用准许的工作时间自动重新提交这样的作业.
同样地,如果您已开始任何一种作业并尝试在准许时段之外运行它,那么当到达已分配的轮班时间末端时,作业控制程序会异常结束非完成的作业.
这个作业的终止行为将应用于所有作业.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum1.
6.
5拨号注册失败安全管理员可以控制分配给您的在拨号注册时在自动断开连接之前输入正确密码的机会次数.
如果注册失败且想继续尝试,按下Enter键然后再试.
您可以一直这么做,直到成功或者达到限制.
如果失去连接,可以重新拨号存取线路并且开始再次.
限制拨号注册失败次数的典型原因是阻碍未被授权的用户尝试通过反复试验获得密码.
因为拨号线路,他们已经有了匿名的优势.
当然,限制每次拨号注册的尝试次数不能停止这种非法存取企图.
作恶者只需要重新拨号就可开始另一个注册.
1.
6.
6回避非法侵入过程如果任何人在同样终端使用您的用户名尝试注册失败了很多次,系统可以响应为好象一个非法存取企图正在进行.
也就是说,系统推断出有人正在尝试使用您的用户名非法获得对系统的存取权.
在安全管理员的判断下,回避非法侵入措施可以作用于系统的所有用户.
安全管理员控制允许多少次密码尝试,以及多长时间.
一旦触发回避非法侵入策略,您就不能在定义的时间间隔内注册到这个终端,即使您使用了正确的密码.
安全管理员可以告诉您在重新尝试注册之前必须等待多久,或者您可以到另一个终端尝试注册.
如果您推测回避非法侵入正在阻止您注册,而您又没有亲自经历过任何注册失败,那么立即联系您的安全管理员.
一起尝试另一个注册,并检查展现自从最后注册以来的注册失败次数的消息,确定或否认您对非法存取企图的猜测.
(如果您的系统通常不显示注册消息,那么安全管理员可以使用Authorize公用程序(AUTHORIZE)来检查您的UAF记录中的数据.
)在提示动作下,安全管理员可以找出某人正在尝试在另一个终端注册.
1.
7更改密码经常更改密码可提高系统安全.
要更改密码,输入DCL命令SETPASSWORD.
当更改密码时,系统管理员可以允许您选择自己的密码,或者使用自动密码产生器.
如果选择自己的密码,注意密码必须符合系统在长度和可接受性方面的限制(参阅1.
3.
3节).
您可以在给定时间内多次更改密码,次数没有约束.
以下例子展示太短的密码选择:$SETPASSWORDOldpassword:Newpassword:%SET-F-INVPWDLEN,passwordlengthmustbebetween12and32characters;passwordnotchangedUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum1.
7.
1选择您自己的密码如果系统管理员不需要使用自动密码产生器,那么SETPASSWORD命令会提示您输入新密码.
然后提示您再次输入新密码校验,如下:SETPASSWORDNewpassword:Verification:如果您两次不能输入同样的新密码,就不能更改密码.
如果您成功地完成这两步,没有通知.
这个命令更改您的密码并使您进入DCL提示.
即使安全管理员可以不需要密码产生器,还是极力鼓励您使用它来提高系统安全.
1.
7.
2使用产生的密码如果系统安全管理员决定必须让系统为您自动产生密码,那么当您输入DCL命令SETPASSWORD时,系统就会提供一列密码选择.
(如果系统没有设置使用自动产生的密码,通过指定SETPASSWORD命令带/GENERATE限定词,您可以使用它们.
)类似本国语言字的字符序列使它容易记住,但是容易被外人猜测.
因为系统产生的密码长度不同,因此难以猜测.
注意密码产生器使用基本音节规则产生字,而且不使用任何真实语言知识.
结果,它可能无意地产生讨厌的字.
在以下例子中,系统自动产生一列包括随机字符序列的密码.
在以下例子中,他们的UAF记录把用户的最小密码长度设置为8个字符.
$SETPASSWORDOldpassword:(1)reankunarean-ku-na(2)cigtawdpaucig-tawd-pauadehecuna-de-he-cunceebatoraicee-ba-to-raiarhoajabadar-hoa-ja-badChooseapasswordfromthislist,orpressEntertogetanewlist(3)Newpassword:(4)Verification:(5)$(6)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum注意以下关于这个例子的说明:1.
用户正确地指定旧密码并按下Enter键.
2.
系统每次响应列出5个密码选择,长度范围从8至10个字符.
通常,密码最容易发音也就最容易记住;因此,它是最好选择.
在OpenVMSVAX系统中,相同字分割成音节的表示显示在每个密码选择的右边(如这里所示).
3.
系统通知用户通过按下Enter键响应新密码提示,可以请求新的列表.
4.
用户输入第一组5个可能密码之一并按下Enter键.
5.
系统识别出这个密码是由自动密码产生器提供并响应出校验提示.
用户再次输入新密码并按下Enter键.
6.
系统更改密码并以DCL提示响应.
1.
7.
3产生的密码:缺点使用产生的密码有两个缺点:您可能记不住您的密码选择.
然而,如果您不喜欢列表中的所有密码选择,或者认为没有一个是容易记住的,您总是可以请求另一个列表.
有从命令产生的显示中暴露密码选择的潜在危险.
要保护您的帐户,私下更改您的密码.
如果您在视频终端上执行更改,就在完成该命令后清除屏幕上的密码选择显示.
如果您使用打印终端,恰当地处理所有硬拷贝输出.
如果以后您认识到不能按这些方法保护密码,就立即更改密码.
依赖于站点策略或您自己的判断,您的帐户已暴露多时,您应该通知安全管理员可能已通过您的帐户发生安全破坏.
1.
7.
4更改次密码要更改次密码,使用DCL命令SETPASSWORD/SECONDARY.
提示您指定旧的次密码和新的次密码,正象更改主密码的过程.
要除去次密码,则当提示您输入新密码和校验时按下Enter键.
您可以独立地更改主和次密码,但是两者都服从同样的更改频率,因为它们共享同样的密码使用期.
1.
7.
5注册时更改密码即使当前密码还没有过期,您也可以更改密码,方法是在注册系统时在用户名之后包括/NEW_PASSWORD限定词.
当您在用户名之后输入/NEW_PASSWORD限定词时,系统提示您在注册后立即设置新密码.
以下例子展示注册时如何更改密码:WILLOW-AmemberoftheForestClusterUsername:RWOODS/NEW_PASSWORDPassword:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumWelcometoOpenVMSonnodeWILLOWLastinteractiveloginonTuesday,7-NOV-200210:20Lastnon-interactiveloginonMonday,6-NOV-200214:20Yourpasswordhasexpired;youmustsetanewpasswordtologinNewpassword:Verification:1.
8密码和帐户满期时间系统管理员可以设置您的帐户使您的密码或帐户自己在特定的日期和时间自动过期.
通过强制您定期更改密码,密码满期时间能够提高系统安全.
帐户满期时间有助于确保帐户只在需要的时候可用.
1.
8.
1过期的密码当接近密码的满期时间时,您会接收到一条预警消息.
该消息第一次出现在满期日期的前5天,并且在以后的每次注册出现.
该消息立即出现在新邮件消息的下面,并且在终端发出报警声音以吸引您的注意.
消息指出密码将满期,如下所示:WARNING--YourpasswordexpiresonThursday11-DEC-200215:00如果您在它满期之前更改密码,那么注册时您会接收到以下消息:Yourpasswordhasexpired;youmustsetanewpasswordtologinNewpassword:系统提示您输入新密码,或者如果允许自动产生密码,就请您从那些列表中选择一个新密码.
通过按下Ctrl/Y,您可以异常结束注册过程.
在下一次注册时,系统会再次提示您更改密码.
1.
8.
2使用次密码如果次密码有效(参阅节1.
3.
4),次密码与主密码同时满期.
提示您更改这两个密码.
如果您更改主密码并且在更改次密码之前按下Ctrl/Y,注册将失败.
系统不记录密码更改.
1.
8.
3更改密码失败如果系统管理员决定不强制您在注册时更改您的满期密码,那么当您在密码满期后注册,您就会接收到一个最后警告,如下所示:ARNING--Yourpasswordhasexpired;updateimmediatelywithSETPASSWORD!
到了这一步,如果您不更改密码或者如果因系统失败而不能做这件事,您将不能再次注册.
要重新获得存取权,请教您的系统管理员.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum1.
8.
4满期的帐户如果您因特定目的而需要只在有限时间内使用的帐户,那么为您建立帐户的人可以指定一段时间,之后帐户将失效.
例如,大学里的学生帐户是典型情况,每次授权使用一个学期.
满期的帐户自动被拒绝注册.
在帐户满期日期之前您不会接收到预警消息,因而在帐户满期前知道是重要的.
帐户满期保存在UAF记录中,具有SYSPRV特权的用户或等同用户(通常是系统管理员或安全管理员)只有使用OpenVMS授权公用程序(AUTHORIZE)才可以存取和显示它.
当帐户满期时,您下次注册就会接收到一条授权失败消息.
如果需要延期,可遵循站点的定义过程.
1.
9密码保护指南非法系统存取包括拥有者经常记录自己的正确密码,以致于被其他人暗中发现.
这是至关重要的,您不要把密码暴露给任何人.
通过留意以下规则,您可以最好地保护密码:选择适当长的密码,使之不易猜测.
避免使用出现在本国语言字典中的字.
考虑在密码中包括数字.
另外,让系统为您自动产生密码.
从不写下您的密码.
从不把您的密码给另一个用户.
如果另一个用户获得您的密码,就立即更改它.
不要在任何文件中包括您的密码,也包括电子邮件消息.
(如果其他任何人展现密码给您,就迅速地删除这类信息.
)与实际密码同时出现的字符串将使别人很容易在文件中查找到您的密码.
例如,一个引号跟随两个冒号("::)总是出现在存取控制字符串的用户名和密码之后.
尝试侵入系统的人就可能通过搜索没有适当保护文件中的这个字符串来获得您的密码.
可能暴露密码的另一个方法是在文本文件中使用字"密码",例如:MypasswordisGOBBLEDYGOOK.
不要在不同系统中为帐户使用同样的密码.
未被授权用户可以在您有帐户的每个系统上试一个密码.
暴露密码的第一个帐户可能拥有很少的重要信息,但是另一个帐户可能出现更多信息或更多特权,最后导致很大的安全破坏.
在您注册已经开机的终端之前,按下Break键调用安全终端服务器特性(如果允许).
当您在公用终端机房工作时,这样做特别有意义.
每3至6个月更改密码一次.
Compaq警告使用共享的密码.
如果共享密码,就每月更改一次.
如果您有任何理由推测密码已被他人发现,就立即更改密码.
把这样的事件报告给安全管理员.
注销您要离开的终端.
未被授权的用户可能怀有恶意地使用终端,例如,载入密码窃取程序.
例行公事地检查您的最后注册消息.
警惕不平常的注册失败计数.
如果注册时您观察到任何不平常的失败,立即更改您的密码并通知安全管理员.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum1.
10认识系统响应系统响应您以一个或多个以下方法输入的命令:通过执行命令.
通常,当系统提示输入(按照默认,美元符)时,您就知道命令已成功执行.
通过执行命令并通知一条它做完什么的消息.
通过通知出错,如果命令执行不成功.
通过提供您没有提供的值(默认值).
1.
10.
1默认动作默认值是当您没有指定时操作系统提供的值.
例如,如果您没有为PRINT命令指定份数限定词,系统就使用默认值1.
操作系统在几个方面提供默认值,包括命令限定词和参数.
操作系统特定命令使用的默认值描述在OpenVMSDCL字典的每个命令条目中.
1.
10.
2通知性系统消息系统响应某些命令时,会显示关于它已做完了什么的系统消息.
例如,当您使用PRINT命令时,系统会显示分配给打印作业的作业标识号并展示该作业进入的打印队列名称.
PRINTMYFILE.
LISJobMYFILE(queueSCALE_PRINT,entry210)startedonSYS$PRINT不是所有命令显示通知信息.
当DCL提示输入时,通常指出命令成功完成.
不成功完成总是通过一个或多个出错消息指出.
1.
10.
3系统出错消息如果您错误地输入命令,系统显示一条系统消息并提示您纠正命令串,如以下例子所示:$CAPY)%DCL-W-IVVERB,unrecognizedcommandverb-checkvalidityandspelling\CAPY\$3部分代码的格式是:DCL-W-IVVERB在这里:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumDCL输入出错的OpenVMS设施或组件名称.
在这个例子中,该消息来自DCL,即默认的命令解释程序.
W指出警告的严重级.
其它严重级包括S(成功)、I(信息)、E(出错)和F(致命或严重出错).
IVVERB消息类型.
通过OpenVMS系统消息文档的助忆符IVVERB或通过使用描述在节1.
11.
3的求助消息公用程序(MSGHLP)可以标识消息.
在命令执行时,如果系统不能执行请求的功能,您也可以接收到系统出错消息.
例如,如果您正确地键入PRINT命令但指定的文件不存在,PRINT命令就通知您类似下面的出错消息:$PRINTNOFILE.
DAT%PRINT-E-OPENIN,erroropeningCLASS1:[MAYMON]NOFILE.
DAT;asinput-RMS-E-FNF,filenotfound$其第一条消息来自PRINT命令.
它告诉您不能打开指定的文件.
第二条消息指出第一条消息的原因;也就是说,文件不能查找到.
RMS代表OpenVMS文件处理软件,即记录管理服务;与文件处理相关的出错消息是OpenVMSRMS的一般消息.
1.
10.
4检查当前进程如果您推测您的进程不在做您认为它应该做的事情,按下Ctrl/T.
Ctrl/T显示一行关于当前进程的统计信息.
统计信息包括节点和用户名、当前时间、当前进程、中央处理器(CPU)使用、页故障的数目、I/O活动级和按CPU指定的页数列表的存储器使用.
当您在交互终端对话期间按下Ctrl/T时,它即刻中断当前命令、命令过程或映象来显示统计信息.
虽然Ctrl/T打乱了屏幕上的显示字符,但它不影响任何过程或编辑对话期.
例如,如果节点GREEN上名为MCCARTHY的用户在使用EVE编辑程序时按下Ctrl/T,以下一行消息将显示在EVE消息窗口中:GREEN::MCCARTHY13:45:02EVECPU=00:00:03.
33PF=778IO=295MEM=315要刷新屏幕,可按下Ctrl/W.
按照默认,Ctrl/T被撤消.
如果您知道您的系统正在运行,而Ctrl/T不显示统计信息,那么您可以使用DCL命令SETCONTROL=T允许Ctrl/T.
在DCL级(在美元符($)提示下)输入这个命令,然后再次按下Ctrl/T.
Ctrl/T将在您的进程期间保持有效,除非从一个程序或命令(例如SETNOCONTROL=T)撤消它.
注意,必须把终端设置为BROADCAST模式,才能使Ctrl/T在屏幕上显示.
BROADCAST模式控制是否允许接收广播信息(例如MAIL和REPLY发出的消息).
要把终端设置为BROADCAST模式,可在DCL提示下输入DCL命令SETTERMINAL/BROADCAST.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum1.
11获得关于系统的求助信息当您注册到操作系统时,通过使用HELP命令,您可以获得关于如何使用系统和可用命令的信息.
通过按如同节1.
11.
3所示的方法输入HELP/MESSAGE命令,您也可以获得系统消息的求助.
1.
11.
1使用联机求助使用以下过程可获得有关OpenVMS命令和公用程序的求助:步骤任务1在DCL提示下输入HELP并按下Enter.
HELP显示一列题目和题目提示.
2要参阅其中一个题目的信息,在该提示下键入题目名并按下Enter.
3如果您要参阅其中一个子题目的信息,在该提示下键入子题目名并按下Enter.
HELP显示关于那个子题目的信息.
4要重新显示SHOWUSERS题目和子题目列表,在子题目提示下输入一个问号().
如果您要读取列表的所有子题目,输入一个星号(*).
5如果您要参阅另一个题目的信息,按下Enter.
HELP显示题目提示.
6要退出HELP,按下Enter键直到您进入DCL提示.
以下例子展示命令,寻找关于SHOWUSERS命令的求助:$HELPHELP.
.
(HELPmessagetextandsubtopics).
TopicSHOWUSERSSHOWUSERSUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum显示系统上交互、子进程和批量用户的用户名和节点名(在VAXcluster环境中).
格式:SHOWUSERS[username]Additionalinformationavailable:PARAMETERQUALIFIER/BATCH/CLUSTER/FULL/INTERACTIVE/NETWORK/NODE/OUTPUT/SUBPROCESSExamplesSHOWUSERS子题目EXAMPLESSHOWUSERSExamples.
.
(SHOWUSERSExamplesmessagetextandsubtopics,ifany).
SHOWUSERSSubtopicSHOWSubtopicTopic$1.
11.
2获得关于特定命令的求助如果您知道需要其信息的命令,输入HELP和命令名.
例如,要获得关于SHOWUSERS命令的求助,可输入以下命令:$HELPSHOWUSERS如果您需要求助,但不知指定什么命令或系统题目,输入命令HELP并带字HINTS作为参数.
每个在HINTS文本列出的任务名与一列相关的命令名和系统信息题目关联.
OpenVMSDCL字典包含HELP命令的其它信息.
1.
11.
3获得关于系统消息的求助UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum使用HelpMessage公用程序(MSGHLP)可获得系统消息的联机求助.
要显示上次命令完成的信息,键入:$HELP/MESSAGE通过包括消息标识符或消息文本中的字,您也可以显示关于特定消息的信息.
例如:$HELP/MESSAGEBADACP通过输入消息状态码,也可以存取消息和它的描述.
例如:$HELP/MESSAGE/STATUS=%X00038090如果您不知道消息状态码,则通过输入命令SHOWSYMBOL跟随$STATUS全局符号,您也可以观看它.
例如:$SHOWSYMBOL$STATUS$STATUS=="%X00038090"HelpMessage公用程序允许您用自己的消息更新消息数据库,或添加注释到现有的消息描述.
您也可以从消息数据库中抽取一部分消息,来建立和打印您自己的用户化消息文档.
有关如何使用HelpMessage公用程序的细节,请参阅OpenVMSSystemMessages:CompanionGuideforHelpMessageUsers.
1.
12注销退出系统当您完成使用系统,总是要注销.
这样可防止未被授权的用户存取您的帐户和系统.
这是对系统资源的明智使用方法;您不再需要的资源可用于其他用户.
要注销,可在DCL提示下输入LOGOUT.
例如:$LOGOUT系统显示类似于以下消息的消息,确认您已从系统注销:$LOGOUTHARRIS注销于11-DEC-200212:42:48.
12UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum只有当您是在DCL提示($)下,您才可以从系统注销.
当您正在编译或执行程序、使用文本编辑程序(例如EDT或EVE)或运行公用程序(例如Mail)时,您就不能输入LOGOUT命令.
您首先必须退出程序、编辑程序或公用程序.
当系统显示DCL提示时,您就可以注销.
1.
12.
1获得计帐信息要找出您花费了多少时间在终端上(共用时间)、您使用了多少计算机时间(收费的CPU时间)和其它计帐信息,可在DCL提示下输入LOGOUT/FULL.
例如:$LOGOUT/FULL系统显示类似于以下的信息:SIMPSONloggedoutat11-DEC-200212:42:48.
12Accountinginformation:BufferedI/Ocount:8005Peakworkingsetsize:212DirectI/Ocount:504Peakvirtualsize:770Pagefaults:1476Mountedvolumes:0ChargedCPUtime:000:00:50.
01Elapsedtime:002:27:43.
061.
12.
2结束远程对话期您可以以两种方法结束远程对话期:使用远程系统的注销过程(例如,在OpenVMS系统中,使用LOGOUT命令).
两次按下Ctrl/Y可获得主机系统的提示,请问您是否要异常结束远程对话期.
如果您要异常结束远程对话期,可回答YES(Y).
这个方法一直能够工作,而不管运行在远程节点上的系统类型.
当您结束远程对话期时,系统显示消息"%REM-S-END,控制进入节点NODENAME::",并且把您带入您建立远程节点连接的系统进程.
1.
12.
3失去网络连接如果失去到远程系统的TCP/IP网络连接,TCP/IP使用最快传送协议,该协议的网络技术特征是尝试传送数据而如果出错,例如线路失败,也不设法恢复.
如果失去一个到远程系统的DECnet网络连接,DECnet将尝试重新建立通信来重新传输数据.
如果DECnet不能在预定的超时期间内重新建立通信,将终止对远程系统的连接,并且系统显示消息"路径失去伙伴".
1.
13不危及系统安全地注销UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum注销退出对话期可保存系统资源并和保护您的文件.
离开保持联机的终端是非法存取的最大来源.
当您离开联机的终端而且让办公室保持打开,您已经有效地给出密码和特权,而使您的文件和同组其他成员的文件处于无保护的状态.
任何用户可以通过您的帐户轻易、快速地转移所有可存取的文件.
一个恶意人员能够重新命名和删除您的文件和任何您有写存取权的其他文件.
如果您有特殊的特权,特别是对文件或所有种类的特权,恶意用户可以进行极大的损害.
如果您在一个系统上工作,该系统不会在一段不活动时间后自动锁定,那么当您离开办公室时应该注销,即使离开很短时间.
如果您已执行远程注册,您必须从每个节点注销.
当您注销时,安全管理员可能请求您断开拨号线路的连接.
断开对拨号线路的连接:可防止其他人利用已打开的存取线路.
如果某人要存取该线路,他必须知道存取号码并且必须亲自重新拨号.
如果您使用的拨号线路处于公共场所或者有人要在您之后可以使用终端,这就特别重要.
通过减少需要的拨号线路数,可节省资源.
1.
14网络当计算机系统链接在一起时,它们就组成了一个网络.
在OpenVMS网络中的操作系统能够互相通信并共享信息和资源.
网络上的每个系统被称为一个网络节点或主机,并且通过唯一名称或地址标识.
主机和节点可交换使用,意指一个连接到网络的系统.
使用OpenVMS,您可选择网络协议.
您可以在单个网络内为OpenVMS产品或Compaq'sDECnet产品使用CompaqTCP/IP服务,或者在一个存在这两个产品之一的环境中使用该服务.
Compaq为OpenVMS制定的主要网络策略是TCP/IP,它是工业标准的网络协议对.
1.
14.
1网络节点当您注册到一个网络节点,您可以与网络上的其他节点进行通信.
您注册的节点被称为本地节点;网络上的其他节点被称为远程节点.
如果您对远程节点的帐户有存取权,就可以从本地节点注册到那个帐户并执行在那个节点上的任务,同时保持对本地节点的连接.
1.
5.
2节描述如何注册到远程节点.
在本手册的适当章节描述您可以在远程节点执行的附加任务.
1.
14.
2在网络上执行程序因为TCP/IP和DECnet软件提供支持,程序可以越过网络执行,就象它们在本地执行.
因为网络软件被集成到操作系统内,因此很容易编写存取远程文件的程序.
要在应用程序内存取远程文件,您只需要在文件说明中包括远程节点的名称和任何需要的存取控制信息.
任务到任务通信,所有TCP/IP或DECnet实现的一个共同特性,允许两个运行在相同或不同操作系统上应用程序互相通信,而不管使用的具体程序设计语言.
网络应用的例子是分布式处理应用、事务处理应用和提供连接服务器的应用.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum注意在本手册的远程操作例子中,代理帐户允许用户在远程系统执行操作.
代理帐户是用户可以存取远程系统的一个方法.
有关存取远程系统的附加方法,请参阅OpenVMS系统管理员手册.
第2章使用DCL与系统进行人机对话DIGITAL命令语言(DCL)是一组类英语指令,告诉操作系统执行特定的操作.
DCL为您提供200多个命令和函数,使用它们可与操作系统进行沟通以完成计算任务.
DCL命令能让您做以下事情:获得系统信息处理文件处理磁盘、磁带和其它设备修改工作环境开发和执行程序提供安全和确保有效地使用资源下表列出用来执行一些普通计算任务的DCL命令:命令任务COPY复制指定文件COPY/FTP在TCP/IP网络主机之间传输文件CREATE建立文件或目录DELETE删除指定文件并从目录除去DIRECTORY显示目录内容(列表文件)EDIT观看和更改文本文件的内容LOGOUT结束对话期PRINT把指定文件发送给打印机打印RENAME更改指定文件的名称或位置SET控制您如何在屏幕上观看系统SHOW显示系统状态TYPE在屏幕上显示指定文件的内容在这章中,您将学习如何使用DIGITAL命令语言.
这章包括的信息有:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum输入DCL命令DCL命令行输入DCL命令的规则输入参数输入限定词输入日期和时间值重新调用命令编辑DCL命令行定义终端键组合键本地环境的差别注意,本手册只覆盖标准的DCL命令.
站点的系统管理员可以用户化您的系统,以支持本地环境.
他们可以决定:使用不同的命令语言解释程序更改一些标准DCL命令的默认动作撤消一些DCL命令改变一些系统默认,例如DCL提示配置带扩展文件说明的环境有关在这章中论述的命令、限定词和参数的附加信息,请参阅OpenVMSDCL字典和联机求助.
2.
1输入命令要输入DCL命令,在DCL提示($)下键入命令并按下Enter键.
DCL通常不是大小写敏感的;您可以以任意一个大写或小写字母输入命令.
1在以下例子中,输入DCL命令SHOWTIME如下:$SHOWTIME系统响应时显示当前日期和时间并返回DCL提示指出它准备接受另一个命令:11-DEC-200215:41:43$2.
1.
1使用模式您可以按以下两个模式使用DCL:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum交互在交互模式下,您从终端输入命令.
在可以输入另一个命令之前,前一个命令必须完成执行.
批量在批量模式下,系统建立另一个进程来根据您的意图执行命令.
批量作业是一个命令过程或程序,它作为一个独立用户进程提交给操作系统.
在您提交命令过程用于批量执行后,您可以继续交互地使用您的终端.
批量作业和网络进程以批量模式使用DCL.
关于进程的更多信息,请参阅第16章.
2.
1.
2DCL命令类型当您输入DCL命令时,DCL解释程序读取和翻译它.
命令解释程序响应命令的方法由输入命令的类型确定.
有3种DCL命令类型,如下所示:内设命令这些命令内设在DCL解释程序中,并且在内部执行.
调用程序的命令DCL调用另一个程序来执行命令,而不是在内部执行它.
调用执行命令的程序被称为命令映象.
这个命令映象可以是交互程序、公用程序(例如Mail)或非交互程序(例如COPY).
外部命令执行映象的符号被称为外部命令.
外部命令执行一个映象,其名称不被命令解释程序识别为一个DCL命令.
有关符号的完整信息,请参阅第12章.
注意1有关大小写敏感的详情,请参阅第5章.
2.
2DCL命令行DCL,象任何语言一样,有它自己的词汇和使用规则.
DCL包括字(词汇)和词序(语法或格式).
以下几节描述这两个元素,并解释如何构造有效的DCL命令.
以下例子展示DCL命令行的一般格式和组成部分:$PRINT/COPIES=5GROCERY.
LIS[Enter](1)(2)(3)(4)(5)(6)下表描述DCL命令行的每个元素:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum1.
DCL提示美元符($)是默认的DCL提示.
当您交互地使用DCL时,DCL准备好接受命令就显示提示.
2.
DCL命令DCL命令指定命令的名称.
命令可以是内设命令、调用程序的命令或外部命令.
在这个例子中,DCL命令是PRINT.
3.
限定词限定词修改命令的动作.
一些限定词修改整个命令,而其它限定词可以修改特定的命令参数.
一些限定词可以接受值.
限定词总是前面加上斜杠(/).
在这个例子中,限定词/COPIES.
4.
值值修改限定词,并且经常前面加上一个等号(=).
值可以是文件说明、字符串、数或DCL关键字.
关键字是为某些指定格式使用的保留字.
在这个例子中,值是5(代表5个副本).
5.
参数参数指定命令动作的对象.
在命令中,您必须按指定次序安置参数.
参数值的例子包括文件说明、队列名和逻辑名.
6.
Enter键Enter键结束DCL命令行,并通知系统命令已准备就绪、等待处理.
以下项目也可以使用在DCL命令行:标号标号标识命令过程中的行.
只能在命令过程中使用标号,详细描述在第13章和第14章.
关键字关键字是为某些指定格式使用而定义的字.
您必须正确地使用关键字,遵守指定DCL命令描述的规则.
例如,system、owner、group和world是DCL关键字,用于SETSECURITY命令的/PROTECTION限定词.
(DCL关键字也可以有值.
)通配符通配符是星号(*)、百分号(%)、省略号(.
.
.
)和连字号(-).
它们可以使用在或代替文件说明中的文件名、文件类型目录名或版本号,指出在给定字段表示所有.
关于使用通配符文件和目录的信息,请参阅第3章,第4章和第5章.
2.
2.
1语法正象口语依赖词序表达含意,DCL需要您在命令行中按特定的词序或格式放置正确的元素.
以下是语法或格式的两个例子,用于典型的DCL命令:command/qualifier=value=keywordcommandparameter/qualifierUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum当您输入DCL命令时,一些参数是需要的;它们必须在命令行中输入.
如果您不输入,系统就会提示您提供缺失的信息.
一行开始于下划线(_),意味着系统正在等待您的响应.
当您被提示可选参数时,按下Enter键省略它.
在任何提示中,在您输入需要的参数后,您可以输入一个或多个剩余的参数和任何附加限定词.
注意,您必须把任何包含斜杠(/)或at符号(@)的参数括入引号("")内.
在以下例子中,TYPE命令需要文件说明.
因为文件说明是TYPE命令需要的参数,如果您不输入一个,系统就请求它.
$TYPE_File:WATER.
TXT2.
2.
2取消命令如果在命令提示后您按下Ctrl/Z,DCL就忽略该命令并重新显示DCL提示.
2.
2.
3使用默认值一些默认调用的项目不需要在命令行中指定.
当DCL按照默认执行操作时,它为命令分配某些值或执行与这个命令关联的某些功能,即使您在输入命令时没有明确地指定那些值或功能.
一般而言,这些值和功能是典型的或者是用户期望的.
DCL在几个方面提供默认值,包括命令参数和限定词.
对于参数默认,请参阅本手册描述特定DCL命令的章节.
限定词默认描述在2.
5节.
对于PRINT命令,如果不用限定词指定份数,DCL使用默认值1.
在以下例子中,通过在PRINT命令行中包括/COPIES限定词,取代默认并打印文件的多个拷贝:$PRINT/COPIES=4MYFILE.
TXT2.
2.
4输入多行命令如果您输入一条比一行要长的命令,那么通过下面的过程,您可以继续命令到下一行:步骤任务1用连字号(-)结束命令行并按下Enter键.
系统显示一个下划线(_)跟随DCL提示($).
2在这个提示下输入命令行的其余部分.
开始于下划线的行意味着系统正在等待您的响应.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum注意以下几点:您必须在命令名、参数、等等之间包括适当的空格.
在连字号后不添加空格地按下Enter.
对输入命令的连续行数没有约束,只要不超过1024个字符限制.
您也可以不指定连字号输入长命令行;系统会自动绕接文本到下一行.
然而,使用连字号分开命令行的不同部分可以使命令行更具可读性.
以下例子展示如何输入多行命令:$COPY/LOGFORMAT.
TXT,FIGURE.
TXT,ARTWORK.
TXT-_$SAVE.
TXT您可以使用DCL命令PIPE在单个DCL命令中建立复杂的命令处理语句.
例如,在相同的DCL命令行中,您可以执行一个或多个以下操作:流水线(一连串命令)输入/输出重定向多个和条件命令执行后台处理有关详情,请参阅14.
20节和OpenVMSDCLDictionary:N--Z对PIPE命令的描述.
2.
3输入DCL命令的规则当输入DCL命令时,应用以下规则.
关于在DCL命令中使用扩展文件名的信息,请参阅第5章.
使用任何大写和小写字母的混合.
DCL解释程序把小写字母翻译成大写字母.
在参数和限定词值中,大写字母和小写字母字符是等价的,除非括入引号("")内.
至少使用一个空白空格或制表符把命令名和第一个参数分开.
至少使用一个空白空格或制表符把每个附加参数和上一个参数或限定词分开.
每个限定词开始于一个斜杠(/).
斜杠用作分隔符,在前面不需要加上空白空格或制表符.
如果参数或限定词值包括空白空格或制表符,把参数或限定词值括入引号内.
在DCL命令行中,您不能指定空字符(),即使您把空字符括入引号内.
在每个命令行中,包括的元素(参数、限定词和限定词值)个数不能超过127.
在命令中的每个元素必须不超过255个字符.
整个命令在所有符号1和词法函数2被转换为值后的长度必须不超过1024个字符.
您可以缩写命令,但要求缩写名称必须在系统已定义的命令中保持唯一.
DCL只使用前4个字符判断唯一性.
以下命令是相同的:$PRIN/COPI=2FORMAL_ART.
TXT$PRINT/COPIES=2FORMAL_ART.
TXTUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum为了更加清楚以及确保命令过程的向上兼容性,不要在命令过程中缩写命令.
关于在命令过程中使用命令的更多信息,请参阅第13章和第14章.
注意1您使用符号,描述在第12章,可按缩写方式传递信息给系统.
2词法函数,描述在第15章,可获得系统的信息.
2.
4输入参数文件说明是最普通的参数类型.
DCL命令可以接受输入文件说明(命令可以读取的文件)和输出文件说明(命令要建立的文件).
当在命令行中指定参数时应用以下规则:在命令描述中的方括号([])指出任选的项目.
例如,在以下命令中,您不必输入文件说明:DIRECTORY[file-spec]在命令描述中,没有括入方括号的任何东西是需要的.
例如,在以下命令中,您必须输入设备名:SHOWPRINTERdevice-name一般而言,在输出文件参数之前有输入文件参数.
参数可以是一个项目或一串项目.
如果您输入一串项目,用逗号(,)或加号(+)分开项目.
在逗号或加号之前或之后可以有任何数目的空格或制表符.
注意,一些命令把加号用作连接符,而不是分隔符.
例子以下例子展示如何把输入文件LISTS.
TXT复制到输出文件FORMAT.
TXT:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$COPYLISTS.
TXTFORMAT.
TXT以下例子的命令行展示您如何输入一列文件说明作为参数:DELETEfile-spec[,.
.
.
]以下例子展示如何指定一列参数.
在这里,三个文件被复制到第四个文件.
三个文件说明,PLUTO.
TXT、SATURN.
TXT和EARTH.
TXT,组成第一个参数.
PLANETS.
TXT是第二个参数.
注意,在PLUTO.
TXT、SATURN.
TXT和EARTH.
TXT文件说明之间没有空格(虽然可以插入空格).
$COPYPLUTO.
TXT,SATURN.
TXT,EARTH.
TXTPLANETS.
TXT2.
5输入限定词有三类限定词:命令定位参数您可以缩写任何限定词名称,只要缩写名在同样命令的所有限定词名称中是唯一的.
然而,要确保您的命令过程是向上兼容的,不要在命令过程中缩写命令和限定词.
命令有默认限定词;您不必指定限定词,除非它不同于命令默认.
以下章节描述限定词的类型和限定词默认.
OpenVMSDCLDictionary包含特定命令的默认信息.
2.
5.
1命令限定词命令限定词修改命令,并且可以出现在命令行的任何地方.
然而,把限定词放在命令名后面是个好习惯.
如果您指定多个限定词,您应该把一个命令限定词与其他命令限定词都放在命令名的后面.
在以下例子中,/QUEUE是一个命令限定词.
文件SATURN.
TXT和EARTH.
TXT到打印队列LN03_PRINT中排队:$PRINT/QUEUE=LN03_PRINTSATURN.
TXT,EARTH.
TXT2.
5.
2定位限定词定位限定词可以修改命令或参数,并且依赖于它在命令串中的位置而有不同的含义.
如果您把定位限定词放在命令之后,但在第一个参数之前,它就影响整个命令串.
如果您把定位限定词放在参数后面,那么它只影响那个参数.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在以下例子中,第一个PRINT命令请求文件SPRING.
SUM和FALL.
SUM的两个副本.
第二个PRINT命令请求文件SPRING.
SUM的两个副本,但只请求FALL.
SUM的一个副本.
$PRINT/COPIES=2SPRING.
SUM,FALL.
SUM$PRINTSPRING.
SUM/COPIES=2,FALL.
SUM2.
5.
3参数限定词参数限定词只可以用于某些类型的参数,诸如输入文件和输出文件.
例如,BACKUP命令接受几个参数限定词,它们只应用于输入和输出文件说明.
在以下例子中,/CREATED和/BEFORE限定词只能对输入文件指定,为备份操作选择特定的输入文件.
星号(*)是一个替换文件名的通配符,.
BACKUP选择所有在2002年12月11日之前建立的.
TXT文件类型的文件.
$BACKUP*.
TXT/CREATED/BEFORE=11-DEC-2002NEWFILE.
TXT2.
5.
4限定词冲突如果在一个命令行中您使用两个或更多矛盾的限定词,最右的限定词会取代其他限定词.
一些命令包含不能在同一命令行中同时指定的冲突限定词.
如果您使用不兼容的限定词,那么命令解释程序显示一条出错消息.
以下是一个限定词冲突的例子.
注意,PRINT命令只接受/COPIES=2和/NOBURST限定词,因为在命令行中它们是最右的限定词:$PRINTMYFILE/COPIES=3/BURST/COPIES=2/NOBURSTEARTH.
TXT2.
5.
5限定词可接受的值限定词可以接受关键字、文件说明、字符串和数值.
当您为限定词输入值时,用等号(=)或冒号(:)分开限定词和值.
一些限定词关键字需要附加信息.
在这些情况下,用冒号或等号把关键字与它的值分开.
要指定多个需要值的关键字,把该列表括在圆括号内,并且用等号(=)或冒号(:)分开关键字和值.
例子在这个例子中两个命令都是有效的:$PRINT/COPIES=3MYFILE.
DAT$PRINT/COPIES:3MYFILE.
DATUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum这是一个限定词需要附加信息的例子;用冒号或等号(=)把关键字"PROTECTION"与它的值分开:$SETSECURITY/PROTECTION:GROUP:RWMYFILE.
DAT$SETSECURITY/PROTECTION=GROUP=RWMYFILE.
DAT这是一个限定词需要多个关键字的例子,每个关键字需要多个值:$SETSECURITY/PROTECTION=(OWNER=RWD,GROUP=RW)myfile.
dat$SETSECURITY/PROTECTION=(OWNER:RWD,GROUP:RW)myfile.
dat2.
6输入日期和时间值某些命令和限定词(例如PRINT/AFTER命令)接受日期和时间值.
您可以按以下格式之一指定这些值:绝对时间相对时间混合时间(结合绝对和相对时间格式)2.
6.
1绝对时间格式绝对时间是一个特定的日期或当日时间.
绝对时间的格式如下所示:[dd-mmm-yyyy][:hh:mm:ss.
cc]各字段如下所示:dd当月日期:范围从1至31的整数mmm月:JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV或DECyyyy年:一个整数hh小时:范围从0至23的整数mm分钟:范围从0至59的整数ss秒:范围从0至59的整数cc百分之一秒:范围从0至99的整数指定绝对时间应用以下规则:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum您可以在右边截取日期或时间.
如果您指定日期和时间,则在它们之间要包括一个冒号.
日期必须至少包含一个连字号.
在日期和时间中,您可以省略任何字段,但要使用标点符号分开各字段.
截取或省略的日期字段默认为当前日期的相应字段.
截取或省略的时间字段默认为零.
如果您在一个期望当前或将来时间的命令中指定了一个过去时间,则使用当前时间.
您也可以使用以下关键字之一指定绝对时间:TODAY在00:00:00.
0点钟的当前日、月和年TOMORROW明天的00:00:00.
00点钟YESTERDAY昨天的00:00:00.
00点钟下表展示绝对时间说明的例子:时间说明结果11-DEC-2002:132002年12月11日下午1点钟11-DEC今年12月11日开始的午夜15:30今天下午3:3019--本年本月19日午夜19--:30本月19日上午12:302.
6.
2相对时间格式相对时间是从当前日期和时间到将来某个时间的偏移(时间间隔).
相对时间的一般格式如下所示:"+[dddd-][hh:mm:ss.
cc]"各字段如下所示:dddd天数;范围从0至9999的整数hh小时数;范围从0至23的整数mm分钟数;范围从0至59的整数ss秒数;范围从0至59的整数cc百分之一秒数;范围从0至99的整数如果限定词描述的值可以表达为绝对时间、相对时间或两者混合,您必须指定一个相对时间,就好象它是混合时间的部分.
例如,要指定一个从当前时间开始之后5分钟的相对时间值,使用"+:5"(不是"0-0:5").
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum指定相对时间时,应用以下规则:您可以在右边截取相对时间.
如果您指定天数,则应包括一个连字号.
在时间中,您可以省略字段,但要使用标点分开各字段.
如果您省略时间字段,默认是零.
下表展示一些相对时间说明的例子:时间说明结果"+3-"从现在起3天(72小时)"+3"从现在起3小时"+:30"从现在起30分钟"+3-:30"从现在起3天30分钟"+15:30"从现在起15小时30分钟2.
6.
3混合时间格式要结合绝对和相对时间,可指定绝对时间加上或减去相对时间.
使用以下格式之一:"[absolutetime][+deltatime]"[absolutetime][-deltatime]绝对和相对时间值的可变字段和默认字段与前述各节的描述相同.
指定混合时间时,应用以下规则:把加号或减号放在相对时间值之前.
(注意,减号与连字号是相同的键盘键.
)如果一个加号或减号在相对时间值之前,把整个时间说明括在引号内.
如果您要从当前日期和时间偏移相对时间,要省略绝对时间值.
尽可能完全地指定日期和时间.
下表展示一些混合时间说明的例子:时间说明结果"+5"从现在起5小时.
"-1"当前时间减去1小时.
减号(-)指出负偏移.
(1解释为小时,而不是日,因为它后面没有连字号.
)"+:5"从现在起5分钟.
"-:5"当前时间减去5分钟.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum"-1-00"当前时间减去1日.
减号(-)指出负偏移.
连字号(-)分开日和时间字段.
"31-DEC:+:5"本年12月31日上午12:05.
绝对时间说明(在冒号之前)默认为本年12月31日的午夜.
加号(+)指出正偏移.
31-DEC:-00:10本年12月30日下午11:50.
绝对时间说明(在冒号之前)默认为本年12月31日的午夜.
在DEC:之后的减号(-)指出负偏移.
2.
7重新调用命令在DCL提示下,您可以重新调用以前键入的命令行以避免重新键入长的命令行.
一旦显示命令,您就可以重新执行或编辑它.
在OpenVMSVAX系统中,重新调用缓冲区保存多达20个以前输入的命令.
在OpenVMSAlpha系统中,重新调用缓冲区保存多达254个以前输入的命令.
通过使用以下方法之一,您可以显示以前输入的命令:按下Ctrl/B使用向上箭头和向下箭头键使用RECALL命令2.
7.
1按下Ctrl/B按下Ctrl/B一次重新调用上一个命令行.
再次按下Ctrl/B重新调用上一个命令行之前的命令行,直到最后一个保存的命令行.
2.
7.
2使用箭头键使用向上箭头和向下箭头键分别重新调用上一个和下一个命令.
重复按下箭头键可遍历这些命令.
2.
7.
3使用RECALL命令要检查以前键入的命令行,可键入RECALL/ALL.
在查看可用命令之后,键入RECALL和所要求命令的行号,您可以重新调用特定的命令行.
您也可以在RECALL后面跟随您要显示的命令行的第一个字符.
RECALL扫描以前的命令行(从最新的一行开始),输入从您键入的字符开始的第一个命令行.
例子以下显示键入RECALL/ALL产生的样例:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$RECALL/ALL1SETDEFAULTDISK2:[MARSHALL]2EDITACCOUNTS.
COM3PURGEACCOUNTS.
COM4DIRECTORY/FULLACCOUNTS.
COM5COPYACCOUNTS.
COM[.
ACCOUNTS]*6SETDEFAULT[.
ACCOUNTS]以下例子展示如何重新调用第4个命令行:$RECALL4在您按下Enter键后,在DCL提示下系统显示列表中的第4个命令.
(RECALL命令本身不放入缓冲区内.
)以下例子展示如何重新调用以前输入的命令,EDITACCOUNTS.
COM:$RECALLE在您按下Enter后,系统显示以下命令行:$EDITACCOUNTS.
COM注意如果您正在运行一个使用OpenVMS屏幕管理软件的公用程序或应用程序,您就可以使用Ctrl/B和向上箭头与向下箭头键来执行重新调用的命令;然而,必须允许行编辑.
一些具有这个特性的公用程序是Mail、OpenVMS调试程序、ShowCluster、系统转储分析程序(SDA)和EVE编辑程序.
要擦除重新调用缓冲区的内容,输入带ERASE限定词的RECALL命令.
例如:$RECALL/ERASE基于安全原因,在您输入包括密码的命令后擦除重新调用缓冲区的内容是个好习惯.
2.
8编辑DCL命令行UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在DCL命令级,您可以使用许多单键和组合键来更改您键入的内容.
虽然不同类型的终端有不同的操作特征,但多数有标准的功能键和可以在行编辑程序使用的键.
要看是否允许行编辑,输入SHOWTERMINAL命令.
在以下例子中,允许行编辑:$SHOWTERMINAL终端:_VTA2138:Device_Type:VT200_Series拥有者:ROHBA物理终端:_TNA2114:远程端口信息:主机:16.
32.
216.
68端口:1409输入:9600LFfill:0宽度:80奇偶校验:没有输出:9600CRfill:0页数:24终端特征:InteractiveEchoType_aheadNoEscapeHostsyncTTsyncLowercaseTabWrapScopeNoRemoteEightbitBroadcastNoReadsyncNoFormFulldupNoModemNoLocal_echoNoAutobaudHangupNoBrdcstmbxNoDMANoAltypeahdSet_speedNoCommsyncLineEditingOverstrikeeditingNoFallbackNoDialupNoSecureserverDisconnectNoPasthruNoSyspasswordNoSIXELGraphicsNoSoftCharactersPrinterportNumericKeypadANSI_CRTNoRegisNoBlock_modeAdvanced_videoEdit_modeDEC_CRTDEC_CRT2NoDEC_CRT3NoDEC_CRT4NoDEC_CRT5NoAnsi_ColorVMSStyleInput2.
8.
1SETTERMINAL命令您可以使用SETTERMINAL命令来改变终端编辑DCL命令行的方法.
按照默认,SETTERMINAL命令的更改只适用于当前对话期.
要设置您每次注册的终端,您可以在LOGIN.
COM文件中包括SETTERMINAL命令.
要允许行编辑,可输入SETTERMINAL/LINE_EDIT命令:$SETTERMINAL/LINE_EDITUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum插入和重键模式您可以用插入或重键模式编辑命令行.
在插入模式下,您键入的字符插入在光标的左边.
在重键模式下,您键入的字符重写光标指出的字符.
要更改单个命令行的编辑模式,按下Ctrl/A(Ctrl/A是一个互换组合键).
要更改对话期的编辑模式,可输入SETTERMINAL/INSERT或SETTERMINAL/OVERSTRIKE命令.
文本绕接如果您使用SETTERMINAL/WRAP命令,当您输入比屏幕一行要多的字符时,文本绕接到下一行.
如果您使用SETTERMINAL/NOWRAP命令,则当您输入比终端屏幕一行要多的字符时,该行的最后字符将被键空.
您只能编辑出现光标的行.
当文本绕接时,您不能使用向上箭头键移动光标去编辑上一行.
要移动光标去编辑上一行,可使用Delete键删除当前行的所有字符.
2.
8.
2删除部分命令行按下退格键后移光标并擦除那个位置的字符.
如果允许行编辑,您可以使用Ctrl/U删除从行的开始到当前光标位置的字符.
如果不允许行编辑,您可以使用Ctrl/U取消整行.
系统忽略这一行并重新显示DCL提示.
2.
9定义终端键键定义是一个您分配给特定终端键的字符串.
使用DEFINE/KEY命令.
当一个键被定义时,您可以按下它来代替键入字符串.
键定义通常包含所有或部分命令行.
使用键定义,您可以用户化您的键盘,使您可以用较少的按键输入DCL命令.
当您按下一个已定义键时,系统在终端显示命令或执行命令,这取决于是否使用/TERMINATE限定词定义这个命令,.
按照默认,终端设置为数字小键盘模式.
使用SETTERMINAL命令可重新定义数字小键盘上的键.
有关详情,请参阅OpenVMSDCLDictionary对SETTERMINAL/APPLICATION_KEYPAD、SETTERMINAL/NONUMERIC和DEFINE/KEY命令的描述.
2.
10组合键除输入DCL命令之外,您可以使用特定的组合键执行任务.
当系统正在处理另一个命令时,组合键是获得系统注意的捷径或方法.
要输入组合键,保持按下Ctrl键的同时,按下并放开第二个键.
以下几个表按功能组织组合键.
表2-1输入DCL命令组合键功能UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumCtrl/Z和F10从终端输入数据时标记文件末端.
Enter把当前行发送给系统处理.
如果您还没有注册,Enter键开始注册过程.
表2-2中断DCL命令组合键功能Ctrl/T即刻中断终端输出,显示一行关于当前进程的统计信息.
这个显示包括节点和用户名、时间、正在运行的映象名称和有关当前终端对话期使用系统资源的信息.
您也可以使用Ctrl/T确定系统是否正在运转.
如果系统临时无反应或者如果终端设置为NOBROADCAST,则Ctrl/T不输入信息.
要使用Ctrl/T,您必须首先输入SETCONTROL=T命令(在系统注册命令过程、在个性化注册命令过程,或交互地).
Ctrl/Y、Ctrl/C和F6中断命令处理.
您可以用命令SETNOCONTROL=Y撤消Ctrl/Y.
在多数条件下,Ctrl/Y返回DCL提示.
运行程序仍然活动.
您可以输入任何内设命令,然后使用CONTINUE命令继续程序.
(在输入CONTINUE命令后,按下Ctrl/W可刷新屏幕.
)表2-3重新调用命令组合键功能Ctrl/B和上箭头重新调用多达20条(VAX)或254条(Alpha)以前输入命令.
下箭头显示重新调用缓冲区的下一行命令.
表2-4控制光标位置组合键功能退格删除最后输入的字符.
Ctrl/A和F14切换重键和插入模式.
每行开始会重新设置为默认模式(使用SETTERMINAL/LINE_EDITING命令设置).
Ctrl/D和左箭头把光标向左移动一个字符.
Ctrl/E把光标移动到行的末端.
Ctrl/F和右箭头把光标向右移动一个字符.
Ctrl/H和F12把光标移动到行的开始.
Ctrl/I和Tab在终端上把光标移动到的下一个制表符停止列.
系统在一行上每逢第8个字符位置提供制表符停止列.
制表符设置是硬件终端的特征,一般而言,您可以修改.
当撤消行编辑时,Tab键也起作用.
Ctrl/J删除光标左边的字.
Ctrl/K把当前行移动到下一个垂直制表符停止列.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumCtrl/L把光标移动到下一页的开始.
当允许行编辑时,则忽略使用Ctrl/L.
Ctrl/R当您按下Ctrl/R时,重复当前命令行并保持光标所在位置.
Ctrl/U删除当前输入行光标左边的所有文本.
Ctrl/V停掉一些行编辑功能键.
例如,如果您按下Ctrl/V后面跟随Ctrl/D,那么就产生Ctrl/D字符,而不是光标向左移动一个字符.
Ctrl/D是DCL级的行终止符.
当与Ctrl/V结合时,不是行终止符的字符没有作用.
例子有Ctrl/H和Ctrl/J.
然而,某些控制键,例如Ctrl/U,却保留其行编辑功能.
Ctrl/X取消当前行,并删除提前键入缓冲区的数据.
F7、F8、F9、F11Compaq保留.
表2-5控制屏幕显示组合键功能Ctrl/O交替地暂停和继续显示终端输出.
Ctrl/O表现为输出停掉和输出启用.
Ctrl/S暂停终端输出,直到按下Ctrl/Q.
Ctrl/Q恢复被Ctrl/S暂停的终端输出.
Ctrl/W刷新屏幕显示.
第3章使用文件存储信息文件是包含信息的系统对象.
这个信息可以是计算机理解的机读数据.
它也可以是您输入和使用的文本.
文件的内容可以是文档、程序或一列地址的文本、.
通过联机显示或者打印,您可以检查文本文件的内容.
程序,也称为映象或可执行映象,是包含按机读格式存储的指令和数据的文件.
有些程序与DCL命令关联.
例如,当您键入DCL命令COPY,系统就运行程序SYS$SYSTEM:COPY.
EXE.
有些程序通过输入DCL命令RUN后面跟随程序名可启动.
操作系统或您可以提供映象文件,这些文件的文件类型通常是.
EXE.
您不能用DCL命令TYPE、PRINT或EDIT检查映象文件,因为映象文件不包括ASCII字符.
(文本文件包含的ASCII字符是表示字母表、标点符号、数字和其他特殊符号的标准方法.
)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum本章描述如何建立和处理在本地和在TCP/IP或DECnetforOpenVMS网络上的文件.
包括以下信息:理解文件名和文件说明在文件名中使用通配符其他文件名建立和修改文件显示文件内容删除文件保护文件以免其他用户非法存取打印文件有关详情,请参阅以下内容:第5章论述关于在使用扩展文件说明环境中文件名的信息OpenVMSDCLDictionary和联机求助,论述在本章中论述的命令OpenVMSSystemManager'sManual,论述关于存取远程节点的信息CompaqTCP/IPServicesforOpenVMSUser'sGuide,论述关于使用TCP/IP用户公用程序和命令的信息DECnetforOpenVMSNetworkingManual,论述关于DECnet网络的信息DECnet-PlusforOpenVMSIntroductionandUser'sGuide,论述关于DECnetPhaseV网络的信息3.
1理解文件名和文件说明文件是OpenVMS操作系统用来存储人读和机读数据的单位.
当您建立或命名文件时,您提供系统可以用来定位和标识文件的信息.
文件名包括文件名称和文件类型.
名称和类型用句点(.
)分开.
文件也有版本号.
您可以有一个文件的几个版本.
除非您指定版本号,否则系统使用最高版本的文件.
当您编辑文件时,系统不修改原始版本,但是建立一个新的输出文件.
按照默认,输出文件与原始文件有同样的名称和文件类型,但是有一个比同名现有文件更高的版本号.
文件名称、文件类型和版本号构成文件说明.
3.
1.
1提供完整文件说明一个文件定位在网络上的一个特定计算机(或节点)上、在已连接到计算机的一个特定设备或一组设备(被称为卷)上、在该卷的特定目录上.
一个完整文件说明:精确地描述系统用来定位和标识文件的存取路径可以包括文件所在的目录和文件驻留的网络节点也被称为网络文件说明UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum您不必包括完整文件说明的所有元素.
然而,您必须指定足够的文件说明,以使当与默认组件结合时系统可以定位和标识正确的文件.
1要取代系统默认或者执行在网络之上的文件操作,您必须提供一个完整文件说明.
一个完整文件说明有以下格式:node::device:[root.
][directory]file-name.
file-type;version各组件如下所示:Node一个网络节点或主机名;只适用于支持TCP/IP或DECnet的系统.
不要应用于存储在磁带上的文件.
不要用来指定在您注册的同一系统上的文件.
Device该术语用来指称磁盘或磁带驱动器或其他连接到运行OpenVMS操作系统的计算机上的外围设备.
每个设备有一个唯一名称,指出其类型和位置.
磁盘可以格式化为ODS-2(默认)或ODS-5(只用于OpenVMSAlpha).
Directory存储文件的目录名称.
方括号([])或尖括号()用来定目录界限.
不要应用于存储在磁带上文件.
Filename文件的名称.
Filetype标识文件的结构或类型.
Version文件的版本号.
版本用一个十进制数标识,每次建立文件的新版本时就增加1.
系统自动分配版本号,除非您指定一个.
3.
1.
2文件说明规则使用以下规则指定文件说明的各个元素:为文件给出一个对您有意义的名称.
在支持ODS-2磁盘的OpenVMSAlpha和OpenVMSVAX系统上,文件名称可以有多达39个字符,可用字符是从字母A至Z(大写或小写字母)、数字0至9、下划线(_)、连字号(-)、代字号(~)和美元符($).
不要在文件名中使用连字号作为首位字符,因为有些较旧版本的OpenVMS不允许它出现在任何格式的文件说明中.
文件类型开始于句点(.
).
在支持ODS-2磁盘的Alpha和VAX系统上,文件类型可以有多达39个字符(包括句点),可用字符是从字母A至Z(大写或小写字母)、数字0至9、下划线(_)、连字号(-)和美元符($).
版本部分以分号(;)或句点(.
)开始.
当系统显示文件说明时,它为版本部分显示分号.
不要使用目录字段指称磁带上的文件.
(目录只应用于磁盘上的文件.
)只有当您的系统是网络的一部分以及如果文件不在您注册的节点上时,才包括节点名.
在支持ODS-2磁盘的OpenVMSAlpha和OpenVMSVAX系统上,UFD(用户文件目录)名或子目录名可以有多达39个字符,可用字符是从字母A至Z(大写或小写字母)、数字0至9、下划线(_)、连字号(-)和美元符($).
不允许子目录名从连字号开始.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在OpenVMSAlpha7.
2或以后版本中,在目录的所有子目录和根部的字符总数(不包括中括号和分隔符句点)不能超过512.
另外,考虑到目录存储为具有.
DIR;1形式的文件,UFD和子目录名与文件名、类型和版本部分具有同样的约束.
在由支持和不支持扩展文件说明的系统组成的环境中,记住,其名称超出受限系统能力的文件和目录将不能被那些系统存取.
有关详情,请参阅GuidetoOpenVMSFileApplications.
注意注意这些规则不同于支持扩展文件说明环境中的文件.
有关扩展文件名的详情,请参阅第5章.
3.
1.
3DCL命令使用的默认文件类型对于某些命令,如果您省略文件类型,系统应用默认值.
下表列出DCL命令比较普遍使用的一些默认文件类型:文件类型内容.
CLD命令描述文件.
COM命令过程文件.
DAT数据文件.
DIFDIFFERENCES命令建立的输出文件.
DIR目录文件.
DISMail公用程序的分发名单文件.
EXE链接程序建立的可执行程序映象文件.
HLB求助文本库文件.
HLP求助库的输入源文件.
INI初始化文件.
LIS语言编译程序或汇编程序建立的列表文件;PRINT和TYPE命令的默认输入文件.
LOG批量作业的输出文件.
MAIMail的消息文件.
PSPOSTSCRIPT格式文件.
SYS系统映象文件.
TJLDECTPU和ACL编辑程序建立的日志文件.
TLB文本库文件.
TMP临时文件.
TPUEVE编辑程序的命令文件UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum.
TPU$JOURNALEVE编辑程序建立的日志文件.
TXT用于文本库或Mail公用程序输出文件的输入文件3.
1.
4语言源程序的默认文件类型下表列出一些高级语言源程序的默认文件类型:文件类型内容.
ADACompaqAda编译程序的输入源文件.
BASBASIC编译程序的输入源文件.
B32VAXBLISS-32编译程序的输入源文件.
CCompaqC编译程序的输入源文件.
COB用于OpenVMSVAX系统的VAXCOBOL编译程序和OpenVMSAlpha系统的CompaqCOBOL编译程序的输入源文件.
FORCompaqFortran的输入源文件(OpenVMSVAX系统的CompaqFortran就是以前的VAXFortran).
M64OpenVMSAlphaMACRO-64汇编程序的输入源文件.
MAPLinker公用程序建立的存储器分配映象.
MARVAXMACRO汇编程序或OpenVMSAlphaMACRO-32编译程序的输入源文件.
MLBMACRO汇编程序的宏指令库.
MSG指定消息文本的源文件.
OBJ语言编译程序或汇编程序建立的目标文件.
OLB目标模块库.
OPT输入给LINK命令的任选项文件.
PASPascal编译程序的输入源文件.
PLIPL/I编译程序的输入源文件.
STBLinker公用程序建立的符号表.
UPD更改VAXMACRO源程序的更新文件;也作为SUMSLP公用程序的输入文件注意1记录管理服务(RMS)是帮助应用程序处理和管理文件的OpenVMS设施.
RMS维护分析文件UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum说明的规则.
有关RMS如何对部分文件说明应用默认值的详情,请参阅GuidetoOpenVMSFileApplications.
3.
1.
5文件版本除文件名和文件类型之外,每个文件有一个版本号.
版本号是十进制数,从1至32,767可区别文件的不同版本.
当您建立文件时,系统为它分配版本号1.
您可以有同一文件的几个版本.
除非您指定版本号,系统使用最高现有版本号的文件.
如果您指定版本号0,系统则使用最高现有版本.
当您使用命令、应用程序或文本编辑程序(例如EVE)修改文件时,则建立文件的新版本,文件名不变但版本号增1.
在版本号之前是分号或句点.
当系统显示文件说明时,在文件版本号之前显示分号.
指定零或负版本号,您可以以相对方式查看文件的版本.
指定零可查找文件的最近(最高)版本.
指定-1查找下一个最近版本,-2查找在其之前版本,以此类推.
要查找文件的最早(最低)版本,则指定-0为版本号.
注意,您不能用比32767更高的版本号建立文件.
如果您尝试用比32767更高的版本号建立新文件,将接收到一条出错消息.
CREATE/DIRECTORY、SETDIRECTORY和SETFILE等命令的/VERSION_LIMIT限定词让您控制文件的版本号.
如果超过版本限制,系统自动在超过限制时清除最低版本的文件.
例如,如果版本限制是5,而您要建立文件的第6个版本(ACCOUNTS.
DAT;6),那么系统就删除文件的第一个版本(ACCOUNTS.
DAT;1).
要查看文件的版本限制,可输入DIRECTORY/FULL命令.
版本限制列出在文件属性:字段.
3.
1.
6网络节点名一个节点是一个独立的计算系统,是计算机网络的一部分.
如果您的系统是网络的一部分,您注册时存取的节点就是您的本地节点.
网络的其他节点是远程节点.
当您要指定远程节点上的文件时,使用节点名.
节点说明有以下格式:node["access-control-string"]::当输入文件说明的节点名部分时,遵守以下规则:节点名可以包含1至6个字母数字字符并且必须至少包含一个字母字符.
例如:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumAFTP1F2OTR2MYNODE节点名(带或不带存取控制字符串)必须总是后跟双冒号(::).
当您指定节点名时,您可以包括一个0至42个字符的存取控制字符串.
存取控制字符串包含要发送到远程节点的注册信息.
有关存取控制字符串的详情,请参阅3.
1.
12节.
注意,需要的双冒号跟随存取控制字符串.
您可以使用逻辑名代替节点名.
有关逻辑节点名的详情,请参阅第11章.
3.
1.
7指定DECnet-Plus节点全名在OpenVMS系统上,您可以指定节点全名.
然而,您必须安装DECnet--Plus软件以识别全节点名.
有效的全节点名可以包含多达255个字符并且可以包括除以下字符外的任何字符:空格制表符字符:逗号(,)、引号("")、斜杠(/)、感叹号(!
)、等号(=)、加号(+)、at符号(@)、省略号(')、圆括号(())和双冒号(::)冒号(:)作为第一个或最后一个字符如果全节点名括入引号("")内,它可以包含任何字符,但不匹配的引号除外.
注意,如果在节点名内有引号,则引号必须是成双的,并且整个字符串,包括引号在内,也必须括入引号内.
虽然OpenVMS软件在节点名语法上要求很少的规则,但实际有效的节点名集受到运行在系统上的DECnet软件的约束.
有关全名的详情,请参阅DECnet--Plus文档.
语法规则,包括有效字符代码,详细描述在DECnet--PlusDECdnsManagementGuide中.
在以下例子中,整个字符串括在引号内,因为有引号在节点名中:"MARY:.
UNIVERSITY.
""SCIENCELAB"""有效全节点名的其他例子是:MYNODEMASSACHUSETTS:.
BUSINESS.
YOURNODEA.
B;C3.
1.
8指定TCP/IP名称和地址通过TCP/IP,除非特别声明,当您在命令行指定主机时,可以使用它的主机名、完全限定的域名或IP地址.
主机的相对名称是一个简名,它不包括完全限定的域名;也就是说,它不包括一个或多个句点(.
).
有关TCP/IP语法规则,请参阅CompaqTCP/IPServicesforOpenVMSUser'sGuide.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum3.
1.
9使用DECnet存取远程节点上的文件当您存取远程节点的文件时,DECnet注册到远程节点.
要做到这一点,系统需要到那个节点的注册信息.
您可以向系统提供存取控制字符串.
如果省略存取控制字符串,发送给远程节点的注册信息就由如下所述确定:如果远程节点存在代理注册帐户,系统就让您使用该帐户注册.
代理注册帐户允许选定的用户注册到节点.
如果不存在代理注册帐户,系统就使用那个节点的默认DECnet帐户,该帐户由那个节点的本地系统管理员指定.
如果您包括存取控制字符串,系统就使用它让您注册到远程节点.
文件说明的剩余部分传递给远程节点并在那里解释.
如果您指定本地节点作为文件说明的一部分,系统就通过网络给您注册,并执行文件操作,即使文件存在于您的本地节点.
有关存取远程系统的其他方法的详情,请参阅OpenVMSSystemManager'sManual.
注意贯穿本章的剩余部分,指定节点名的例子不总是包括存取控制字符串.
这是因为在这些例子中代理帐户允许用户在远程系统执行操作.
3.
1.
10使用TCP/IP存取远程节点上的文件CompaqTCP/IPServicesforOpenVMS提供文件传送协议(FTP),能够通过网络存取文件和与另一个主机之间传递文件.
要使用FTP,您需要有一个在OpenVMS系统上对CompaqTCP/IPServicesforOpenVMS具有存取权的用户帐户,和一个在远程FTP主机上的用户帐户.
在有些情况下,TCP/IP允许您连接到远程主机,而不要指定帐户和密码.
如果不允许这个特性,您就必须提供存取远程主机的用户证实信息.
有关使用FTP命令的详情,请参阅CompaqTCP/IPServicesforOpenVMSUser'sGuide.
3.
1.
11使用网络文件说明网络文件说明有3种格式:常规外部任务在每种格式中,节点说明可以包括存取控制字符串.
有关详情,请参阅产品的DECnetUser'sManual和CompaqTCP/IPServicesforOpenVMSUser'sGuide.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum3.
1.
11.
1常规文件说明文件的常规格式是:node::device:[directory]filename.
type;version3.
1.
11.
2外部文件说明外部文件说明是文件名不符合OpenVMS语法的文件.
用来提供外部文件说明的格式是:node::"foreign-file-spec-string"在以下例子中,文件名包含问号(),它不能被识别为一个有效的文件名字符.
因此,文件名必须括入引号("")内.
它也必须符合您要存取的远程节点操作系统能够识别的格式:$COPYBOSTON::"TEST.
DAT"*3.
1.
11.
3任务说明字符串任务说明字符串标识在远程节点执行的程序.
您可以在程序中使用任务说明字符串,允许程序与远程节点的另一个程序进行通信.
用来指出任务说明字符串的格式是:node::"task-spec-string"这个说明标识在远程节点BOSTON上的程序TEST2:BOSTON::"TASK=TEST2"注意当您复制文件到UNIX系统或从UNIX系统时,有一些限制.
有关详情,请参阅OpenVMSRecordManagementUtilitiesReferenceManual.
3.
1.
12存取控制字符串格式存取控制字符串指定您可以注册到远程节点的帐户.
带存取控制字符串的节点名具有以下格式:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumnode"access-control-string"::把存取控制字符串括入引号("")内并后跟双冒号(::).
在OpenVMS系统上,存取控制字符串包括一个用户名,后跟一个或多个空格或制表符和一个密码.
有关存取控制字符串的详情,请参阅第10章.
在以下例子中,BOSTON是网络节点名.
"HIGGINSETUHCARAP"是存取控制字符串:HIGGINS是在节点BOSTON上的一个用户名.
ETUHCARAP是与该用户名关联的密码:$DIRBOSTON"HIGGINSETUHCARAP"::WEASEL2:[BORIS]ACCOUNTS.
DAT3.
2在文件名中使用通配符使用通配符使DCL命令一次可应用于多个文件而不是一个文件.
该命令应用于文件名匹配已输入文件说明部分的所有文件.
本章的许多例子展示在文件操作中使用通配符.
对于个别命令,在DCL命令中对通配符的使用可能不同.
有两个通配符可用于许多DCL命令:星号(*)和百分号(%).
两者可以作为通配符使用在目录名、文件名和文件类型中.
(有关目录使用通配符的详情,请参阅4.
5节.
)在版本部分,您可以使用星号(;*),但不能使用百分号或通配符和数字的混合.
在运行OpenVMS7.
2或更高版本的Alpha系统上,问号()可以用来代替百分号(%).
如果您正在支持扩展文件说明的环境中工作,请参阅第5章有关附加通配符任选项的详细描述.
3.
2.
1星号(*)通配符使用星号(*)通配符匹配以下内容:目录、文件名和文件类型字段的整个字段(或它的一部分)整个版本号字段,但不能是它的一部分星号(*)通配符使用如下:处理大量没有个别命名的文件把选定的文件限制到更加特定的组中在目录说明中UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum例子在以下例子中,该文件说明选择[FROGMAN]目录中的所有文件的所有版本:$PRINT[FROGMAN]*.
*;*在以下例子中,只显示那些在当前默认目录中文件类型为.
DAT的文件:$TYPE*.
DAT;*在这个例子中的命令选择比[FROGMAN]低一级的子目录中的所有文件类型为.
DAT的文件:$DIRECTORY[FROGMAN.
*]*.
DAT在以下例子中,通配符出现在目录说明中:$TYPE[*.
*.
*]AVERAGE.
*;*这个文件说明选择所有命名为AVERAGE而文件类型不限的文件的所有版本,并且它们存在于当前默认磁盘的任何第二级子目录中.
例如,这个文件说明选择[A.
B.
C]AVERAGE.
DAT,但不能选[X.
Y]AVERAGE.
DAT.
3.
2.
2百分号(%)通配符使用百分号(%)通配符可代替文件说明的任何单个字符.
您可以把百分号使用在目录、文件名和文件类型字段中.
然而,您不能把百分号使用在版本号字段或ANSI磁带文件说明中.
百分号代替字段的一个字符位置,并且必须有一个字符可代替.
您可以按需要多次指定百分号,并且可以与其他通配符混合使用.
以下例子显示所有其文件名称是DISTRICT后跟单个字符、其类型是.
DAT的最近版本文件:$TYPE[JONES.
TAXES.
PROPERTY]DISTRICT%.
DAT这个显示将包括文件DISTRICT1.
DAT、DISTRICT2.
DAT和DISTRICT3.
DAT.
不显示文件DISTRICT4_5.
DAT,因为在DISTRICT后面有一个以上字符;也不显示文件DISTRICT.
DAT.
在这个例子中,文件说明是有效:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$[MA*]INS%%%A*.
J*;*3.
3其他文件名以下各节描述OpenVMS环境支持的其他类型文件名.
3.
3.
1空文件名和文件类型当一个文件说明组件(如文件名或文件类型)缺失时,在DCL命令或公用程序的(内设)分析操作期间,它经常被一个默认值代替.
例如,FORTRAN命令使用一个默认文件类型或.
FOR.
以下命令将引起FORTRAN编译程序尝试编译文件FILE.
FOR:$FORTRANFILE并且,DIRECTORY命令用星号通配符代替任何缺失的组件.
例如,以下命令将显示所有文件名称为FILE而不论什么文件类型(包括句点(.
))的文件:$DIRECTORYFILE文件可以有一个空名称(空值或者有一个只包括句点定界符的文件类型(有时称为空文件类型)).
例如,以下是有效的文件名:.
TMPTEMP.
3.
3.
1.
1空文件类型的文件引用您可以引用一个其类型只包括句点定界符的文件,如下所示:$DIRECTORYTEMP.
因为没有文件名定界符,因此不可能引用空文件名称的文件.
无文件名称的文件引用总是被解释为缺失文件名称.
以下命令将显示一列类型为.
TMP的所有文件,而不只是文件.
TMP.
因为目录公用程序将自动用"*"代替缺失的文件名.
$DIRECTORY.
TMP3.
3.
2用于磁带的备用文件名UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum除标准(ODS-2兼容的)文件名之外,操作系统为标注ANSI的磁带支持一种备用的文件命名约定.
其格式如下所示:"filename".
;version文件名可以包含1至17个来自ASCII字符集的字符.
这组字符包括数字字符、大写字母和空格,以及以下字符:另外,ANSI磁带文件名允许用星号(*)字符.
有关详情,请参阅GuidetoOpenVMSFileApplications.
3.
4建立和修改文件以下各节描述如何使用OpenVMS环境支持的工具和命令建立和修改文件.
您可以使用交互文本编辑程序建立和修改文本文件.
EVE和EDT是两个包括在OpenVMS操作系统的文本编辑程序;其他文本编辑程序也可用在您的系统中.
您也可以使用DCL命令CREATE、COPY和RENAME建立和修改文件.
以下各节描述如何使用这些命令建立和修改文件.
如果您正在支持扩展文件说明的环境中工作,请参阅第5章获得有关在您的环境中建立和复制文件的详细资料.
3.
4.
1建立文件CREATE命令建立文本文件.
您不能用CREATE命令修改文件;在按下Enter后,您不能返回到上一行修改.
您必须使用文本编辑程序修改用CREATE命令建立的文件.
按下Ctrl/Z标记文件尾并返回到DCL命令级.
在以下例子中,通过输入CREATE命令然后键入文本行,建立名为TEST.
TXT的文件:$CREATETEST.
TXTthisisatest12345678[Ctrl/Z]3.
4.
2复制文件UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum您可以使用COPY命令复制:把现有文件的内容复制到一个新文件一次复制许多文件只复制那些满足特定条件的文件,该条件由COPY命令的/SINCE限定词指定例子在以下例子中,文件FEES.
DAT被复制到RECORDS.
DAT:$COPYFEES.
DATRECORDS.
DAT在以下例子中,在默认目录中的所有.
TXT文件被复制到另一个目录:$COPY*.
TXT;*[SAVETEXT]*.
*;*在以下例子中,在目录[JONES.
LICENSES.
DOG]中只有那些自1999年12月11日以来修改的文件被复制到默认目录:$COPY/SINCE=11-DEC-1999/MODIFIED[JONES.
LICENSES.
DOG]*.
**3.
4.
3文件串联COPY命令也可以用来连接文件.
例如,在默认目录中,把FEES1.
DAT附加到FEES.
DAT(形成新版本的FEES.
DAT),输入以下命令:$COPYFEES.
DAT,FEES1.
DATFEES.
DAT注意,在FEES.
DAT之后的逗号和文件名FEES1.
DAT之间没有空格.
3.
4.
4使用DECnet把文件从远程节点复制到您的节点使用COPY命令可把另一个节点的文件复制到您的节点.
例如,要把节点CHAOS目录DISK2:[PUBLIC]上的所有文件的最近版本复制到您的默认目录的同名文件上,可输入以下命令:$COPYCHAOS::DISK2:[PUBLIC]*.
**3.
4.
5使用DECnet把文件从您的节点复制到远程节点使用COPY命令把文件从您的节点复制到另一个节点.
当您尝试在系统上复制文件时,如果接收到一条保护违例或DECnet出错消息,那么您可以使用邮件复制文件或者使用存取控制字符串.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在以下例子中,把默认目录所有文件的最近版本复制到节点CHAOS目录DISK2:[STAFF_BACKUP]的同名文件:$COPY*.
*CHAOS::DISK2:[STAFF_BACKUP]3.
4.
6使用TCP/IP复制远程系统的文件TCP/IP使用文件传输协议(FTP)服务通过网络存取文件和与另一个主机之间传递文件.
要把文件从远程主机复制到本地主机,使用GET命令.
要把文件从本地主机复制到远程主机,使用PUT命令.
要使用这些命令,您必须有一个与远程主机的活动FTP对话期.
在该对话期间,您可以输入任何数目的FTP命令.
有关使用FTP命令的详情,请参阅CompaqTCP/IPServicesforOpenVMSUser'sGuide.
在以下例子中,文件FEES.
DAT被发送给节点CHAOS的JONES帐户:$MAIL/SUBJECT="Feeschedule"FEES.
DATCHAOS::JONES3.
4.
7使用存取控制字符串复制文件在您接收到保护违例后还要复制文件,您可以在文件说明中的节点名后加存取控制字符串(请参阅3.
1.
12节).
在以下例子中,用户在节点CHAOS有一个帐户,用户名是SMITH而口令是SPG96PRT.
该用户正在把默认目录所有文件的最近版本复制到CHAOS节点的这个帐户.
$COPY*.
*CHAOS"SMITHSPG96PRT"::DISK2:[STAFF_BACKUP]3.
4.
8重新命名文件使用RENAME命令为文件给出新名称并且可把它定位在不同的目录.
注意在重新命名之后,原始文件不再存在.
当您使用RENAME命令时,输入和输出位置必须在同一设备上.
在以下例子中,文件FEES.
DAT改名为RECORDS.
DAT并且从默认目录移动到[SAVETEXT]目录:$RENAMEFEES.
DAT;4[SAVETEXT]RECORDS.
DAT3.
5显示文件内容以下几节描述如何使用OpenVMS环境支持的工具和命令显示文件内容.
3.
5.
1使用TYPE命令UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum要在您的屏幕显示文件内容,可在DCL提示下输入TYPE命令和文件名.
您不必在文件说明中指定版本号,因为按照默认系统显示文件的最近版本.
在以下例子中,显示文件STAFF_VACATIONS.
TXT的最近版本:$TYPESTAFF_VACATIONS.
TXT3.
5.
2控制显示如果您为TYPE命令指定/PAGE限定词,则每次可以观看一屏.
当您想阅读下一屏时,系统提示您按下Enter键.
通过调用交互文本编辑程序(例如,EVE或EDT)并带/READ_ONLY限定词,您可以使用交互编辑命令在文件中来回移动并搜索特定的字符序列.
当退出交互编辑程序时,/READ_ONLY限定词防止您建立文件的修改版本.
3.
5.
3显示远程节点上的文件当使用DECnet显示远程节点的文件内容时,在文件说明中要包括节点名、磁盘和目录.
在以下例子中,显示文件COMPANY_HOLIDAYS.
TXT(位于远程节点CHAOS):$TYPECHAOS::DISK2:[PUBLIC]COMPANY_HOLIDAYS.
TXT当使用TCP/IP显示远程节点的文件内容时,使用FTPVIEW命令,并指定文件名.
如果文件不在当前工作目录中,则要在文件说明中包括目录名.
有关FTPVIEW命令的详情,请参阅CompaqTCP/IPServicesforOpenVMSUser'sGuide.
3.
5.
4使用通配符显示文件您可以使用星号(*)通配符显示特定文件的所有版本.
在以下例子中,显示在目录[JONES]中文件LOGIN.
COM的所有版本:$TYPE[JONES]LOGIN.
COM;*在以下例子中,显示目录[JONES]中其文件名称从字STAFF开始的所有版本和所有文件类型的文件:$TYPE[JONES]STAFF*.
*;*3.
5.
5显示多个文件UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果您在TYPE命令行指定一个以上文件,系统就按照指定次序显示这些文件.
如果使用通配符,系统则依字母顺序显示文件.
3.
6删除文件DELETE命令从目录中除去文件并释放它们占用的磁盘空间供其他文件使用.
当使用DELETE命令时,必须在每个文件说明中指定版本号或表示任何版本号的星号(*)通配符.
例如,要删除文件POUND.
LIS的版本17,可输入以下命令:$DELETEPOUND.
LIS;17要删除文件POUND.
LIS的版本16和17,可输入以下命令:$DELETEPOUND.
LIS;16,;17要删除文件POUND.
LIS的所有版本,可输入以下命令:$DELETEPOUND.
LIS;*当您使用通配符删除许多文件时,可以通过使用/CONFIRM限定词确认每次删除.
同样地,您可以显示被删除文件的名称.
要做到这一点,可为DELETE命令指定/LOG限定词.
在以下例子中,因为指定了/CONFIRM限定词,所以要确认删除子目录[JONES.
LICENSES.
DOG]中的所有文件:$DELETE/CONFIRM*.
*;*DISK1:[JONES.
LICENSES.
DOG]FEES.
DAT;4,delete[N]:YDISK1:[JONES.
LICENSES.
DOG]FEMALE.
LIS;6,delete[N]:YDISK1:[JONES.
LICENSES.
DOG]MALE.
LIS;3,delete[N]:NDISK1:[JONES.
LICENSES.
DOG]POUND.
LIS;17,delete[N]:Y在以下例子中,因为指定了/LOG限定词,系统会显示被删除文件的名称:$DELETE/LOG*.
LIS;*_%DELETE-I-FILDEL,DISK1:[JONES.
LICENSES.
DOG]FEMALE.
LIS;6deleted(35blocks)_%DELETE-I-FILDEL,DISK1:[JONES.
LICENSES.
DOG]MALE.
LIS;3deleted(5UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumblocks)_%DELETE-I-FILDEL,DISK1:[JONES.
LICENSES.
DOG]POUND.
LIS;17deleted(9blocks)3.
6.
1使用PURGE命令PURGE命令删除在默认目录或任何其他指定目录中指定文件(或所有文件)除最近版本之外的所有版本.
在更新后清除文件的旧版本,能够保留更多的磁盘自由空间.
在以下例子中,清除默认目录每个文件的所有版本,但最近两个版本之外:$PURGE/KEEP=23.
7保护文件以免其他用户非法存取以下几节综述文件保护过程.
有关安全的详情,请参阅:第4章关于目录保护的信息第10章关于更改文件保护的全部信息3.
7.
1存取控制列表(ACL)要阻止其他用户存取您的文件,您可以更改保护或修改文件的存取控制列表(ACL).
要更改保护或修改文件的ACL,您必须拥有这个文件、对这个文件有控制存取权或具有GRPPRV、SYSPRV、BYPASS或READALL特权.
3.
7.
2保护类型有两类文件保护:默认和显式.
当一个文件被建立时,它通常有与父目录相同的保护;这就是默认保护.
如果使用CREATE/PROTECTION命令建立文件,或者如果您发出SETSECURITY/PROTECTION命令更改现有文件的保护,那么您就是使用显式文件保护.
注意,要完全保护文件,您必须应用与文件所在目录同样或更大的保护.
3.
8打印文件要打印文件,使用PRINT命令.
PRINT命令把您的打印作业(所有要打印的文件)放置到待打印的作业列表中,称为打印队列.
在PRINT命令中指名文件的文件类型默认是.
LIS或最后显式指名的文件类型.
系统显示作业名、队列名、作业编号和作业状态.
按照默认,作业名是在PRINT命令中第一个(或仅有)文件说明的名称.
在作业提交到队列后,您使用作业编号引用它.
在作业排队后,当队列中在它之前没有其他作业并且当打印机准备好打印时,这个作业将被打印.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在以下例子中,一个包含3个文件的打印作业被放置在默认打印队列SYS$PRINT中:$PRINTPOUND,MALE,FEES.
DAT作业POUND(队列SYS$PRINT,项号202)开始在SYS$PRINT因为PRINT命令的默认文件类型是.
LIS,因此文件POUND.
LIS、MALE.
LIS和FEES.
DAT被排队.
作业名是POUND,队列名是SYS$PRINT,而作业编号是202.
3.
8.
1打印作业优先级打印队列每次只可执行一个作业.
根据调度优先级,打印作业被调度打印,并且首先打印具有最高优先级的作业.
如果具有同样优先级作业有一个以上,那么通常首先打印最小的作业.
对于同样大小同样优先级的作业,则根据它们的提交时间而定.
优先级也可以由系统管理员确定,或者在PRINT命令中输入/PRIORITY限定词.
有关调度优先级的详情,请参阅OpenVMSSystemManager'sManual.
3.
8.
2显示队列信息默认打印队列SYS$PRINT通常作为现场特定系统启动过程的启动部分.
下表展示您可以用来显示队列信息的命令:要显示.
.
.
输入这个命令.
.
.
在站点上的队列SHOWQUEUE打印作业的状况SHOWENTRY其他用户的作业队列SHOWENTRY/USERNAME=username关于特定作业的信息SHOWENTRYjob-nameSHOWENTRYentry-number在以下例子中,SHOWENTRY命令用来显示已排队的打印作业的信息:$SHOWENTRY项号作业名用户名块数状况202POUNDJONES38暂挂中在停止的打印机队列SYS$PRINT)3.
8.
3打印格式打印格式有以下功能:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum确定某些页格式属性(例如边线和页长度)确定作业是否符合打印的条件,这取决于格式指定的纸张如果打印需求有限,就不需要使用特殊的格式,因为Compaq为所有队列提供一个全系统的默认格式(称为DEFAULT).
系统管理员也可以建立打印格式.
如果需要格式化输出或者如果某些打印作业需要特殊的纸,请与您的系统管理员联系.
3.
8.
4停止打印作业要停止一个打印作业并从打印队列中删除它,则在DELETE/ENTRY命令中输入项号参数.
在以下例子中,删除项号202:$DELETE/ENTRY=2023.
8.
5打印其他节点上的文件DECnet或TCP/IP服务允许您打印另一个系统的文件.
使用TCP/IP,系统管理员可以为系统配置远程行式打印机(LPR)和行式打印机后台程序(LPD)网络服务,允许您使用DCLPRINT命令把打印作业发送到远程网络主机的打印队列.
远程主机可以是UNIX系统或另一个运行LPR/LPD的OpenVMS系统.
使用LPR/LPD网络服务,可以执行以下操作:把打印作业发送给连接到远程网络主机的打印机显示打印队列状况取消打印作业在本地OpenVMS系统打印队列中,接收UNIX系统用户开始的打印作业通过SMTP邮件,获得"已完成"通知有关如何使用LPR/LPD命令打印文件的详情,请参阅CompaqTCP/IPServicesforOpenVMSUser'sGuide.
使用DECnet,您可以在另一个系统上打印文件,方法是:先把文件复制到远程节点,然后在PRINT命令中指定/REMOTE限定词.
在以下例子中,文件COMPANY_HOLIDAYS.
TXT从本地节点复制到远程节点CHAOS,并且这个文件被排队打印到节点CHAOS的默认系统打印队列(SYS$PRINT):$COPYCOMPANY_HOLIDAYS.
TXTCHAOS"JONESPANDEMONIUM"::DISK2:[JONES]*$PRINT/REMOTECHAOS::DISK2:[JONES]COMPANY_HOLIDAYS.
TXTUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum存取控制字符串指出用户JONES有权把文件复制到节点CHAOS的目录[JONES].
在文件说明末尾的星号(*)通配符指示当这个文件被复制到远程节点时,系统复制文件名COMPANY_HOLIDAYS.
TXT,.
注意在PRINT命令中,不是所有限定词兼容于/REMOTE限定词.
例如,您不能把作业排队到一个特定的打印队列;所有作业是排队到默认系统打印队列(SYS$PRINT)中.
关于PRINT命令与/REMOTE兼容的限定词列表,请参阅OpenVMSDCLDictionary中对DCL命令PRINT的/REMOTE限定词的描述.
3.
8.
6PRINT命令限定词使用PRINT命令的限定词,可以以多种方式控制打印作业.
例如,可以指定打印份数或者可以请求系统当完成打印作业时通知您.
除本手册描述的限定词之外,如果系统正运行DECprint监督程序软件,您就可以使用/PARAMETER限定词打印横页、双面或许多其他方式.
关于系统可用的打印任选项的列表,请向系统管理员查询.
下表列出PRINT命令限定词的概要.
有关PRINT命令的完整信息,请参阅OpenVMSDCLDictionary或联机求助.
打印操作打印作业命令和限定词份数:按作业按文件只指定文件PRINT/JOB_COUNT=n1PRINT/COPIES=n1file-spec/COPIES=n1页数PRINT/PAGES=1打印特性:标记页格式类型(纸)特殊特性双倍行距页标题PRINT/FLAG=1PRINT/FORM=1PRINT/CHARACTERISTICS=1PRINT/SPACE1PRINT/HEADER1通知作业执行PRINT/NOTIFY延期执行作业:指定时间不确定地PRINT/AFTERPRINT/HOLD释放延期作业SETQUEUE/ENTRY/RELEASE显示打印作业SHOWENTRYUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum停止打印作业:删除作业停止当前作业并开始打印在队列中下一个作业停止当前作业并重新排队打印DELETE/ENTRY=job-numberSTOP/ABORTSTOP/REQUEUE在完成后作业保留在队列中PRINT/RETAIN1SETQUEUE/ENTRY命令的并行限定词,允许您为已经排队但是还没有打印的打印作业指定这些操作.
3.
8.
7WWPPS公用程序(只对Alpha)World-WidePostScript打印子系统(WWPPS)是一个允许您在任何PostScript打印机上打印带不同语言字符的文本文件的公用程序.
通过在PostScript可打印文件内嵌入字体数据,语言字符可以被打印,即使打印机没有本地语言字体.
注意在PostScript可打印文件中嵌入字体数据可能增加文件大小,以致于超过打印机存储器可以支持的大小.
如果发生这种情况,WWPPS会在打印输出后附加一张出错页,通知您文件大小已超过打印机的容量.
要打印本地语言字符,例如中文、韩文和日文,建议使用至少有24MB存储器的打印机.
支持的语言WWPPS支持以下语言:斯拉夫语(ISO8859-5)希腊语(ISO8859-7)希伯来语(ISO8859-8)日语(SuperDECKanji)韩国语(DECKorean)拉丁1(ISO8859-1)拉丁2(ISO8859-2)拉丁4(ISO8859-4)简体中文(DECHanzi)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum泰国语(TACTIS)繁体中文(TaiwaneseEUC/DECHanyu)土耳其语(ISO8859-9)Unicode当处理字符时,WWPPS检查字符在当前场所是否可打印.
场所设置由CompaqCforOpenVMSRun-TimeLibrary(RTL)在OpenVMS安装期间提供.
除16位Unicode或ISO10646(USC-4)格式的文件以外,在打印包含不同于英语的语言字符文件之前,您必须设置适当的场所.
如果进程的场所设置不适合输入文件,那么使用/LOCALE限定词可以为打印作业设置特定的场所.
支持的代码集OpenVMS系统支持以下代码集:代码集代码集名称DECHANYUDECHanyu用于繁体中文(仅Plane1和Plane2)DECHANZIDECHanzi用于简体中文DECKOREANDECKorean用于韩国语GB18030GB18030-2000用于简体和繁体中文ISO8859-1ISOLatin-1ISO8859-2ISOLatin-2ISO8859-5ISOLatin-5ISO8859-7ISOLatin-7ISO8859-8ISOLatin-8ISO8859-9ISOLatin-9SDECKANJISuperDECKanji用于日语TACTISTIS-620用于泰国语WWPPS支持所有这些代码集,但是对于每个代码集,每次字体只可以与一种语言关联.
WWPPS也支持Unicode字符对所有这些代码集的转换,但泰国语除外.
一个Unicode字符可以转换为这些代码集之一的一个字符;因而支持该代码集的字体用于PostScript文件的字符.
如果某个字符不能转换,它就被打印为空格.
3.
8.
7.
1调用WWPPS系统管理员可能已经为WWPPS设置外部命令,如果没有,可以在LOGIN.
COM中添加以下一行:$WWPPS:==$SYS$SYSTEM:WWPPS.
EXEUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum要从DCL提示调用WWPPS公用程序,输入以下:$WWPPS3.
8.
7.
2WWPPS公用程序命令下表包含可用于WWPPS公用程序的命令、参数和限定词的描述.
每个描述都有例子.
EXIT从WWPPS对话期退出,并返回DCL命令级.
按下Ctrl/Z或Ctrl/C,也可以退出WWPPS对话期.
WWPPS>EXITHELP允许您获得关于World-WidePostScript打印子系统(WWPPS)的信息.
WWPPS>HELPPRINT要获得关于个别命令或题目的信息,输入HELP命令,后面跟随命令或题目名称.
HELP[题目]PRINT每次把一个文本文件转换为可打印的PostScript文件,然后提交给打印机队列.
字符可以用标准字体或粗体打印.
PRINT/QUEUE=queue-name[/qualifiers]file-spec在所有PRINT命令中需要/QUEUE限定词指定队列的名称,该队列是由file-spec指定的文本文件应该发送到的队列.
例如,以下命令把文件REPORT.
TXT提交给PRT_QUEUE打印机队列以美国英语打印(由/LOCALE限定词指定):WWPPS>PRINT/QUEUE=PRT_QUEUE/LOCALE=EN_US_ISO8859-1REPORT.
TXTUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumPRINT命令的可选限定词是:/COPIES指定打印份数.
默认份数是1.
/INDENTATION指定从左边线缩进字符数目.
默认是/INDENTATION=0(不缩进).
允许的最大值依赖于为/PAPER_SIZE和/ORIENTATION指定的(或默认)值.
/PAPER_SIZE/ORIENTATION/INDENTATION的最大值LETTERPORTRAIT39A4PORTRAIT38LETTERLANDSCAPE65A4LANDSCAPE67/LENGTH以行数指定页长度.
默认长度是66行用于LETTER大小而68行用于A4大小.
/LOCALE指定WWPPS用来转换输入文件的场所设置.
您不需要为Unicode格式(UTF-20)的文本文件指定/LOCALE.
使用以下惯例构成场所:language_country_codeset.
LOCALE语言和国家分别是两个字符,由OSF命名惯例定义.
(参阅/LOCALE子题目获得可能的值.
)例如,EN_US_ISO8859-1表示在美国说英语的场所.
按照默认,WWPPS使用系统指定的或进程指定的场所.
如果没有系统指定的或进程指定的场所,那么默认是/LOCALE=C.
要显示您的系统指定的场所,输入以下命令:$LOCALESHOWPUBLIC表3-1列出一般关联的语言代码和国家代码.
表3-1一般关联的语言代码和国家代码语言代码语言国家代码国家CA加泰罗尼亚语ES西班牙ES西班牙语UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumCS捷克语CZ捷克共和国DA丹麦语DK丹麦DE德语CH瑞士DE德国EL希腊语GR希腊EN英语GB英国US美国FI芬兰语FI芬兰FR法语BE比利时CA加拿大FR法国HE希伯来语IL以色列IW希伯来语HU匈牙利语HU匈牙利IS冰岛语IS冰岛IT意大利语IT意大利JA日语JP日本KO韩国语KR韩国LT立陶宛语LT立陶宛NL荷兰语NL荷兰NO挪威语NO挪威PL波兰语PL波兰PT葡萄牙语PT葡萄牙RU俄语RU俄国SK斯洛伐克语SK斯洛伐克SL斯洛文尼亚语SI斯洛文尼亚SV瑞典语SE瑞典TH泰国语TH泰国ZH汉语HK香港TW台湾CN中华人民共和国OpenVMS系统支持的代码集列表在3.
8.
7节的支持的代码集中.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum/ORIENTATION指定逻辑页的打印输出方向,即PORTRAIT(默认)或LANDSCAPE.
/PAPER_SIZE指定纸张大小为LETTER(默认)或A4.
/RANGE指定打印的页范围,从页码m开始,到页码n结束.
或者不使用打印页范围,可以指定ODD只打印奇数页或指定EVEN只打印偶数页.
按照默认,打印整个文档.
/VERTICAL为汉语、韩国语和日语多字节字符,指定垂直写入模式.
当指定/VERTICAL时,多字节字符反时针方向旋转90度并按从左至右打印行;当打印页顺时针方向旋转90度时,可以按垂直行从右到左阅读字符.
在垂直模式下,在语言如英语的单字节字符仍然水平地从左至右打印.
/WIDTH指定以列为单位的页宽.
有效值如下所示:o80(用于LETTER纸和PORTRAIT方向)o132(用于LETTER纸和LANDSCAPE方向)o78(用于A4纸和PORTRAIT方向)o136(用于A4纸和LANDSCAPE方向)默认值是/WIDTH=80.
第4章使用目录组织文件目录是一种特殊文件,包含文件的名称和位置.
例如,当系统管理员为您建立一个用户帐户时,也建立一个目录,它经常与您的用户名同名.
如果您的用户名是JONES,那么目录将是[JONES].
子目录是一个在另一个目录或子目录文件内的目录文件.
子目录让您把文件组织到有意义的组中.
例如,可以有一个包含备忘录的子目录和包含状况报告的另一个子目录.
象目录一样,子目录也包含被编目文件的名称和指针.
子目录可以包含另一个子目录的条目,而它也可以包含另一个子目录的条目,等等.
这个结构(顶级目录加上子目录)称为分层目录结构.
一般存取的文件存储在磁盘上.
每个磁盘包含一个主要目录,称为主文件目录(MFD).
MFD包含一个用户文件目录(UFD)的列表.
UFD被称为用户的顶级目录.
在大多数情况下,系统的每个用户有一个UFD.
它包含在用户目录中编目文件的名称和指针.
您的顶级目录通常是进程默认目录.
除非您的帐户已被修改,否则,当您注册时系统自动把您的顶级目录设置为进程默认目录.
完整文件说明的设备(磁盘)和目录组件经常称为文件路径.
路径与文件名和文件类型(和版本)结合形成一个完整的文件说明.
一个完整文件说明包含系统需要定位和标识文件的所有信息.
1有关系统如何为部分文件说明应用默认值的详情,请参阅GuidetoOpenVMSFileApplications.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum本章描述如何使用目录组织和管理文件.
它包括信息有:目录结构理解目录默认值保护目录防止其他用户非法存取使用通配符搜索目录结构按UIC格式处理目录注意贯穿本章,指定节点名的例子不总是包括存取控制字符串.
这是因为在这些例子中,代理帐户允许用户在远程系统执行操作.
如果您工作在支持扩展文件说明的环境中,那么目录结构和语法可能不同于这里描述的传统结构.
有关在这样的环境中处理目录的详情,请参阅第5章.
注意1文件也可以存储在磁带上,但是磁带没有目录结构.
要存取存储在磁带上的文件,使用只包含文件信息的文件说明.
4.
1目录结构图4-1展示一个样例目录层次.
在结构的顶层是主文件目录(MFD).
它的目录名是[000000].
展示的MFD包含用户文件目录的条目,包括MARTINO.
DIR、PUBLIC.
DIR和JONES.
DIR.
顶级目录[JONES]是用户文件目录,在[000000]中命名为JONES.
DIR;1.
图4-1的样例目录结构是本章许多例子的基础.
图4-1目录结构UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum注意以下关于这个目录结构的说明:假定您是用户JONES.
当您注册时,系统把您放置在[JONES],即您的默认目录.
[JONES]包含以下4个非目录文件:LOGIN.
COM;3LOGIN.
COM;4STAFF.
DIS;3STAFF_VACATIONS.
TXT;2[JONES]也包含以下两个目录文件:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumLICENSES.
DIR;1TAXES.
DIR;1目录文件LICENSES.
DIR;1指向[JONES.
LICENSES]子目录.
TAXES.
DIR;1指向[JONES.
TAXES]子目录.
[JONES.
LICENSES]子目录包含3个非目录文件和两个目录文件.
目录文件DOG.
DIR;1指向[JONES.
LICENSES.
DOG]子目录.
MARRIAGE.
DIR指向[JONES.
LICENSES.
MARRIAGE]子目录.
4.
2理解目录文件说明的目录组件包括一个顶级目录名(例如一个UFD),后面可以跟随许多子目录名.
子目录名用句点(.
)分开.
OpenVMSAlphaV7.
2以前版本和OpenVMSVAX所有版本支持包含UFD和不多于7个子目录名的目录组件.
OpenVMSAlphaV7.
2或以后版本支持目录组件有255个名称(UFD加上子目录).
目录说明有以下格式:[directory.
subdirectory]要添加一级或多级子目录,为每个子目录添加一个句点和另一个子目录名(直到极限).
通过把子目录名(以及前面的句点)连接到在层次中比它高一级的子目录的名称,可以指定另一个子目录的子目录.
在OpenVMSAlphaV7.
2以前版本、OpenVMSVAX任何版本和支持ODS-2磁盘的OpenVMSAlpha系统上,子目录名不能包含多于39个字符.
在支持ODS-5磁盘的OpenVMSAlphaV7.
2或以后版本中,子目录名受文件名极限约束,因为子目录文件存储为.
DIR;1.
在文件说明的目录和根组件中的字符总数(不包括定界符中括号和句点)不能超过512.
4.
2.
1建立目录要建立目录,可输入CREATE/DIRECTORY命令.
如果要在当前目录下建立子目录,就不必指定当前目录名;可以输入子目录名,前面加上一个句点.
在以下例子中,目录[JONES.
TAXES]被建立:$CREATE/DIRECTORY[JONES.
TAXES]在以下例子中,当前默认目录是[JONES],而建立子目录[JONES.
LICENSES]:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$CREATE/DIRECTORY[.
LICENSES]4.
2.
2显示目录要显示目录中文件的名称,在DCL提示下输入DIRECTORY.
要列出子目录中的文件,输入DIRECTORY命令和前面加上一个句点的子目录名.
对DIRECTORY命令加上某些命令限定词时,您可以检索文件名以及信息.
有关DIRECTORY命令限定词的详情,请参阅OpenVMSDCLDictionary或联机求助.
在以下例子中,列出目录[JONES]中的文件.
该例子展示[JONES]包含两个子目录,即[JONES.
LICENSES]和[JONES.
TAXES];4个非目录文件,即STAFF.
DIS、STAFF_VACATIONS.
TXT和LOGIN.
COM的两个版本:$DIRECTORY目录DISK1:[JONES]LICENSES.
DIR;1LOGIN.
COM;3LOGIN.
COM;4STAFF.
DIS;3STAFF_VACATIONS.
TXT;2TAXES.
DIR;1共6个文件.
在以下例子中,默认目录仍然是[JONES]而显示子目录[JONES.
LICENSES]的内容:$DIRECTORY[.
LICENSES]目录DISK1:[JONES.
LICENSES]DEPT.
DAT;3DOG.
DIR;1MAILING.
LIS;6MARRIAGE.
DIR;1TOTAL.
DAT;2共5个文件.
4.
2.
3删除目录UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum要删除一个目录,使用以下过程:步骤任务1确定目录不包含文件.
要查明目录是否包含文件,输入DIRECTORY命令.
当目录中没有文件时,系统显示以下消息:%DIRECT-W-NOFILES,没有找到文件2如果目录包含文件,把它们复制到另一个目录保存,或者如果不想保存就删除掉.
如果目录包含子目录,就检查那些子目录,复制或删除它们的文件,和删除子目录.
3把当前目录转移到要删除目录的上一级目录.
记住,子目录在目录中以文件方式存在.
当删除一个目录时,您就是删除指向那个目录的文件.
4更改目录的文件保护,允许对这个文件有删除存取权.
需要有SYSPRV特权才能删除主文件目录中的目录文件.
(有关文件保护的详情,请参阅第3章.
)5使用DELETE命令删除目录文件.
以下例子展示如何删除子目录[JONES.
LICENSES]:$SETDEFAULT[JONES.
LICENSES]$DIRECTORY%DIRECT-W-NOFILES,没有找到文件$SETDEFAULT[JONES]$SETSECURITY/PROTECTION=OWNER:DLICENSES.
DIR$DELETELICENSES.
DIR;14.
3默认设置要更改您的默认目录,使用SETDEFAULT命令.
新的默认保持有效直到您输入另一个SETDEFAULT命令或注销.
要把默认目录设置为一个子目录,把子目录名附加到在它上一级的目录名.
在以下例子中,把默认目录设置为目录[JONES],然后显示文件[JONES]STAFF_VACATIONS.
TXT:$SETDEFAULT[JONES]$TYPESTAFF_VACATIONS.
TXTUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在以下例子中,显示子目录[JONES.
TAXES]中的文件BILLING.
DAT:$SETDEFAULT[JONES.
TAXES]$TYPEBILLING.
DAT4.
3.
1设置默认目录为不存在的目录注意,操作系统允许您把默认目录设置为一个不存在的磁盘或目录.
如果您已把默认目录设置为一个不存在的目录,那么当您设法处理文件时,系统将显示一条消息,声明目录不存在.
如果您发现自己处在一个不存在的磁盘或目录上而不能完成要求的操作,把默认目录设置为一个现有的磁盘或目录.
4.
3.
2SHOWDEFAULT命令要显示当前默认目录,输入命令SHOWDEFAULT,如以下例子所示:$SHOWDEFAULTDISK1:[JONES.
TAXES]$SETDEFAULT[PUBLIC]$SHOWDEFAULTDISK1:[PUBLIC]您可以使用SETDEFAULT命令更改默认设备.
默认保持有效直到您输入另一个SETDEFAULT命令或注销.
您也可以在命令中指定要设置为默认目录的设备,而不包括目录.
以下例子展示如何更改默认设备:$SHOWDEFAULTDISK1:[JONES]$SETDEFAULTDISK2:[GROUP]$SHOWDEFAULTDISK2:[GROUP]在以下例子中,假定目录[JONES]存在于DISK1和DISK2上:$SHOWDEFAULTDISK1:[JONES]$SETDEFAULTDISK2:$SHOWDEFAULTDISK2:[JONES]UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum4.
3.
3使用临时默认如果您输入一列文件,却没有为列表中的每个文件给出完整文件说明,那么系统对节点名、设备名和目录名使用临时默认值.
要以当前默认目录替换临时默认,使用空的方括号.
如果列表中的文件包括一个节点名,使用一个双冒号可以取代临时默认.
在以下例子中,A.
LIS和B.
LIS从[STATS]目录复制到[RESULTS]目录:$COPY[STATS]A.
LIS,B.
LIS[RESULTS]注意,系统使用列表中前面的文件说明[STATS]A.
LIS,确定文件B.
LIS的临时默认目录也是[STATS].
在以下例子中,使用一个临时默认设备和两个不同的目录:$COPYBASE:[STATS]A.
LIS,[TIME]B.
LIS,C.
LIS[RESULTS]所有3个文件(A.
LIS,B.
LIS,和C.
LIS)从BASE设备复制.
A.
LIS文件从[STATS]目录复制.
其他2个文件从[TIME]目录复制.
在以下例子中,当前默认目录是[BETA].
这个命令把[ALPHA]TEST.
DAT和[BETA]FINAL.
DAT复制到[RESULTS]目录:$COPY[ALPHA]TEST.
DAT,[]FINAL.
DAT[RESULTS]4.
4保护目录防止其他用户非法访问要完全地保护文件,您至少要应用与该文件所在目录具有的同样保护.
例如,如果您不让一个用户对一个文件有任何存取权,但是允许该用户读取文件所在目录,那么该用户就不能存取文件的内容,但是可以看到它存在.
相反,允许用户存取文件,但是拒绝存取文件所在目录(或父目录之一),那么该用户就不能看到它存在.
注意要保护专用文件,只保护目录是不够的.
必须也保护在目录内的每个文件.
按照默认,顶级目录受到基于UIC的保护(S:RWE,O:RWE,G:RE,W:E)并且没有ACL.
子目录受到来自父目录的基于UIC的保护.
有关保护码的详情,请参阅10.
3节.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum当建立目录时要明确地指定基于UIC的保护,使用CREATE/DIRECTORY命令的/PROTECTION限定词.
在目录建立后,您就能为它指定一个ACL.
要更改现有目录基于UIC的保护,可对目录文件应用SETSECURITY/PROTECTION命令.
指定执行存取而不是读存取,您可以限制但不能禁止目录存取.
对目录的执行存取准许您检查和读取您知道包含在这个目录中的文件;这意味着如果您已经知道一个文件的文件说明,您就可以检查它,但是您不能列出这个目录的文件.
有关安全的详情,请参阅OpenVMSGuidetoSystemSecurity.
4.
5使用通配符搜索目录结构从目录结构的任何一点,您可以查阅这个结构的另一个目录或子目录.
特别指出目录或子目录或者使用省略号(.
.
.
)和连字号(-)通配符,您可以做这件事.
有关通配符的详情,请参阅3.
2节.
如果您工作在支持扩展文件说明的环境中,要知道使用通配符搜索目录结构的详情,请参阅第5章.
4.
5.
1省略符号通配符使用省略号(.
.
.
)通配符可向下搜索目录层次.
要搜索当前目录和它之下的所有子目录,使用省略号,如下所示:$DIRECTORY[.
.
.
]如果用一个省略号开始目录说明,从当前目录开始搜索.
然而,如果您用一个句点开始目录说明,则只搜索比当前目录低一级的子目录.
要从您当前所在目录结构的位置搜索所有顶级目录和它们的子目录,使用一个星号(*)后面跟随一个省略号(.
.
.
).
在以下例子中,假定当前目录是[JONES],则将显示在[JONES]和[JONES]之下所有子目录中所有名为FEES.
DAT文件的最近版本:$TYPE[JONES.
.
.
]FEES.
DAT在以下例子中,假定当前默认目录是[JONES],则将搜索所有末端为.
SALES的子目录,并显示文件FEDERAL.
LIS的最近版本:$TYPE[.
.
.
SALES]FEDERAL.
LIS在以下例子中,显示在[JONES]和[JONES]之下所有子目录中名为DEPT.
DAT的所有文件的最近版本:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$TYPE[.
.
.
]DEPT.
DAT在以下例子中,假定当前目录是[JONES],则将搜索[.
LICENSES]子目录中的文件MAILING.
LIS,但不搜索[JONES.
LICENSES.
MARRIAGE]:$TYPE[.
LICENSES]MAILING.
LIS在以下例子中,假定当前目录是[JONES],则显示在[JONES]之下的[.
LICENSES]子目录中和在[.
LICENSES]子目录之下的所有子目录中的所有名为DEPT.
DAT的文件的最近版本:$TYPE[.
.
.
LICENSES.
.
.
]DEPT.
DAT在以下例子中,(如果存在)将搜索8级目录名(顶级目录和第7级子目录).
注意,展示的命令需要READALL特权.
$DIRECTORY[*.
.
.
]4.
5.
2连字号(-)子目录字符连字号字符作为缩写方法指定在当前进程的默认目录之上的(子)目录.
每个连字号表示一级.
连字号后面可以跟随子目录名(带分开句点)来指定更深目录层次的其他路径.
如果您输入太多连字号,以致于引用点超出顶级目录,那么系统将显示出错消息.
在以下例子中,当前进程的默认目录是[JONES.
LICENSES].
以下命令显示[JONES]中STAFF.
DIS的最近版本:$TYPE[-]STAFF.
DIS在以下例子中,当前目录是[JONES.
LICENSES].
展示的命令显示[JONES.
TAXES]中BILLING.
DAT的最近版本:$TYPE[-.
TAXES]BILLING.
DAT在以下例子中,展示的命令把进程默认目录更改到目录层次中比当前级高2级的目录.
$SETDEFAULT[--]UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在OpenVMSV7.
2Alpha或以后支持ODS-5磁盘的版本中,文件名和子目录名可以单独由连字号组成.
要区别其名称包括连字号的(子)目录和相对文件说明,前者必须至少用一个RMS换码符(^)指定.
以下说明引用比当前进程的默认目录高3级的目录.
[---]以下说明引用目录(UFD)"---":[^---]4.
6按UIC格式处理目录虽然本章集中在如何使用命名目录,您也可以按UIC格式指定目录名.
在UIC格式中,2部分的八进制数构成用户标识码(UIC),它指向用户文件目录(UFD).
几乎每个接受文件说明的DCL命令都可以识别UIC格式的目录名.
一般而言,您不需要使用这个格式,除非您是使用实时资源共享执行(RSX)操作系统.
UIC目录说明有以下格式:[group,member]例如,[122,1]是一个UIC目录说明,表示组122中的成员1.
UIC格式的目录名一般是对应于目录拥有者的UIC,但不一定.
当您引用UIC目录时,请遵守以下规则:使用一个1至37776的八进制数指定组.
使用一个0至177776的八进制数指定成员.
不使用连字号(-)或省略号(.
.
.
)通配符作为说明部分.
4.
6.
1使用通配符指定UIC目录也有可能使用星号(*)通配符来指定一个UIC目录.
例如,[*,6]指出所有带任何组号和成员号6的目录.
该搜索限于UIC格式的目录.
目录说明[*,*]找出所有UIC格式的目录.
如同找出所有UIC格式的目录,要找出所有命名的目录,可使用[*].
4.
6.
2把UIC格式转化为命名格式注意,可以把目录名从UIC格式翻译为命名格式.
如果有必要的,则在组号和成员号的左边添加零来建立6字符的名称.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum不能混合使用UIC格式和命名格式.
如果有一个UIC格式名的目录,但要指定它的一个子目录,则要把UIC格式翻译为命名格式.
UIC目录说明[122,1]的等价命名格式如下所示:[122001]要引用子目录[122,1]SUB.
DIR,可使用命名目录[122001.
SUB].
第5章扩展文件说明OpenVMSAlphaV7.
2执行扩展文件说明,它包括两个主要的组件:可选卷结构,即On--DiskStructureLevel5(ODS-5),它支持较长的文件名,包括更大范围的合法字符深目录总之,这些组件为OpenVMSAlpha系统(使用OpenVMS高级服务器)提供更大的灵活性,来存储、管理、服务和存取具有类似于Windows环境中名称的文件.
深目录和扩展文件名提供以下好处:OpenVMS用户可以使用长文件名、新的字符支持和使用小写字母和大小写混写文件名.
这些新能力使OpenVMS文件服务器上的文件活动对于Windows用户更加透明.
OpenVMS系统管理员可以在OpenVMS系统上使用Windows用户指定的名称阅读文件.
从其他支持深目录的环境移植应用程序的应用程序开发者可以使用OpenVMS的并行结构.
5.
1ODS-5卷结构On--DiskStructure(ODS)是指信息存储在磁盘的逻辑结构.
ODS-2是OpenVMS操作系统的默认磁盘结构.
ODS-5是ODS-2的超集,对多平台环境特别有用.
ODS-5卷结构提供:长文件名文件名中更多的合法字符保留文件名的字母大小写5.
1.
1长文件名UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum传统的(ODS-2)文件说明符合39.
39格式,只支持单个句点(.
)分开文件名和文件类型.
在ODS-5卷中,文件名与文件类型一起长度可多达236个8位字符,或者118个16位字符.
1例如:$CREATEThis.
File.
Name.
Has.
A.
Lot.
Of.
Periods.
DAT$CREATE-_$ThisIsAVeryLongFileName^&ItWillKeepGoingForLotsAndLotsOfCharacters.
Exceed-_$ingThe39^,39presentInPreviousVersionsOfOpenVMS$DIRECTORYDirectoryTEST$ODS5:[TESTING]ThisIsAVeryLongFileName^&ItWillKeepGoingForLotsAndLotsOfCharacters.
ExceedingThe39^,39presentInPreviousVersionsOfOpenVMS;1This^.
File^.
Name^.
Has^.
A^.
Lot^.
Of^.
Periods.
DAT;1共2个文件.
5.
1.
2文件名中更多合法字符传统(ODS-2兼容的)文件名可以使用字母数字字符(A-Z、a-z和0-9)、美元符($)、下划线(_)和连字号(-).
ODS-5提供更宽的字符集用于命名文件.
ISOLATIN-1和Unicode(UCS-2)字符集ODS-5支持文件名使用8位ISOLatin-1字符和16位Unicode(UCS-2)字符集.
ISOLatin-1多国字符集是传统ASCII字符集的超集.
在扩展文件说明中,您可以使用8位ISOLatin-1多国字符集的所有字符,但星号(*)和问号()除外.
特殊字符在文件说明中,有些ISOLatin-1字符需要一个换码符在它们之前,使之能够被正确解释.
在扩展文件名中,RMS和DCL把音调符号(^)解释为换码符.
下表包含换码符的使用规则:换码符(^)后面跟随一个下划线(_)或空格表示一个空格.
换码符(^)后面跟随以下任何字符意味着该字符用作文件名的一部分,而没有任何特殊的含义,尽管它在文件说明中可以有特殊含义:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在文件名中,可以带或不带换码符(^)地输入一个文字句点(.
).
系统为任何句点添加换码符,否则这些句点要用作文件类型和版本号的定界符.
在目录名中必须在文字句点(.
)之前加上换码符.
换码符后面跟随一个十六进制数字需要第二个十六进制数字.
把两个后面跟随的字符解释为一个表示任意单字节字符的十六进制值.
例如,^20表示一个空格.
在文件说明中,换码符后面跟随"U"指出后面跟随的4个十六进制数字要解释为Unicode字符.
例如,^U012F.
在文件说明中,所有前面没有加上换码符(^)的字符被认为是ISOLatin-1字符.
注意VAX系统不能存取包含特殊字符的文件名.
有关混合构造环境的详情,请参阅5.
7节.
解释句点(.
)在扩展文件名中把句点(.
)用作一个文字字符需要RMS确定哪一个句点是文件名字符和哪一个是定界符.
当在扩展文件名中只使用一个句点(.
)时,这个句点解释为定界符.
如同OpenVMS的以前版本,如果单个句点后面跟随一个数,也出现这种现象:$CREATETest.
1建立文件:Test.
1;1确定版本号当文件名中有多个句点(.
)时,RMS查看最后一个句点之后的所有字符.
如果那么在最后一个句点后的字符都是数字数字串被确定为版本号在最后一个句点后的字符是所有数字和前导一个减号(-)数字串被确定为版本号在最后一个句点后有5个以上数字字符RMS认为是非法文件名有一个非数字字符跟随最后一个句点被解释为文件类型定界符例如,以下命令:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$CREATETest4.
3.
2.
1建立文件:Test4^.
3.
2;1在此,2是文件类型,而1是文件版本号.
明确用分号(;)定界的版本号也必须不多于5个数字字符,并且前面可以加上一个减号(-).
5.
1.
3保留字母大小写OpenVMS以前版本中,DCL和RMS的把所有文件说明转换为大写字母.
在ODS-5卷上,您可以以大写、小写或混合字母大小写输入文件名.
所有文件名的字母大小写保持建立时候的形式.
例如:$CREATEKitContents.
Txt$DIRECTORY目录DISK1:[USER1]KitContents.
Txt;1当您以相同名称建立多个文件,而只是字母大小写不同时,DCL把后续文件处理为原始文件的新版本,并把它们转换为与原始文件相同的字母大小写.
例如:$CREATECaPri$CREATECAPRI$CREATEcapri$DIRECTORY目录DISK1:[USER1]CaPri.
;1CaPri.
;2CaPri.
;35.
1.
4使用通配符UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumODS-5文件支持单个和多个字符通配符功能.
单字符通配符精确地表示文件名或文件类型中的一个字符,但是不能使用在文件版本字符串中.
多字符通配符可以表示文件名或文件类型中任何数目的字符(包括零个字符).
多字符通配符可以用于代替版本字符串.
5.
1.
4.
1通配符以下字符总是有效的通配符:星号(*)是多字符通配符.
百分号(%)是单字符通配符.
问号()是单字符通配符.
百分号(%)继续作为单字符通配符是为了维护与现有应用程序的相容性.
当前面加上音调符号(^)时,百分号(%)可以使用为一个文字字符,而且在Windows文件名中它也是文字字符.
除百分号之外,RMS也把问号()识别为单字符通配符.
在OpenVMS7.
2和以后版本中,问号作为通配符,功能等同于百分号.
在搜索式样中,每个百分号和问号精确地匹配一个字符.
注意在通配符匹配时,换码字符(如^.
)或换码序列(如^EF或^U0101)被认为是单个字符.
注意1未修改的程序和公用程序可能把完整文件说明限制或缩写到255个字节.
5.
1.
4.
2通配符语法虽然DCL保持扩展文件名的字母大小写,通配符匹配是与字母大小写无关的.
用通配符搜索的操作继续匹配于目标文件同样部分的相应字符.
表5-1包含一些通配符搜索的例子.
表5-1通配符和匹配式样示例式样.
.
.
匹配.
.
.
.
.
.
但不匹配UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumA*B;*AHAB.
;1A.
B;1A.
*.
B*A^.
DISK.
BLOCK;1A^.
C^.
B.
DAT;1AB.
TXT;*A^.
B.
TXT;5A^.
^.
B.
TXT;1*.
DATLots^.
of^.
Periods.
dat;1DAT.
;1Milno.
datMilano.
dat;1Millaano.
dat;1NAPOLI.
.
DATnapoli.
q.
dat;1napoli.
abc77.
dat;15.
2深目录结构在OpenVMSAlpha上,ODS-2和ODS-5卷结构两者都支持深的目录嵌套,如下所示:可以有多达255级目录.
在ODS-2中,目录名格式是39.
39.
在ODS-5中,每个目录名长度可以有多达236个8位或118个16位字符.
例如,可以建立以下深嵌套的目录:$CREATE/DIRECTORY[.
a.
b.
c.
d.
e.
f.
g.
h.
i.
j.
k.
l.
m]在ODS-5卷上,可以建立以下长名目录:$CREATE/DIRECTORY[.
AVeryLongDirectoryNameWhichHasNothingToDoWithAnythingInParticular]RMS要缩写比255个字节要长的完整文件说明,使未修改的应用程序可以使用.
5.
2.
1目录命名语法在ODS-5卷上,目录名符合大多数使用ISOLatin-1字符集命名文件名时同样约定.
句点和特殊字符可以出现在目录名中,但是在有些情况下,它们前面必须加上一个音调符号(^),以便把它们识别为文字字符,如表5-2所示.
表5-2ODS-5卷上的目录名CREATE/DIRECTORY.
.
.
结果[Hi^&Bye]Hi^&Bye.
DIR;1[[Lots^.
Of^.
Periods^.
In^.
This^.
Name]Lots^.
Of^.
Periods^.
In^.
This^.
Name.
DIR;15.
2.
2目录ID和文件ID缩写UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在有些环境下,完整文件说明可能包含比255字节更多的字符,以致于未修改的应用程序不能使用.
如果在这样应用程序中的文件说明需要超过255字节长度,那么RMS将产生一个较短的文件说明,方法是把目录缩写为目录ID(DID),以及如果必要,把文件名缩写为文件ID(FID).
当文件说明太长时,RMS首先使用它的目录ID标识目录尝试产生一个较短的目录说明.
这个较短的说明称为DID.
TEST$ODS5:[5953,9,0]Alghero.
TXT;1注意,这种格式的目录名必须有三个数目和两个逗号,以避免UIC格式目录名的二义性.
使用DIRECTORY命令可以观看文件说明的较短DID版本和完整版本.
5.
3使用DCL的扩展文件说明分析特性文件名的默认DCL分析样式是用于ODS-2式样文件名.
在DCL命令行上使用扩展文件名时,需要把分析样式设置为EXTENDED才可接受和显示扩展文件说明.
要设置分析样式,输入命令:$SETPROCESS/PARSE_STYLE=EXTENDED注意,这个命令在OpenVMSVAX系统上没有效果.
在输入这个命令后,DCL可接受类似以下的文件名:$CREATEMY^[FILE有关详情,可参阅OpenVMSDCLDictionary:N--Z对SETPROCESS/PARSE_STYLE命令的描述.
要重新设置DCL的默认分析样式,输入以下命令:$SETPROCESS/PARSE_STYLE=TRADITIONAL在输入这个命令后,DCL只接受ODS-2文件名格式.
5.
4能够使用扩展文件说明的地方UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum有些DCL命令和OpenVMS公用程序完全支持扩展文件说明.
它们已被修改为利用扩展文件名的所有特性.
它们可以接受和处理扩展文件说明,而不会出错,并且不会修改字母大小写.
另外,它们可以接受和产生超过传统255字符限制的长文件说明,使之保存为原始格式1--而不需要把它们缩写为目录ID(DID)或文件ID(FID)的格式.
默认支持的DCL命令和OpenVMS公用程序很少或没有修改来利用扩展文件名.
预期这些公用程序和命令会正确地处理扩展文件说明的大多数属性(例如新的字符和深目录结构).
然而,它们可能会以错误的大小写建立或显示文件名.
与完全支持的公用程序相反,默认支持的公用程序依赖于RMS提供的DID和FID缩写来处理长文件说明.
结果,这些公用程序服从以下与DID和FID缩写相关的限制:在使用FID缩写环境中的匹配操作可能不会总是如预期那样工作.
例如,通配符匹配操作可能不能找出所有目标文件名,因为长文件名可能表示为数字的FID缩写格式.
这种限制特别适用于在RMS之外执行的匹配操作.
通配符和默认不能与FID缩写一起使用.
例如,以下命令是非法的:$DIRECTORYa[1,2,3]*.
txt$COPYa[1,2,3].
txt*.
txt2因为FID缩写是文件唯一的数字表示式,它不能用来表示或匹配任何其他文件.
使用FID缩写建立文件是非法的.
有关DID和FID缩写的详情,请参阅GuidetoOpenVMSFileApplications.
有关特定命令或公用程序的详情,请参阅OpenVMS文档集中适当的手册.
不支持扩展文件命名不支持扩展文件名的OpenVMS公用程序和命令可以在ODS-5卷上正常工作;然而,它们受限于只处理传统的文件说明.
在ODS-5卷上,应该小心地使用这些公用程序和命令,因为Compaq不能确保它们遇到扩展文件说明时能否成功操作.
不支持ODS-5不支持ODS-5卷结构的OpenVMS公用程序和命令不能处理扩展文件名.
在ODS-5卷上,应该小心地使用这些公用程序和命令,因为Compaq不能确保它们能否成功操作,即使当它们只是处理传统的文件说明.
表5-3列出因扩展文件名或ODS-5的限制而不支持扩展文件说明的OpenVMS公用程序和命令.
表5-3不支持的OpenVMS组件UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum组件注解不支持ODS-5磁盘碎片整理程序不支持,除非有一个已更新支持ODS-5卷的特定碎片整理工具文档.
1不支持扩展文件命名代码编译程序不能对目标文件使用扩展文件名.
然而,代码编译程序可以建立支持扩展名的应用程序.
INSTALL已知映象不要把有扩展文件名的映象安装为已知映象.
LINK不能输出具有扩展文件名的映象.
MONITOR不能可靠地处理扩展文件名.
网络文件(NET*.
DAT)不要改名为一个扩展文件名.
目标模块(.
OBJ)不要改名为一个扩展文件名.
页和交换文件不要使用扩展文件名.
SYSGEN不要写入具有扩展文件名的参数文件.
系统启动文件不要改名为一个扩展文件名.
1注意,DFO已被修改以支持ODS-5卷.
注意1如果您在DCL命令行中键入长文件说明,DCL仍然限制命令行长度为255字节.
5.
5显示扩展文件名的文件有些DCL命令有以下新限定词控制扩展文件名的显示:/STYLE=[CONDENSED|EXPANDED]这个限定词允许您控制修改的DCL命令如何显示扩展文件名和任何关联的提示.
关键字CONDENSED显示建立文件时的文件说明,适合许多公用程序所要求的255字节字符串的限制.
必要时,这个文件说明可能包含DID缩写或FID缩写.
关键字EXPANDED完整地显示存储在磁盘上的文件说明,并且不包含DID缩写或FID缩写.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum以下几节包含DIRECTORY、TYPE、PURGE和DELETE命令使用/STYLE限定词的例子.
5.
5.
1DIRECTORY命令当观看目录内容时,DIRECTORY命令允许您选择以什么格式显示文件名:DIRECTORY/STYLE=(关键字[,关键字])按照默认,DIRECTORY命令必要时使用DID显示文件名,而不必使用DID时则显示完整的目录说明,如同您在以下例子中看到的样子:$DIRECTORY目录TEST$ODS5:[23,1,0]abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXY.
abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrst;2共1个文件.
目录TEST$ODS5:[TEST.
RANDOMTESTING.
RANDOM]AddressFiles.
DIR;1LOGIN.
COM;3test.
1;1test^.
1.
clue;1Travel.
LIS;1whee.
;5work.
dat;8共8个文件.
总计2个目录,9个文件.
DIRECTORY命令在/STYLE限定词中使用这两个关键字,可产生两列目录列表.
每列列出所有文件名.
CONDENSED列包含任何需要的DID或FID,而EXPANDED列包含完整目录名和文件名.
任何文件出错显示在CONDENSED列.
以下例子展示DIRECTORY命令在/STYLE限定词中使用这两个关键字的结果:$DIRECTORY/STYLE=(CONDENSED,EXPANDED)目录TEST$ODS5:[23,1,0]TEST$ODS5:[TEST.
RANDOMTESTING.
RANDOM]UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumabcdefghijklmnopqrstuvwxyABCDEFGHIJabcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYabcdeuvwxyABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOfghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXY.
abcdefghijklmnopqrstuvwxPQRSTUVWXY.
abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYabcdefghiyABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrst;2jklmnopqrst;2AddressFiles.
DIR;1AddressFiles.
DIR;1LOGIN.
COM;3LOGIN.
COM;3test.
1;1test.
1;1test^.
1.
clue;1test^.
1.
clue;1Travel.
LIS;1Travel.
LIS;1whee.
;5whee.
;5work.
dat;8work.
dat;8共8个文件.
DIRECTORY命令可以在/STYLE限定词中使用一个或两个关键字.
5.
5.
2TYPE命令当显示文件和提示时,TYPE命令接受/STYLE限定词选择显示在系统消息中的文件名格式:$TYPE/STYLE=(keyword)这个例子展示TYPE命令使用TYPE=EXPANDED和CONFIRM限定词:$TYPE/CONFIRM/STYLE=EXPANDEDabc*.
*rst;2TYPETEST$ODS5:[TEST.
RANDOMTESTING.
RANDOM]abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrstuvwxyzGHIJKLMNOPQRSTUVWXYabcdefghijklmnopqrst;2[N]:YUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum[Systemoutputscontentsoffile]5.
5.
3DELETE命令DELETE命令接受/STYLE限定词,选择执行该命令时显示的文件名格式:$DELETE/STYLE=(keyword)在以下例子中,省略号(.
.
.
)表示在文件名中的许多字符.
这些例子使用CONFIRM限定词产生系统消息.
DELETE使用默认值(CONDENSED):$DELETE/CONFIRMabc*.
*.
*DELETETEST$ODS5:[TEST.
RANDOMTESTING.
RANDOM]abcAlphabet.
stuff;1[N]:YDELETETEST$ODS5:[23,1,0]abcdefg.
.
.
QRSTUVWXY.
abcdefg.
.
.
tuvwxy;1[N]:Y如果需要完整文件说明,DELETE命令与/STYLE限定词和EXPANDED关键字一起使用:$DELETE/CONFIRM/STYLE=EXPANDEDabc*.
*.
*DELETETEST$ODS5:[TEST.
RANDOMTESTING.
RANDOM]abcAlphabet.
stuff;1[N]:YDELETETEST$ODS5:[TEST.
RANDOMTESTING.
RANDOM]abcdefg.
.
.
QRSTUVWXY.
abcdefg.
.
.
tuvwxy;1[N]:Y5.
5.
4PURGE命令PURGE命令接受/STYLE限定词,选择执行该命令时显示的文件名格式:$PURGE/STYLE=(keyword)在以下例子中,省略号(.
.
.
)表示在文件名中的许多字符.
这些例子使用CONFIRM限定词产生系统消息.
PURGE使用默认值(CONDENSED):UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$PURGE/CONFIRMDELETETEST$ODS5:[23,1,0]abcdefg.
.
.
QRSTUVWXY.
abcdefg.
.
.
tuvwxy;1[N]:Y如果需要完整文件说明,PURGE命令与/STYLE限定词和EXPANDED关键字一起使用:$PURGE/CONFIRM/STYLE=EXPANDEDDELETETEST$ODS5:[TEST.
RANDOMTESTING.
RANDOM]abcdefg.
.
.
QRSTUVWXY.
abcdefg.
.
.
tuvwxy;1[N]:Y5.
6终端显示扩展文件名要显示扩展文件名,终端必须设置为显示ISOLatin-1字符集.
否则,终端显示的字符可能不匹配PC展示的效果.
要观看或更改终端显示的字符集,使用终端设置对话框.
选择显示字符集的任选项通常可以在General标签处找到.
DEC多国字符集和ISOLatin-1字符集的不同字符列在附录A中.
5.
7在混合环境下工作如果系统运行OpenVMSAlphaV7.
2或更高版本,您可以利用在ODS-5卷上的所有扩展文件说明的能力.
您也可以继续存取V7.
2之前版本的文件和目录.
例如,您可以做以下所有事情:在ODS-2卷上建立和存取深目录结构读取在OpenVMS早期版本建立的BACKUP保存集把ODS-5名的文件复制到运行OpenVMS早期版本的系统上ODS-2名的文件如果工作在混合版本或混合体系机构的OpenVMSCluster环境中,会有一些限制.
运行OpenVMS以前版本的系统不能装上ODS-5卷、正确地处理扩展文件名或者看到扩展文件名.
在OpenVMSV7.
2以前版本的用户不能存取在ODS-5卷上的任何文件.
这确实如此,不管该卷是否物理连接到CI或SCSI总线,或者通过MSCP或QIO服务器.
这些用户也不能建立或恢复ODS-5映象的保存集.
然而,他们可以从ODS-5保存集中恢复ODS-2兼容的文件名.
OpenVMSV7.
2VAX系统局限于以下扩展文件说明功能:装上ODS-5卷的能力.
在ODS-5卷上写入和管理ODS-2兼容文件的能力.
存取ODS-5文件说明时,查看假名(\pISO_LATIN\.
或\pUNICODE\.
)的能力.
工作在包含OpenVMSAlpha和OpenVMSVAX系统的环境下时,知道以下事情是重要的:系统类型和操作系统版本UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum默认目录是基于ODS-2还是基于ODS-5建立文件的目的地是ODS-2卷还是ODS-5卷OpenVMS7.
2允许VAX系统装上ODS-5卷;然而,在OpenVMSVAX系统中的用户只可以存取ODS-2兼容文件名的文件.
在OpenVMSAlpha系统上,您可以挑选是否把一个卷转换为ODS-5.
如果工作在ODS-2和ODS-5卷的混合环境,那么在ODS-5卷上建立文件时应当紧记ODS-2文件名的限制.
如果要把一个在其文件名中有特殊字符的文件从ODS-5复制到ODS-2卷,您必须给它一个ODS-2兼容的名称.
第6章使用磁盘和磁带驱动器本章描述在OpenVMS系统中处理磁盘和磁带驱动器的一般概念.
任何连接到OpenVMS系统的外围设备称为设备,包括磁盘和磁带驱动器.
注册时,您自动准予存取默认设备和目录.
您也可以存取公用设备和目录.
在大多数情况下,系统管理员设置和维护用户组共享的设备.
如果有一个供您个人使用的驱动器,您需要知道如何分配、初始化和装上它.
本章为那些将实现自己的磁盘和磁带驱动器存取的用户,论述以下概念:物理设备名显示设备信息逻辑设备名类属设备名OpenVMS簇设备名卷和卷集设备管理欲知详情,请参阅:OpenVMSDCLDictionary或联机求助,论述本章命令详情OpenVMSSystemManager'sManual,Volume1:Essentials,关于使用设备的详情OpenVMSSystemManagementUtilitiesReferenceManual,关于MOUNT命令的详情OpenVMSClusterSystems,关于OpenVMS簇环境中设备的详情6.
1物理设备名系统所知的每个物理设备通过物理设备名唯一地标识.
物理设备名标识设备类型;例如,一个磁盘驱动器或终端.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum多数物理设备名包括:设备代码,表示硬件类型控制器指示符,标识连接设备的硬件控制器单元号,标识在特定控制器上的一个设备.
VTA12、FX09和DAD44是设备名的例子.
有关特定设备命名格式的详情,请参阅OpenVMSSystemManager'sManual.
6.
2显示设备信息要显示系统设备的信息,输入SHOWDEVICES命令.
要获得特定设备的附加信息或信息,按以下方法之一输入SHOWDEVICES命令:要检查已装上卷的密度、卷标、UIC和相对卷号,输入SHOWDEVICES/FULL命令.
要显示系统配置的特定类型的所有驱动器的信息,指定类属设备代码(例如,SHOWDEVICESDK).
要显示装在特定驱动器上的某个卷信息,指定物理设备名(例如,SHOWDEVICESDKA1).
在以下例子中,SHOWDEVICES命令显示有关DAD40的信息:$SHOWDEVICESDAD40设备设备错误卷未用事项装上名称状况计数标号块计数计数DAD40:装上写锁定0CHICAGO540088116.
3逻辑设备名系统管理员可以设置逻辑设备名表示系统上的设备.
逻辑设备名是用一个简短、有意义名称表示含义有点模糊的的设备名.
您可以使用这些逻辑设备名,代替物理设备名来引用设备.
第11章详细地描述如何使用逻辑名.
6.
4类属设备名类属设备名包括设备代码但省略特定的控制器或单元号.
在MOUNT或ALLOCATE命令中使用类属设备名时,系统找出第一个其物理名满足指定类属设备名部分的可用控制器或设备单元.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果为任何其他命令指定类属设备名,则应用以下默认:如果省略控制器指示符,假定它是A.
如果省略单元号,假定它是0.
6.
5OpenVMS簇设备名OpenVMS簇设备名包括连接该设备的节点名和物理设备名,用美元符($)分开.
例如,ROXXY$DUA1引用节点ROXXY的磁盘DUA1.
作为一般规则,总是使用节点分配级设备名标识双路径的OpenVMS簇磁盘.
它是所有OpenVMS簇节点总是能识别的唯一名称.
有关在OpenVMS簇环境中使用设备名格式的详情,请参阅OpenVMSClusterSystems.
如果设备是双路径的(连接到两个节点),那么按以下格式指定OpenVMS簇设备名:$node-allocation-class$ddcu各元素是:node-allocation-class一个分配给连接双路径设备的节点的值.
例如,$1$DJA16标识一个在两个节点之间的双路径磁盘,两个节点都有一个其值为1的节点分配级.
dd表示硬件设备类型的设备代码(例如,设备代码DK表示RZ23磁盘).
c标识连接设备的硬件控制器.
控制器指示符与单元号一起,标识系统硬件配置中设备的位置.
控制器用字母A至Z指定.
u唯一地标识特定控制器上设备的单元号.
单元号是从0至65535的十进制数.
6.
6卷和卷集OpenVMS操作系统把磁盘和磁带识别为卷,而与它们占用的实际硬件驱动器分开.
卷是数据有组织的集合.
系统也识别卷集.
一个卷集包括两个或更多相关的卷.
把卷添加到同一个卷集而不是定义多个新卷,把卷捆绑到一个卷集允许您扩展可用于文件的空间.
建立卷集的过程(与单卷不同)在OpenVMSSystemManager'sManual中描述.
6.
7设备管理如果您有一个专用的磁盘驱动器,您应该熟悉它的设置步骤,如下所示:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum步骤任务1使用DCL命令ALLOCATE把磁盘驱动器分配给进程.
2使用DCL命令INITIALIZE格式化磁盘卷,如有需要在卷上写入标号.
3使用DCL命令MOUNT使进程可存取卷和它包含的文件或数据.
6.
7.
1分配设备分配设备时,进程将独占使用这个设备.
设备保持分配给您的进程,直到您明确地释放它(使用DCL命令DEALLOCATE)或者直到您注销.
要把磁盘或磁带驱动器分配(本地分配)给进程,使用DCL命令ALLOCATE.
ALLOCATE命令的格式如下所示:ALLOCATEdevice-name[logical-name[:]]各元素如下所示:device-name指定装入卷的驱动器.
其名称可以是物理名、类属名或逻辑名.
logical-name指定与该设备关联的可选逻辑名.
6.
7.
2初始化卷初始化磁盘或磁带卷就是使之格式化.
在每次使用卷前,您不需要做这一步.
在第一次使用之前和您要完全擦除它的时候才初始化卷.
要初始化卷,使用DCL命令INITIALIZE执行以下操作:在卷上建立新的文件结构.
在初始化进程中,将删除存储在磁盘上的任何数据.
在卷上写入一个标号来标识它.
为该卷定义拥有者UIC和保护.
注意INITIALIZE命令不会阻止您初始化另一个用户的卷;在确信要初始化的卷是您自己的卷之后,在您初始化该卷之前分配该设备.
如果您把一个卷交给另一个用户初始化(例如,如果您缺乏足够的特权做这件事),您应该提供这个卷的卷标、拥有者UIC和保护码.
INITIALIZE命令的格式如下所示:INITIALIZEdevice-name[:]volume-labelUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum各字段如下所示:device-name指定物理地装上卷的设备名.
volume-label标识卷.
可以为磁盘卷指定多达12个字母数字字符或为磁带卷指定多达6个字母数字字符.
初始化磁盘卷按照默认,初始化命令在新卷上建立一个Files--11结构.
OpenVMS操作系统初始化磁盘卷的默认格式称为Files--11On-DiskStructureLevel2.
初始化命令也可以初始化磁盘卷为Files--11On-DiskStructureLevel1.
对于空白磁盘卷(即该卷从来没有被写入内容)或您当前UIC或UIC[0,0]拥有的磁盘卷,您不需要用特殊特权取代其逻辑保护.
在所有其他情况下,必须有用户特权VOLPRO才能初始化磁盘卷.
以下例子初始化DKA300上的卷,并把该卷标号为ACCOUNTS:$INITIALIZEDKA300:ACCOUNTS6.
7.
3装上卷在分配了磁盘卷后,需要装上它才能使用它的文件.
DCL命令MOUNT使您的进程可存取卷和它包含的文件输入MOUNT命令时,系统验证以下条件:该设备没有被另一个用户分配.
该设备保护允许您分配设备.
卷已物理上装入在指定设备上.
卷标号匹配指定的标号.
您可以装上单个卷或一个卷集.
建立和装上卷集(与单个卷不同)的过程在OpenVMSSystemManager'sManual中描述.
MOUNT命令格式如下所示:MOUNTdevice-name[volume-label[logical-name[:]]各元素如下所示:device-name指定要装上卷的设备的物理设备名或逻辑名.
volume-label指定初始化卷的标号.
如果使用MOUNT限定词以下之一:/FOREIGN、/NOLABELUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum或/OVERRIDE=IDENTIFICATION,则不需要指定卷标.
logical-name定义与设备关联的名称.
如果省略逻辑名,那么MOUNT命令分别把默认逻辑名DISK$volume-label和TAPE$volume-label分配给磁盘和磁带驱动器.
6.
7.
4请求操作员协助操作员可以执行物理装上(和卸下)系统和专用卷.
如果要使用的卷已经放置在驱动器上,则不需要操作员的协助.
MOUNT消息发送给所有允许接收TAPE和DISK消息的操作员.
例如,如果装上磁盘设备需要操作员协助,那么一条消息将发送给磁盘管理员.
如果没有操作员(不允许操作员)接收和响应MOUNT请求,则显示一条消息通知您出现什么情况.
您也可以指定/NOASSIST限定词避免操作员的协助.
这里展示的MOUNT命令通知操作员您的装上请求,并在您的终端上显示一条消息:$MOUNTDKA300:DISKVOL1%MOUNT-I-OPRQST,PLEASEMOUNTDEVICE_MARS$DKA300:在成功装上设备后,通知您以下消息:%MOUNT-I-MOUNTED,DISK已装在_DKA300:以下例子展示如何分配、初始化和装上一个磁盘卷:$ALLOCATEDKA300:TEMP%DCL-I-ALLOC,_MARS$DKA300:已分配$INITIALIZETEMP:BACKUP_FILE$MOUNTTEMP:BACKUP_FILE%MOUNT-I-MOUNTED,BACKUP_FILE已装在_DKA300:$CREATE/DIRECTORYTEMP:[ARCHIE]您必须建立一个目录,才可以把任何文件放置在卷上,如CREATE/DIRECTORY命令所示.
装上外部磁盘卷要装上一个外部磁盘卷(即其文件结构不同于Files--11),使用/FOREIGN限定词.
例如:$MOUNT/FOREIGNDISK%MOUNT-I-MOUNTED,BACKUP_FILE已装在DISK$DMA2:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumMOUNT/FOREIGN命令使系统可使用您的卷的内容,但没有假定它的文件结构.
在前面的例子中,MOUNT报告一个卷标,指出磁盘具有Files--11结构,尽管它被装上为一个外部设备.
如果没有识别出磁盘的文件结构,MOUNT不显示标号.
注意,您需要有用户特权VOLPRO才能使用/FOREIGN限定词装上一个Files--11结构的磁盘,除非它的拥有者UIC匹配于您自己的UIC.
6.
8存取专用设备上的文件要存取专用设备的文件,您必须指定这个设备名,或者使用SETDEFAULT命令把默认设置到这个设备和目录名.
可以使用物理的、逻辑的或类属名引用设备.
另外,如果您的系统是OpenVMS簇系统的一部分,某些设备对OpenVMS簇系统的所有成员是可存取的.
要存取磁带卷集上的文件,指定任何已分配给它的设备.
虽然您可以打印自己专用卷上的文件,但是包含打印文件的卷必须保持装上,直到打印文件完成.
有些命令接受输出文件说明.
可以使用面向记录的设备名(如打印机或终端)替换输出文件说明.
例如:$COPYDFILE.
DATTTB4:该COPY命令把文件DFILE.
DAT发送给命名为TTB4的终端.
终端每次一条记录地接受和显示文件.
把设备名用作一个文件说明时,在设备名后面跟随一个冒号(:).
6.
8.
1卸下卷使用完磁盘或磁带卷上的文件时,可用DISMOUNT命令卸下这个卷.
在卷卸下之前,DISMOUNT命令检查阻止卸下的条件.
例如,如果这个卷包含安装的交换和页文件、安装的映象或打开的用户文件,那么DISMOUNT显示一条出错消息指出不能卸下这个卷.
按照默认,DISMOUNT命令自动从驱动器卸除卷.
如果计划在卸下一个卷后再次装上或将它初始化,那么使用/NOUNLOAD限定词可以节省时间并剔除对这个卷的不必要处理.
例如:$DISMOUNT/NOUNLOADMTA1:在这个例子中,磁带卷逻辑卸下并且磁带回卷,但是磁带保持物理装在驱动器MTA1上.
在物理地卸除卷之前,您总是应该使用DISMOUNT命令明确地卸下卷.
在除去卷之前,等待驱动器卸除它.
(输入DCL命令SHOWDEVICES,您可以验证已完成卸下.
)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果您注销装上卷的作业,这个卷将被自动卸下并卸除.
然而,如果系统失败,这个卷就不会自动卸下.
如果卸下的设备是使用ALLOCATE命令分配的,那么在使用DISMOUNT命令卸下它后,它仍然保持被分配的状态.
如果设备被MOUNT命令隐式地分配,那么DISMOUNT命令将释放它.
第7章使用Mail与其他人通信OpenVMSMail公用程序(MAIL)让您把消息发送给在您的系统上或使用CompaqTCP/IPforOpenVMS或DECnet网络连接到您的系统上的任何其他计算机上的其他用户.
本章描述:调用和退出Mail读取消息发送消息通过网络发送邮件发送消息给多个用户在Mail中处理文件发送消息的其他方法组织消息删除消息打印邮件消息保护邮件文件在Mail环境中使用文本编辑程序用户化您的Mail环境Mail命令概要使用MIME公用程序欲知详情,请参阅以下:在DCL提示下输入HELPMAIL命令或者在MAIL>提示下输入HELP命令,可获得有关Mail命令和限定词的详情.
OpenVMSSystemManager'sManual,有关控制通过用户帐户使用Mail的详情.
在DCL提示下输入HELPTCPIP_SERVICES,有关TCP/IP邮件命令和限定词的详情.
DigitalTCP/IPServicesforOpenVMSUser'sGuide,有关使用TCP/IP服务发送和接收邮件的详情.
下图展示邮件消息及其组件的样例.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum7.
1调用和退出Mail以下几节描述如何调用和退出Mail.
7.
1.
1调用Mail要调用Mail公用程序,输入DCL命令MAIL,如下所示:$MAILMAIL>一旦处于Mail公用程序,在MAIL>提示下通过输入适当命令然后按下Enter键,您可执行以下操作:读取邮件消息发送邮件消息答复邮件消息转发邮件消息把邮件消息组织到文件和文件夹删除邮件消息UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum打印邮件消息7.
1.
2退出Mail要退出Mail,在MAIL>提示下输入EXIT命令,如下所示:MAIL>EXIT$按下Ctrl/Z或使用QUIT命令,也可以退出Mail.
7.
2读取消息Mail把接收的消息存储在邮件文件中,其默认文件类型是.
MAI.
按照默认,在这个文件中,Mail提供两个文件夹存储旧的和新的消息.
新消息自动放置在名为NEWMAIL的文件夹;旧消息放置在名为MAIL的文件夹中.
在您读取新消息后,该消息自动从NEWMAIL文件夹移动到MAIL文件夹,除非您输入FILE、MOVE或DELETE命令.
在您读取所有新邮件消息并且选择另一个文件夹或退出Mail后,Mail删除NEWMAIL文件夹.
7.
2.
1读取新邮件当您注册到您的帐户并接收到一条邮件消息时,Mail会通知您.
例如,如果用户FELLINI发来消息,则显示通知如下:NewmailonnodeDOODAHfromSTONE::FELLINI(10:02:23)要读取新消息,调用Mail并在MAIL>提示下按下Enter键,如下所示:$MAILYouhave1newmessage.
MAIL>如果您有一条以上新消息,在MAIL>提示下按下Enter键可读取其他消息.
当您读取了所有新消息时,Mail发出消息"%MAIL-E-NOMOREMSG,nomoremessages"并且继续提示命令直到您退出Mail.
在Mail时,如果您接收到一条邮件消息,那么输入READ/NEW命令就可读取新消息.
7.
2.
2读取旧消息要重读在默认Mail文件夹中的旧邮件消息,使用以下过程:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum步骤任务1在MAIL>提示下输入SELECT命令.
例如:MAIL>SELECTMAILMail使您处于名为MAIL的文件夹中.
2要读取默认邮件文件夹中的第一条消息,在MAIL>提示下按下Enter键或输入READ命令.
Mail显示默认邮件文件夹中的第一条消息(1).
3要显示下一条消息,按下Enter键.
如果消息太长而不能在一屏显示,按下Enter键显示消息的后面部分.
要跳过消息的剩余部分并显示下一条消息,输入NEXT命令.
要读取默认MAIL文件夹中的特定消息,使用以下过程:步骤任务1在MAIL>提示下输入DIRECTORY命令.
要从列表中选择一部分消息,使用DIRECTORY命令限定词/FROM或/SUBJECT.
2在MAIL>提示下输入要读取的消息编号.
Mail显示选定的消息.
在以下例子中,DIRECTORY命令用来显示旧消息,然后标号为2的消息被选定读取:MAIL>DIRECTORYMAIL#FromDateSubject1STONE::FELLINI11-DEC-1999SalespresentationonMay112DOODAH::JONES11-DEC-1999StatusMAIL>27.
2.
3搜索消息如果有许多消息,使用SEARCH命令在一个或多个消息中查找一个字符串,您可以找出特定的消息.
要搜索一个字符串,把该字符串指定为SEARCH命令的一个参数.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum每次指定新的字符串,SEARCH命令就从消息编号1开始搜索.
要继续搜索包含指定字符串消息的文件夹,使用SEARCH命令但不指定参数.
要在不同的文件夹中搜索同样的字符串,输入SELECT或SETFOLDERfolder-name命令,并且使用不指定参数的SEARCH命令.
在以下例子中,搜索当前文件夹的消息,来查找第一条包含字符串appointment的消息:MAIL>SEARCH"appointment"7.
3发送消息要发送邮件消息给系统的任何用户,执行以下几步:步骤任务1在MAIL>提示下输入SEND.
Mail提示您输入接收消息的用户名.
2输入接收消息的用户名,并按下Enter键.
Mail提示您输入消息主题.
3输入消息主题并按下Enter键.
输入这个信息是可选的.
Mail提示您输入消息文本.
4输入消息文本,或者只是按下Enter键.
输入这个信息是可选的.
5按下Ctrl/Z可发送这条消息.
如果决定不发送这条消息,按下Ctrl/C,它取消发送操作而不从Mail退出.
在以下例子中,发送一条消息给用户THOMPSON:MAIL>SENDTo:THOMPSONSubj:MeetingonApril20Enteryourmessagebelow.
PressCTRL/Zwhencomplete,orCTRL/Ctoquit:IhavesomenewideasabouttheHubbubColaaccount.
Letmeknowwhenyouareavailabletotalkaboutthem.
--Jeff7.
4通过网络发送邮件UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum以下几节描述如何在网络上发送邮件.
7.
4.
1指定您的网络协议当您接收到一条消息时,Mail解释指定地址如下:如果地址的节点部分包含一个句点(.
),就把该地址解释为一个互连网地址.
按照默认,Mail使用SMTP协议;除非您以前设置系统使用不同的互连网协议,方法是使用MAIL$INTERNET_TRANSPORT逻辑名定义备用的协议.
如果地址的节点部分不包含一个句点,就把该地址解释为一个DECnet地址.
然而,可以用户化Mail环境强制系统选择一个特定协议.
当邮件地址对互连网和DECnet都解释为有效时,这个任选项是有用的.
要指定协议,可以定义MAIL$INTERNET_MODE逻辑名,如下所示:HYBRID(默认)如果地址的节点部分包含一个句点(.
)),Mail使用互连网协议.
如果没有句点,Mail使用DECnet协议.
DECNETMail总是把地址的节点组件解释为一个DECnet节点说明.
SMTPMail总是把地址的节点部分解释为一个互连网地址说明.
默认传递是SMTP,除非您使用MAIL$INTERNET_TRANSPORT逻辑定义一个备用的互连网传递.
要使用这些方法修改Mail环境,Compaq建议在LOGIN.
COM文件中定义MAIL$INTERNET_MODE和MAIL$INTERNET_TRANSPORT逻辑名.
(有关使用和定义逻辑名的完整信息,请参阅第11章.
)例如,如果系统设置使用默认(HYBRID),那么邮件地址smith@pluto被解释为DECnet地址,因为在这个地址中没有句点.
然而,如果要Mail使用SMTP而不是DECnet,可以在LOGIN.
COM文件中添加以下一行:$DEFINEMAIL$INTERNET_MODESMTP然后,当您指定smith@pluto时,Mail解释这个地址为一个互连网地址并使用SMTP协议(例如,SMTP%"smith@pluto.
xyz.
dec.
com").
7.
4.
2指定节点名如果您的计算机系统是网络的一部分,您可以发送邮件给网络上的任何其他用户.
如果您发送邮件给不同节点的某人,那么在To:提示中输入那个用户的节点名和用户名.
如果用户名包含特殊字符或空格,就必须把用户名括入引号("")内.
使用以下格式:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumnodename::username如果对这个远程节点的网络连接不可用,Mail就显示一条出错消息.
等一会儿,然后再发送这条消息.
有关指定节点名的详情,请参阅3.
1.
6节.
在以下例子中,发送一条消息给节点CHEETA上的用户HIGGINS:MAIL>SENDTo:CHEETA::HIGGINS7.
4.
3使用互连网邮件地址您也可以使用完整的互连网邮件地址发送邮件给网络上的用户.
这些地址是普通的,特别是如果您要发送邮件给您的组织之外的用户.
username@company.
com在To:提示中,输入您要发送邮件到的用户的完整互连网地址.
这些地址很少是大小写敏感的.
MAIL>SENDTo:J_SMITH@COMPANYNAME.
COM,Kate.
Muir@school.
edu7.
4.
4使用逻辑节点名您可以使用逻辑名表示用户的名称和节点;然后可以使用逻辑名发送邮件.
注意,Mail忽略节点名或逻辑名的任何存取控制信息.
在以下例子中,HENRY用来代替CHEETA::HIGGINS.
首先,定义逻辑名(HENRY),然后用它来代替用户名和节点:$DEFINEHENRYCHEETA::HIGGINS$MAILMAIL>SENDTo:HENRY7.
5发送消息给多个用户以下几节描述如何发送邮件给一个以上用户.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum7.
5.
1使用个人名要同时发送邮件给几个用户,可以使用以下两种方法之一:在To:提示中使用个别用户名或者使用分发名单.
要通过用户名发送同一消息给几个在同一节点上的用户,可在To:提示中输入用户名并用逗号或空格分开.
在以下例子中,发送一条消息给Thompson、Jones和Barney:MAIL>SENDTo:THOMPSON,JONES,BARNEYSubj:MeetingonJanuary97.
5.
2建立分发名单分发名单是包含一系列用户和他们的节点名的文件.
必须使用文本编辑程序建立分发名单.
分发名单不在Mail公用程序内建立.
您的开文件定额(与帐户关联的限制)确定您可以发送邮件(同时)到不同节点的数目和可以嵌套分发名单的深度.
如果超过这个定额,Mail显示一条出错消息.
请求系统管理员增加您的定额,或者一次成批发送邮件到较少的节点.
按照默认,系统寻找文件类型为.
DIS的分发名单文件.
如果包含分发名单的文件有不同的文件类型,那么在To:提示中指定文件名和文件类型.
如果您在一个目录中调用Mail而包含分发名单的文件在另一个目录,那么在To:提示中输入分发名单的完整目录名.
要建立分发名单,使用以下过程:步骤任务1使用文本编辑程序建立一个分发名单文件,文件类型为.
DIS.
2在文件中每行键入一个用户名.
3要在文件中包括其他分发名单的名称("嵌套"列表),指定一个at符号(@)后面跟随那个分发名单的名称.
4要在这个文件中包括注释,在注释之前输入感叹号(!
).
以下例子展示一个分发名单文件:!
ALLBUDGET.
DIS!
!
BudgetCommitteeMembers@BUDGET!
listedinBUDGET.
DIS.
!
StaffUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumThompsonBRUTUS::JONESPORTIA::BARNEY如果文件BUDGET.
DIS不在您建立的新分发名单文件(ALLBUDGET.
DIS)目录中,那么在新的分发文件中包括BUDGET.
DIS的文件说明.
依赖于建立ALLBUDGET.
DIS的位置,您或许要指定BUDGET.
DIS所在的设备和目录.
(有关文件说明的详情,请参阅第3章.
)7.
5.
3发送消息给分发名单要使用分发名单发送邮件给几个用户,使用以下过程:步骤任务1调用Mail.
2在MAIL>提示下键入SEND并按下Enter键.
3在To:提示中,键入一个at符号(@)和分发名单的文件名.
按下Enter键.
4在Subj:提示下键入消息主题,并按下Enter键.
5在文本提示下,输入消息的文本.
在以下例子中,发送一条消息给分发名单ALLBUDGET.
DIS:MAIL>SENDTo:@ALLBUDGETSubj:Tomorrow'sMeetingEnteryourmessagebelow.
PressCTRL/Zwhencomplete,orCTRL/Ctoquit:ThemeetingabouttheHubbubColaaccountistomorrowat2:00.
--Jeff您也可以从DCL级发送一个文件给分发名单.
如果省略文件类型.
DIS,要把at符号(@)和文件名放入引号("")内,从而把文件标识为一个分发名单.
要包括一个主题,使用MAIL命令和/SUBJECT限定词.
以下例子发送文件MEETING.
TXT给用户THOMAS和分发名单FRIENDS.
DIS:$MAIL/SUBJECT="update"MEETINGTHOMAS,"@FRIENDS.
DIS"UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum以下例子发送文件NOTICE.
TXT给分发名单WRITERS.
DIS.
在这里,没有包括/SUBJECT限定词,因而该消息发送时没有主题.
$MAILNOTICE"@WRITERS"7.
6在Mail中处理文件您可以在Mail中或从DCL级发送文件给其他用户.
在Mail中使用以下过程发送一个文件:步骤任务1在MAIL>提示下,输入SEND和您要发送的文件名.
2在To:提示中,输入接收文件的用户名.
3在Subj:提示中,输入文件的主题.
4按下Enter键发送文件.
要取消发送操作,按下Ctrl/C或Ctrl/Y.
Ctrl/C使您保留在Mail中;而Ctrl/Y返回DCL级.
在以下例子中,文件MEMO.
TXT发送给用户EDGELL:MAIL>SENDMEMO.
TXTTo:EDGELLSubj:Anothermemo通过邮件发送文件,注意以下限制:使用COPY命令复制文件时,操作系统执行数据完整性检查.
通过邮件发送文件时就不进行这个检查,因而当发送外部(例如可执行的)文件时就可能出现被破坏的文件.
发送大的文件时要进行判断.
有些系统的用户可能不能接收大的文件(例如POSTSCRIPT文件).
7.
6.
1发送DDIF文件如果文件是一个按照DIGITAL文档交换格式(DDIF)说明构成的复合文档,Mail将保持OpenVMSRMS文件标签和DDIF语义,但这一点只适合于OpenVMSAXPV1.
0或VAX/VMSV5.
2-2或以后版本的系统.
如果您设法发送包含DDIF文件的邮件消息给非OpenVMS的操作系统,或者发送给在OpenVMSAXPV1.
0或VAX/VMSV5.
2-2之前版本的OpenVMS系统,Mail将返回一条出错消息.
7.
6.
2从DCL发送文件UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum从DCL级发送文件时,Mail被调用但是不进入交互对话期,也不会看到MAIL>提示.
文件发出时,自动返回到DCL级.
在您键入MAIL命令和适当限定词后,按下Enter键就可发送文件,或者按下Ctrl/C取消发送操作.
也要注意以下规则:在文件说明中不允许通配符.
如果省略文件类型,默认文件类型是.
TXT.
如果指定SYS$INPUT作为文件说明,就提示您输入消息文本(同时仍然保持在DCL级).
有关使用SYS$INPUT的详情,请参阅第11章.
当您从DCL级发送文件时,如果可选/SUBJECT限定词的变元包含任何空格或非字母数字字符,就必须把它括入引号内.
在以下例子中,从DCL级把文件MEMO.
TXT发送给节点CHEETA的用户EDGELL:$MAIL/SUBJECT="Anothermemo"MEMO.
TXTCHEETA::EDGELL在以下例子中,因为文件名指定为SYS$INPUT,因此提示用户输入消息的文本:$MAILSYS$INPUT:To:ARMSTRONGEnteryourmessagebelow.
PressCTRL/Zwhencomplete,orCTRL/Ctoquit:Thetextofthemessageishere.
[Ctrl/Z]$7.
6.
3从消息建立文件读取消息时,要从消息建立一个文本文件,就在MAIL>提示下输入EXTRACT命令和文件名.
退出Mail时,该文件列表在当前目录(除非指定另一个目录)中.
如果该文件是一个DDIF文件,Mail保持OpenVMSRMS文件标签和DDIF语义(VAX/VMSV5.
2-2或以后版本).
邮件标题包括From:、To:和Subj:行.
要建立不包括标题信息的文件,对EXTRACT命令指定/NOHEADER限定词.
如果消息有一个以上标题(例如,转发消息),则只删除顶端的标题.
对EXTRACT命令使用/APPEND限定词可把消息复制到现有文件的末端.
使用/ALL限定词把当前文件夹的所有文件复制到一个现有文件.
在以下例子中,从展示的邮件消息建立一个文件DEC_MEETINGS.
TXT:#101-DEC-199914:12:27NEWMAILUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumFrom:STONE::FELLINITo:ThompsonSubj:DatesforDecembersalesmeetingsSalesmeetingsinDecemberwillbeheldonthefollowingdates:WednesdayDec.
8,1999TuesdayDec.
14,1999MondayDec.
20,1999ThursdayDec.
30,1999MAIL>EXTRACTDEC_MEETINGS.
TXT%MAIL-I-CREATED,DISK:[THOMPSON]DEC_MEETINGS.
TXT以下例子展示如何建立一个文件JANUARY_MEETINGS.
TXT,它包含消息编号3的文本:MAIL>READ3.
.
.
MAIL>EXTRACT/NOHEADERJANUARY_MEETINGS.
TXT%MAIL-I-CREATED,DISK1:[JONES]JANUARY_MEETINGS.
TXT;1被建立MAIL>7.
6.
4把文件附加给消息要自动地把一个小文件附加到邮件消息的末端,使用SETSIGNATURE_FILE命令.
指定的文件自动地(按照默认)附加到您使用ANSWER、FORWARD、MAIL、REPLY或SEND命令发送的每个邮件消息.
签名文件的例子是一个格式化为名片的文本文件,包含用户的公司名、地址、电话号码和互连网地址.
如果要选择性地附加一个文件给消息或者取代默认签名文件设置,则使用/SIGNATURE_FILE[=file-name]限定词以及ANSWER、FORWARD、MAIL、REPLY或SEND命令的.
使用SHOWSIGNATURE_FILE命令可展示是否指定了默认签名文件.
(SHOWALL命令也显示签名文件信息.
)在DCL级通过使用带/SIGNATURE_FILE[=file-name]限定词的DCL命令MAIL,您也可以设置默认签名文件.
注意,当建立邮件包括签名文件的消息时,该消息需要比常规消息更多的临时磁盘空间,因为在操作期间要建立临时文件.
在消息发送后,就删除那些临时文件.
当指定签名文件名时,也要注意以下规则:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果不指定文件类型,则默认是.
SIG.
如果不指定目录,Mail公用程序就在在您的邮件目录搜索签名文件.
在以下例子中,文件BUSINESS_CARD.
SIG指定为默认文件,它将自动附加到每个使用FORWARD、MAIL、REPLY或SEND命令发送的邮件消息.
MAIL>SETSIGNATURE_FILEBUSINESS_CARD.
SIG在下一个例子,文件GREETINGS.
SIG代替默认签名文件,被指定为自动附加到特定答复的文件.
MAIL>REPLY/SIGNATURE_FILE=GREETINGS.
SIG7.
7发送消息的其他方法以下几节描述使用Mail公用程序发送消息的其他方法.
7.
7.
1答复消息要答复接收的消息,使用以下过程:步骤任务1在MAIL>提示下键入REPLY并按下Enter键.
2输入消息并按下Ctrl/Z可发送消息,或者按下Ctrl/C放弃.
在以下例子中,答复发送给STONE::THOMPSON.
注意,在输入答复命令后,Mail自动显示To:和Subj:提示:TTo:STONE::THOMPSONSubj:RE:BudgetMeetingEnteryourmessagebelow.
PressCTRL/Zwhencomplete.
CTRL/Ctoquit:7.
7.
1.
1答复包含嵌套引号的地址在大多数情况下,可以使用Mail命令REPLY答复从包含嵌套引号的地址接收的邮件.
然而,如果系统没有这个能力,请与系统管理员联系.
7.
7.
2转发消息在读取消息之后,如果要转发邮件消息给其他用户,则在MAIL>提示下输入FORWARD命令.
Mail提示输入收件人的名称和主题.
在输入完要求的信息后,按下Enter键可发送这个消息.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果转发消息包括.
DDIF文件,Mail就发送整个.
DDIF文件给收件人,包括.
DDIF语义和.
DDIF标签.
在以下例子中,转发一条消息给用户STONE::JONES:MAIL>FORWARDTo:STONE::JONESSubj:FYI-Statusofproposedbudgetmeeting7.
7.
2.
1SETFORWARD命令可以使用SETFORWARD命令把所有发送给您的邮件消息,全部重定向到另一个OpenVMSCluster或另一个系统上的帐户.
实质上,这个命令建立一个电子转发地址.
只为您不要定期检查的帐户设置一个转发地址.
例如,您想把您在OLD簇邮件帐户的所有邮件转发到您在STAR簇上的邮件帐户.
在您注册进入OLD后,输入Mail公用程序并输入以下命令:MAIL>SETFORWARDSTAR::SMITH所有发送给OLD::SMITH的消息将自动重定向到节点STAR上的这个邮件帐户.
也可以把转发地址设置为一个互连网邮件地址:MAIL>SETFORWARDSMITH@Company.
com在这种情况下,所有发送给OLD::SMITH的邮件将转发给SMITH@Company.
com.
总是要发送一条测试消息给旧帐户来确认正确地转发消息给新帐户.
要避免建立循环转发(即邮件消息无限转发,但从不到达目的地.
),不要设置帐户转发给本身或者另一个转发帐户.
不要转发OLD::SMITH给OLD::SMITH.
不要转发OLD::SMITH给STAR::SMITH,然后转发STAR::SMITH给OLD::SMITH.
要检查帐户转发的地址,输入以下命令:MAIL>SHOWFORWARDYourmailisbeingforwardedtoSTAR::SMITH.
要除去转发地址,输入以下命令:MAIL>SETNOFORWARDUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumMAIL>SHOWFORWARDYouhavenotsetaforwardingaddress.
确认您已除去转发地址,并向该帐户发送测试消息.
注意在以前版本的OpenVMS操作系统中,如果要在SETFORWARD命令包括引号,您必须指定一对额外的引号,因为该命令自动除去第一个引号.
但从OpenVMS7.
0版本开始,就不需要指定一对额外引号,因为SETFORWARD命令不再除去第一个引号.
7.
8组织消息以下几节描述如何组织邮件消息.
7.
8.
1建立文件夹要组织邮件消息,可以建立自己的邮件文件和文件夹.
一个邮件文件包含文件夹,而一个文件夹包含邮件消息.
每个文件夹和文件可以包含任何数目的消息.
典型情况是,通过建立文件夹组织消息,而不是通过建立邮件文件.
如同默认邮件文件夹(NEWMAIL、MAIL和WASTEBASKET),您建立的文件夹通常存储在邮件文件MAIL.
MAI.
每次输入READ或DIRECTORY命令时,当前文件夹的名称显示在屏幕的右上角.
您可以只处理在当前文件夹中的消息.
如果邮件文件很大(超过500块),那么可以为较大的文件夹建立独立的邮件文件,以改进Mail的性能.
7.
8.
2建立邮件子目录接收邮件消息时,按照默认这些消息写入名为MAIL$xxxxxxxxxx.
MAI的文件,并且定位在您的顶级目录中.
(注意x字符表示一个长的任意文件说明.
)当您第一次接收邮件消息时,就在您的顶级目录建立默认邮件文件MAIL.
MAI.
要避免在顶级目录显示.
MAI文件,使用Mail命令SETMAIL_DIRECTORY.
这个命令建立一个邮件子目录并把所有.
MAI文件移入这个子目录.
要把.
MAI文件从子目录移回顶级目录,使用SETNOMAIL_DIRECTORY命令.
要显示包含您的所有.
MAI文件的子目录名,在MAIL>提示下输入SHOWMAIL_DIRECTORY.
在以下例子中,用户(FRED)建立目录.
MAIL:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumMAIL>SETMAIL_DIRECTORY[.
MAIL]MAIL>SHOWMAIL_DIRECTORYYourmailfiledirectoryisSY$LOGIN:[FRED.
MAIL]7.
8.
3把消息移入文件夹可以使用FILE命令或MOVE命令把当前消息放入不同的文件夹.
如果这个文件夹不存在,那么Mail显示一条消息,请问您是否要建立它.
在把消息归档到指定文件夹后,Mail自动删除当前文件夹的消息.
7.
8.
4在文件夹间复制消息Mail命令COPY把当前消息的副本放入指定的文件夹.
如果这个文件夹不存在,Mail就显示一条消息,请问您是否要建立它.
在以下例子中,所有包含字MEETING的消息从当前文件夹复制到文件夹SCHEDULE.
在COPY命令完成后,每个消息有两个副本,一个在当前文件夹,而另一个在文件夹SCHEDULE.
MAIL>SEARCHMEETINGMAIL>COPYSCHEDULEFolderSCHEDULEdoesnotexist.
Doyouwanttocreateit(Y/N,defaultisN)Y%MAIL-I-NEWFOLDER,folderSCHEDULEcreated以下命令选择并显示包含字"meeting"的下一条消息:MAIL>SEARCHMAIL>COPYSCHEDULEMAIL>SEARCH%MAIL-E-NOTFOUND,nomessagescontaining'MEETING'found7.
8.
5选择文件夹要显示当前邮件文件的文件夹列表,输入DIRECTORY/FOLDER命令.
要选择一个新文件夹作为当前文件夹,使用以下命令之一:SELECTfoldername把指定的文件夹选择为当前文件夹.
后来的Mail命令,例如READ和DIRECTORY,就使用这个选定文件夹.
不需要在每个命令中指定文件夹名.
SETFOLDERfoldername这个命令与SELECT命令效果一样.
DIRECTORYfoldername把指定的文件夹选择为当前文件夹,并列出这个文件夹中的消息.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumREADfoldername把指定的文件夹选择为当前文件夹,并显示指定的消息(按照默认,显示文件夹中的第一条消息).
在以下例子中,选择MEMOS文件夹:MAIL>DIRECTORY/FOLDERListingoffoldersinSYS$LOGIN:[FRED]MAIL.
MAI;1PressCTRL/CtocancellistingMAILMEETING_MINUTESMEMOSPROJECT_NOTESSTAFFMAIL>SELECTMEMOS7.
8.
6删除文件夹要删除邮件文件夹,就要删除文件夹中所有消息或把它们移入另一个文件夹.
删除文件夹的所有消息时,只要您选择另一个文件夹就自动删除这个空文件夹.
在以下例子中,删除MUSIC文件夹的消息:MAIL>SELECTMUSIC%MAIL-I-SELECTED,2messagesselectedMAIL>DELETE/ALL7.
8.
7建立和存取邮件文件您也可以建立文件来组织邮件消息.
与建立文件夹一样,使用同样的命令建立邮件文件:COPY、MOVE和FILE.
在Mail提示输入文件夹名后,也提示输入文件名.
如果在File:提示中输入一个新文件名,就建立一个新邮件文件.
要处理不同于默认邮件文件的邮件文件,使用Mail命令SETFILE指定代替的文件.
Mail命令SHOWFILE显示当前邮件文件名.
当更改邮件文件时,就倒空和删除当前邮件文件的WASTEBASKET文件夹(如果设置AUTO_PURGE),并且关闭这个邮件文件.
图7-1展示一个典型用户如何组织邮件.
图7-1组织邮件UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在以下例子中,当前消息被移入ACCOUNTS文件的文件夹FEED.
MOVE命令建立邮件文件ACCOUNTS.
MAI,把当前消息移入FEED文件夹,并从当前文件夹和文件中删除这条消息.
MAIL>MOVE_Folder:FEED_File:ACCOUNTS在以下例子中,选择FEED文件夹(它在ACCOUNTS文件中):MAIL>SETFILEACCOUNTSMAIL>SETFOLDERFEEDMAIL>SHOWFILEYourcurrentmailfileisSYS$LOGIN:[FRED.
MAI]ACCOUNTS.
MAI;1.
7.
8.
8纠正邮件消息计数如果显示在屏幕上新的(未读)邮件消息的数目与新消息的实际数目不一致,那么当没有新邮件时输入READ/NEW命令.
当您输入READ/NEW命令时,将知道没有新邮件,并接收到以下系统消息:MAIL>SETFILEACCOUNTSMAIL>SETFOLDERFEEDMAIL>SHOWFILEYourcurrentmailfileisSYS$LOGIN:[FRED.
MAI]ACCOUNTS.
MAI;1.
7.
9删除消息UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果要从当前文件夹删除一条邮件消息,那么当读取消息时,输入DELETE命令或者输入DELETE命令后面跟随要删除消息的编号(或编号范围).
可以使用连字号(-)或冒号(:)定义要删除的消息范围.
在以下例子中,删除消息4、5、6、11、12、14、15、16和17:MAIL>DELETE4-6,11,12,14:177.
9.
1恢复删除的消息如果删除一条消息,这条消息就被移入文件夹WASTEBASKET.
被删除的消息收集在WASTEBASKET文件夹中,直到您退出当前邮件文件(从Mail退出,或者指定不同的邮件文件).
如果您已发出SETAUTO_PURGE命令,当退出当前邮件文件时,将倒空WASTEBASKET并删除文件夹本身.
在交互Mail对话期间,把消息移出WASTEBASKET文件夹,您可以恢复任何被删除的消息.
输入PURGE命令,也可以倒空WASTEBASKET文件夹.
在以下例子中,编号12的邮件消息先被删除,然后从WASTEBASKET文件夹恢复.
MAIL>DELETE12MAIL>SELECTWASTEBASKET%MAIL-I-SELECTED,1messageselectedMAIL>DIRECTORY#topFromDateSubject1FABLES::WEST11-DEC-1999MeetingthisweekMAIL>MOVEMAIL7.
10打印邮件消息要打印邮件消息,在MAIL>提示下输入PRINT命令.
按照默认,Mail把消息发送到SYS$PRINT队列.
直到您按下Ctrl/Z、输入EXIT命令或输入PRINT/PRINT命令,邮件文件才被发送到打印队列.
要指定不同队列,使用PRINT命令限定词/QUEUE.
发出SETQUEUEqueue-name命令,也可以选择不同的队列;这个队列将保持作为默认打印队列,直到输入另一个SETQUEUE命令,即使退出Mail也是如此.
在以下例子中,邮件消息提交给AK34$PRINT打印队列:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumMAIL>PRINT/QUEUE=AK34$PRINT在以下例子中,默认打印队列从SYS$PRINT更改为AK34$PRINT:MAIL>SETQUEUEAK34$PRINT7.
11保护邮件文件以下几节描述如何保护邮件文件.
7.
11.
1默认保护邮件文件(例如,MAIL.
MAI)受到保护,其他人不能读取,以避免被意外地删除.
Mail为.
MAI文件给出的保护码是:(S:RW,O:RW,G:,W:).
系统(包括Mail本身)和拥有者(您)可以读取和写入这个文件.
拒绝组和全体用户的所有存取权.
Mail公用程序也有默认文件保护来阻止邮件篡改.
然而,Mail不能完全避免篡改.
任何人如果有足够特权就可以更改保护并存取邮件文件.
7.
11.
2安全措施邮件文件存储在您自己的目录中,因而您可以对敏感文件可选地应用文件保护技术,这种技术描述在第10章.
另外:判断邮件请求的响应:如果一个节点处于本地OpenVMS簇环境之外,那么源节点可能被意外地或有意地错误标识.
在邮件消息内容和接收人选择方面,最好使用判断力.
决不泄露您的密码,或发送有关如何使用您的帐户的详情.
一旦把邮件消息发送出去,您就不能控制.
7.
12在Mail环境中使用文本编辑程序以下几节描述如何在Mail环境中使用文本编辑程序.
7.
12.
1使用EVE在发送消息之前,可以使用文本编辑程序编写消息.
要做这件事,可指定SEND命令及/EDIT限定词.
在响应To:和Subj:提示后,Mail调用这个文本编辑程序.
除非已选定另一种编辑程序,否则Mail调用基于DECTPU的EVE编辑程序.
您输入文本时,[Endoffile]标记跟着向下移动.
有关EVE编辑程序的详情,请参阅第8章.
要发送消息,可按下Do键并输入EXIT命令.
要取消发送操作,按下Do键并输入QUIT命令.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在以下例子中,使用EVE建立邮件消息:MAIL>SEND/EDIT[Endoffile]Buffer:MAIN|Write|Insert|Forward注意不要编辑.
DDIF邮件文件,因为您将不能再使用.
DDIF文件.
如果要编辑一个.
DDIF邮件文件,只可以存取这个文件的文本.
7.
12.
2使用/EDIT限定词关键字如果调用Mail时指定/EDIT限定词,那么在跟着发生的邮件对话期间,可以使用编辑程序发送、答复和转发消息.
您也可以使用/EDIT限定词的关键字设置Mail的默认值.
要在只当答复消息时调用编辑程序,可使用MAIL/EDIT命令的REPLY关键字.
要调用编辑程序并显示您要答复的消息,使用REPLY关键字及=EXTRACT任选项.
如果不为/EDIT指定关键字,那么默认是/EDIT=(SEND,REPLY).
要发送或答复消息,就必须退出编辑程序.
要取消SEND或REPLY命令,输入QUIT命令退出编辑程序.
例子在以下例子中,为每个发送或转发的邮件消息调用编辑程序:$MAIL/EDIT=(SEND,FORWARD)在以下例子中,要答复每条消息时将调用编辑程序:$MAIL/EDIT=(REPLY)在以下例子中,将调用编辑程序,并且每次答复消息时要答复的消息将包括在文本中:$MAIL/EDIT=(REPLY=EXTRACT)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum7.
12.
3选择编辑程序按照默认,当您指定Mail命令SEND/EDIT时,Mail调用基于DECTPU的EVE编辑程序.
输入Mail命令SETEDITOR,可以指定不同的编辑程序代替EVE.
例如,要选择EDT编辑程序,发出Mail命令SETEDITOREDT.
该EDT编辑程序保持为默认的Mail编辑程序(即使您从系统注销然后再注册),直到输入另一个SETEDITOR命令.
要显示选定Mail编辑程序的名称,输入Mail命令SHOWEDITOR.
7.
12.
4使用命令文件编辑邮件在进入Mail之前,可以定义逻辑名MAIL$EDIT为一个命令文件.
然后,当发出任何要调用编辑程序的Mail命令时,将调用这个命令文件执行编辑操作.
在这个命令文件中,也可以调用其他公用程序,如拼写检查程序和可以在命令文件中执行的任何功能.
关于MAILEDIT.
COM命令过程的注解例子,可参阅附录B,而有关命令文件的详情,可参阅第13章和第14章.
7.
12.
5取代已选定的编辑程序如果希望临时取代选定的编辑程序,可以把MAIL$EDIT定义为字符串"CALLABLE_",后面跟随要求的编辑程序名.
例如,要使用可调用的EDT而不是可调用的EVE,可以键入以下命令:$DEFINEMAIL$EDITCALLABLE_EDT如果在已调用MAIL$EDIT定义的对话期间发出SETEDITOR命令,将取代永久选定的编辑程序和当前编辑程序设置.
要再次使用MAIL$EDIT定义的命令文件,必须退出Mail并重新启动它.
7.
13使用Mail小键盘在Mail中,可以使用键盘的数字小键盘执行命令.
多数小键盘键可以执行两个命令.
图7-2展示Mail小键盘.
要输入每个键展示的上部命令,按下适当的键.
要输入展示的下部命令,首先按下PF1键,然后按下期望的功能键.
图7-2Mail公用程序小键盘UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum要执行Mail命令SEND,按下KP7.
要执行Mail命令SEND/EDIT,先按下PF1键然后按下KP7.
7.
13.
1重新定义小键盘键在Mail中,可以重新定义执行Mail命令的小键盘键.
注意,重新定义一个键时将取代这个键的以前定义.
在Mail中定义小键盘键类似于定义执行DCL命令的小键盘键.
在以下例子中,键KP2定义为Mail命令PRINT/PARAM=PAGE_ORIENT=LANDSCAPE.
在定义了KP2之后,可以按下它显示PRINT/PARAM=PAGE_ORIENT=LANDSCAPE命令:MAIL>DEFINE/KEYKP2"PRINT/PARAM=PAGE_ORIENT=LANDSCAPE"7.
13.
2分配附加的键定义UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum要增加可用于终端上键定义的数目,使用/STATE限定词.
可以为同一个键分配多个定义,只要每个定义与不同的状态相关.
状态名可以是任何字母数字字符串.
通过指定状态,可以第一次按下一个键输入一个命令,而第二次输入一个限定词.
在以下例子中,PF1(按下两次)定义为DIRECTORY/FOLDER:MAIL>DEFINE/KEYPF1"DIRECTORY"/SET_STATE=FOLDER/NOTERMINATEMAIL>DEFINE/KEYPF1"/FOLDER"/IF_STATE=FOLDER/TERMINATE按下PF1两次可输入命令DIRECTORY/FOLDER.
/TERMINATE限定词结束命令行,因而不必按下Enter键.
7.
13.
3建立永久的键定义退出Mail时,在Mail对话期间定义的任何小键盘键将失去定义.
要把小键盘键定义从一个Mail对话期保留到另一个,在顶级目录中建立一个包含键定义的文件(例如,MAIL$KEYDEF.
INI).
例如,以下MAIL$KEYDEF.
INI文件包含6个键定义:DEFINE/KEYPF1"DIRECTORY"/NOTERMINATE/SET_STATE=folderDEFINE/KEYPF1"/FOLDER"TERMINATE/IF_STATE=folderDEFINE/KEYPF2"SELECTNOTERMINATE/SET_STATE=mailDEFINE/KEYPF2"MAIL"TERMINATE/IF_STATE=mailDEFINE/KEYPERIOD"READNOTERMINATE/SET_STATE=newDEFINE/KEYPERIOD"/NEW"TERMINATE/IF_STATE=new每次调用Mail时都要执行这些命令,在注册命令文件(LOGIN.
COM)中可输入以下命令行:$DEFINEMAIL$INITSYS$LOGIN:MAIL$KEYDEF.
INI7.
14Mail命令概要本节包含所有Mail公用程序命令的概要.
有关用于这些命令的限定词的完整信息,请参阅联机求助.
有关使用MIME公用程序读取和编写MIME编码消息的详情,请参阅7.
15节.
7.
14.
1读取消息使用以下命令读取消息:BACK上次发出命令是READ时,显示在当前或上次读取消息之前的消息.
上次发出的命令是DIRECTORY时,BACK命令显示前一屏目录列表.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumCURRENT显示当前读取消息的开始.
DIRECTORY[folder-name]显示一列在当前邮件文件中的消息,包括消息编号、发送人名、日期和主题.
ERASE清除终端屏幕.
EXTRACT把当前消息的一个副本放入指定的输出文件.
要把邮件消息复制到一个邮件文件的文件夹,使用COPY、FILE或MOVE命令.
FIRST显示当前文件夹的第一条消息.
LAST显示当前文件夹的最后一条消息.
NEXT跳至下一条消息,并且显示它.
READ[folder-name][message-number]显示消息.
按下Enter键与输入不带参数的READ命令效果一样.
SEARCHsearch-string搜索当前选定的文件夹,查找包含第一条指定文本串的消息.
SHOWNEW_MAIL_COUNT显示未读邮件消息的数目.
7.
14.
2交换消息使用以下命令交换消息:ANSWER[filespec]REPLY[filespec]发送一条消息给您当前读取或上次读取的消息发送人.
FORWARD发送您当前读取(或刚才读取)消息的副本给一个或多个用户.
MAIL[filespec]SEND[filespec]发送一条消息给一个或多个用户.
7.
14.
3除去消息使用以下命令除去消息:DELETE[message-number]删除当前读取的消息、某个范围的消息或刚才读取的消息,并把它们移入WASTEBASKET文件夹.
PURGE删除WASTEBASKET文件夹中的所有消息.
当您退出Mail或输入SETFILE命令(选UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum择新邮件文件)时,一个隐式清除会倒空WASTEBASKET文件夹,除非以前已输入SETNOAUTO_PURGE命令.
SET[NO]AUTO_PURGE确定您输入EXIT或SETFILE命令时Mail是否倒空WASTEBASKET文件夹.
使用SETNOAUTO_PURGE命令时,必须周期性地输入PURGE命令删除WASTEBASKET文件夹中的消息.
SHOWAUTO_PURGE输入EXIT或SETFILE命令时,显示WASTEBASKET文件夹中的消息是否被删除(自动清除).
7.
14.
4打印消息使用以下命令打印消息:PRINT把当前读取消息的一个副本加入打印队列.
退出Mail时,PRINT命令建立的文件被释放到打印队列.
除非使用/NOW或/PRINT限定词,否则多个消息将被连接到一个打印作业.
SET[NO]FORMform-nameSHOWFORM为Mail打印设置默认打印格式.
SETNOFORM命令清除默认打印格式.
SHOWFORM命令显示默认打印格式.
SET[NO]QUEUEqueue-nameSHOWQUEUE在Mail中设置输入PRINT命令时要使用的默认打印队列.
SETNOQUEUE清除以前定义的打印队列并设置该队列为SYS$PRINT,即默认打印队列.
SHOWQUEUE命令显示默认打印队列.
7.
14.
5组织消息使用以下命令组织消息:COPYfolder-name[filename]把消息复制到另一个文件夹,并且不把它从当前文件夹删除掉.
如果指定的文件夹不存在,就建立一个.
FILEfolder-name[filename]MOVEfolder-name[filename]把当前消息移入指定的文件夹,并从原始文件夹删除这条消息.
SELECT[folder-name]SETFOLDER[folder-name]建立一组消息,并把它们归为一组.
可以把这组消息从一个文件夹复制或移动到另一个文件夹.
也可以读取和删除,或搜索和抽取一组消息.
另外,可以使用SELECT和SETFOLDER命令把这组消息从一个文件夹移动到另一个文件夹.
SETFILEfilename建立(或打开)另一个文件作为当前邮件文件.
按照默认,邮件文件是MAIL.
MAI.
如果使UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum用COPY命令、FILE命令或MOVE命令建立其他邮件文件(例如,JOKES.
MAI或HISTORY.
MAI),然后可以使用SETFILE命令打开这些邮件文件.
SHOWFILE显示当前打开的邮件文件的名称.
SHOWFOLDER[folder-name]显示当前文件夹名.
SETWASTEBASKET_NAMEfolder-name更改包含待删除消息的WASTEBASKET文件夹的名称.
通过输入PURGE命令,可以删除WASTEBASKET文件夹中的所有消息.
如果设置AUTO_PURGE,输入EXIT命令时,将删除WASTEBASKET文件夹中的所有消息.
如果设置AUTO_PURGE,输入QUIT命令时可以避免删除WASTEBASKET文件夹中的所有消息.
SHOWWASTEBASKET_NAME显示WASTEBASKET文件夹的名称.
SHOWDELETED显示当前邮件文件中被删除消息的空间容量.
7.
14.
6标记消息以下命令用于标记消息:MARK[message-number]标记当前或指定消息.
被标记的消息在目录列表的左列显示一个星号(*).
要选择或组织被标记的消息,使用SELECT命令及/MARKED限定词.
UNMARK[message-number]取消当前或指定消息标记.
在目录列表左列上的星号(*)被删除.
7.
14.
7用户化Mail环境以下命令用于用户化Mail环境:DEFINE/KEYkey-name字符串定义执行Mail命令的键.
可以按下这个键输入一个命令,代替键入这个命令名.
SHOWKEY[key-name]显示DEFINE/KEY命令建立的键定义.
EDIT[filename]调用选定的编辑程序,允许您编辑一条消息然后发送.
HELP[题目]显示Mail的有关信息.
要获得个别命令或题目的信息,输入HELP后再输入命令或题目名称.
SET[NO]CC_PROMPT设置发送一条消息时是否出现抄送(CC:)提示.
SETCOPY_SELFcommand[,command]设置SEND、REPLY或FORWARD命令是否向发送人返回一个正在发送的消息副本.
SHOWCOPY_SELF显示哪个命令(SEND、REPLY或FORWARD)自动发送消息副本给您.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumSET[NO]SIGNATURE_FILE设置Mail公用程序当您使用ANSWER、FORWARD、MAIL、REPLY或SEND命令时自动地把一个签名文本文件附加到邮件消息的末端.
SHOWSIGNATURE_FILE显示是否指定一个默认签名文件的信息,如果指定,则显示那个文件的名称.
(SHOWALL命令也显示签名文件的信息.
)SETEDITOReditor-name选择编辑消息时使用的文本编辑程序(例如,使用Mail命令SEND/EDIT).
您可以使用系统可用的任何可调用编辑程序.
这个命令取代命令过程MAIL$EDIT设置的任何定义.
SHOWEDITOR显示已选择的文本编辑程序的名称.
SET[NO]FORWARD地址为您的邮件设置转发地址.
SHOWFORWARD显示当前转发地址的名称.
SET[NO]MAIL_DIRECTORY[.
subdirectory-name]指定把所有邮件文件(文件类型.
MAI)从SYS$LOGIN目录移入指定的子目录.
SHOWMAIL_DIRECTORY显示包含所有.
MAI文件的设备和目录的名称.
SET[NO]PERSONAL_NAME"text-string"把一个文本串附加到您要发送的邮件消息的From:字段末端.
可以用您的全名或任何其他信息填充这个字段.
注意,您的个人名必须从一个字母开始,并且不能有两个连续空格.
SHOWPERSONAL_NAME显示用SETPERSONAL_NAME命令建立的文本串.
SHOWALL显示当前Mail设置的详细信息.
7.
14.
8退出或传递控制以下命令是用于退出Mail或传递控制:ATTACH[process-name]准许您在作业中把终端控制从当前进程转换到另一个进程.
例如,您正在编辑一个文件时,可以使用SPAWN命令进入一个子进程(Mail)读取新邮件消息.
然后,可以输入ATTACH命令退回编辑对话期.
EXIT退出Mail.
输入EXIT命令时,将删除WASTEBASKET文件夹中的任何消息,除非已发出命令SETNOAUTO_PURGE.
通过按下Ctrl/Z也可以退出Mail.
QUIT退出Mail而不倒空WASTEBASKET文件夹(除非输入EXIT命令或按下Ctrl/Z,否则被删除的消息不会被清除).
QUIT命令执行与Ctrl/Y同样的功能.
SPAWN[command]建立当前进程的一个子进程.
可以使用SPAWN命令临时离开Mail,执行其他功能(例如,显示目录列表或打印文件),然后返回到Mail.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum7.
14.
9邮件文件压缩以下命令用于压缩邮件文件:COMPRESS[filespec]使得索引邮件文件更小.
如果不指定一个文件名,Mail将压缩当前打开的邮件文件.
如果没有打开的邮件文件,Mail就压缩默认邮件文件(MAIL.
MAI).
7.
14.
10系统管理命令以下命令用于系统管理:REMOVEusername从系统邮件简要,即数据文件SYS$SYSTEM:VMSMAIL_PROFILE.
DATA中除去一个用户记录.
这需要SYSPRV特权.
SHOWFORWARD显示用户当前转发地址的名称.
SHOWPERSONAL_NAME显示用户用SETPERSONAL_NAME命令建立的文本串.
7.
15MIME公用程序多用途互连网邮件扩展(MIME)是用于把非文本文件附加到邮件消息的标准.
MIME公用程序允许您编写和读取MIME编码的邮件消息.
使用MIME,非文本文件(例如图形或声音文件),被编码并以普通文本发送,虽然这样的文本可能是不可读的.
MIME公用程序把MIME文件解码成它们的原始格式,并允许您建立MIME编码的文件,可以使用OpenVMSMail公用程序把它作为邮件消息发送.
7.
15.
1调用MIME公用程序系统管理员可能已经把MIME设置为外部命令,但是如果还没有,可以把以下命令行添加到LOGIN.
COM中:$MIME:==$SYS$SYSTEM:MIME.
EXEMIME只打开MIME编码的文本文件.
您需要首先使用Mail把MIME编码的消息抽取到一个文本文件.
(有关指令,请参阅7.
6.
3节.
)要从DCL提示中调用MIME公用程序,输入以下命令:$MIMEfile-name.
TXTUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum文件名限定词是可选的.
如果指定的文件存在,那么它打开为READ_ONLY.
/READ_ONLY指出这个文件是打算解码它的用户接收的消息内容.
这是默认值.
/DRAFT指出这个文件包含在上一个对话期建立的消息,并且打开为WRITE_ACCESS.
MIME公用程序不构成任何标题信息,To:或From:字段.
它只建立MIME标题和消息的正文文本,保存Mail以后发送文件的文本.
如果要打开的指定文件包含这样的可识别标题或任何RFC822标题,则打开这个文件并且默认是/READ_ONLY.
如果指定的文件不包含任何可识别的标题或者不存在,将出现一个OPENFILE出错消息.
通过建立两个文件:MIME$MAILCAP.
DAT和MIME$FILETYPES.
DAT,可以建立显示MIME编码消息的系统范围的默认值.
MIME$MAILCAP.
DAT包含一个定义每个本地识别的MIME编码文件的内容类型的应用程序.
MIME$FILETYPES.
DAT把每个内容类型与一个文件扩展名联系起来.
通过在SYS$LOGIN中建立这些文件,用户可以取代此默认设置.
7.
15.
2初始化MIME公用程序用户开始MIME公用程序时,初始化进程执行以下步骤:1.
在用户的VMSmail简要中,MIME公用程序查找用户的邮件目录和MIME公用程序使用的默认编辑程序.
2.
MIME公用程序读取文件MIME$MAILCAP.
DAT和MIME$FILETYPES.
DAT.
3.
MIME公用程序引用下列内部默认设置:o内容类型MIME公用程序在显示进入消息之前引用内容类型列表.
这个列表包含MIME公用程序可识别的内容类型和把每个内容类型解码为原始格式所需要的信息.
以下是一个MAILCAP条目的例子,它来自RFC1524:image/*;xview%so通过建立MIME$MAILCAP.
DAT文件,可以添加内容类型到MIME识别列表.
(例子7-1包含一个MIME$MAILCAP.
DAT文件的例子.
)o文件扩展名编写发出消息时,MIME公用程序引用文件扩展名列表.
这个列表包含OpenVMS文件扩展名和与每个扩展名关联的内容类型.
MIME公用程序需要把这些扩展名包括它编写的MIME格式的消息正文中.
文件扩展名列表的每行包括以下项目:extension,contenttype/subtype,(optionally)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumContent-Transfer-Encodingstringo以下是文件扩展名列表中一行的例子:doc,application/ms-word,base64o通过建立MIME$FILETYPES.
DAT文件,可以把文件扩展名和匹配的内容类型添加到MIME公用程序识别的列表,这描述在表7-1中.
7.
15.
3建立可选的MIME公用程序文件表7-1列出并描述可以在系统上建立并用户化MIME公用程序的文件.
表7-1MIME公用程序的可选文件文件目的MIME$MAILCAP.
DAT用于显示和分析进入的消息.
MIME$FILETYPES.
DAT把内容类型指派给发出的附加文件.
把这些文件放在SYS$LOGIN目录中.
7.
15.
3.
1MIME$MAILCAP.
DAT文件处理.
MIME$MAILCAP文件的格式起源于RFC1524,即N.
Borenstein于1993年9月编写的UserAgentConfigurationMechanismforMultimediaMailFormatInformation.
MIME公用程序使用在这个文件中的用法说明解释和显示消息和.
遵循这些用法说明,MIME用户代理调用外部程序显示MIME消息的内容类型.
在您的系统上,可以用户化MIME$MAILCAP.
DAT文件,指定一个用于特定内容类型的文件描述语言(FDL)抽取消息部分.
例子7-1包含一个MIME$MAILCAP.
DAT文件的例子.
注意对程序名的引用必须是逻辑名或有效文件说明.
例子7-1MIME$MAILCAP.
DAT文件##MIME$MAILCAP.
DATUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum##Localcustomizationsofcontenttypesandprocessingoptions##Usexv.
exetodisplayimagesimage/*;xv%s##UseNetscapeforhtmlattachmentstext/html;netscape%s#7.
15.
3.
2MIME$FILETYPES.
DAT文件处理.
可选的MIME$FILE_TYPES.
DAT文件包含OpenVMS文件扩展名列表和与之关联的MIME内容类型.
ADD命令处理使用FILETYPE结构指定附加到编写消息的OpenVMS文件的内容类型.
文件格式的语法类似于MIME$MAILCAP.
DAT文件,使用"#"字符指出注释.
这个文件的每行包含一个文件扩展名(不带前导'.
'),后面跟随与使用那个扩展名文件关联的内容类型和子类型.
可选地,每行可以包括内容传输编码字符串(7位、8位、基数64或引用可打印的)用来编码传输消息文件的内容.
7位、8位、基数64或引用可打印的是标准MIME编码,并且只有这些是可接受的.
如果没有指定编码,那么MIME公用程序使用7位.
7.
15.
4使用MIME公用程序抽取MIME编码的文件要使用MIME公用程序抽取MIME编码的文件,首先,打开要解码的文件.
可以按以下两种方法之一打开文件:指定其文件名调用MIME公用程序,或者在MIME公用程序中打开这个文件.
EXTRACT以其原来文件格式或以/FDL限定词指定的另一种格式,把指定抽取到一个文件.
以下是典型的MIME公用程序命令,用于打开消息文件、以可读文本格式显示消息和列出消息属性:MIME>OPENfile-nameMIME>READMIME>LIST要抽取,输入以下命令:MIME>EXTRACT/ATTACHMENT=ndestination-file-name通过附加/ATTACHMENT=n限定词可以指定单个,在此,n是抽取的编号.
把指定转换到一个输出文件时,也可以使用/FDL=filename,指定使用的文件描述语言(FDL)定义文件.
使用LIST命令显示个别的编号.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum有关MIME公用程序使用的完整命令列表,请参阅7.
15.
6节.
7.
15.
5使用MIME公用程序编码文件要编码作为发送的文件,必须首先调用MIME公用程序建立一个新文件,并指定NEW命令.
如果没有指定文件名,NEW将提示输入文件名:$MIMENEWnew-file-name或者,可以在MIME公用程序中使用OPEN命令打开一个初稿消息文件:MIME>OPEN/DRAFTfile-name要打开在上一个对话期间建立的文件,在命令中指定限定词/DRAFT.
要把添加给文件,输入命令:MIME>ADDfile-name有关这个命令可选限定词的完整列表,请参阅7.
15.
6节.
要把当前信息写入文件,使用SAVE命令.
一旦保存,OpenVMSMail公用程序就可以把MIME编码文件当作一个文件发送.
要退出MIME公用程序,输入QUIT或EXIT命令.
有关使用在MIME公用程序中命令的完整列表,请参阅7.
15.
6节.
7.
15.
6MIME公用程序命令下表包含对可用于MIME公用程序的命令、参数和限定词的描述.
每个描述都有例子.
ADD---把新的正文部分或添加给正在编辑的消息.
ADD命令需要附加的文件名作为参数.
可选限定词是:/BINARY---设置内容类型为"application/octet-stream"和内容传输编码为"base64".
这个格式可以用来表示任意的二进制数据流.
/CONTENT_TYPE=type---用指定字符串取代默认内容类型,例如"IMAGE/JPEG".
/ENCODING_TYPE={7Bit|8Bit|Base64|Quoted-Printable}---用指定编码类型取代默认编码.
/MESSAGE---是消息文件(标准RFC822).
/TEXT---是内容类型文本.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumMIME>ADDfile-name/TEXTCLOSE---关闭当前消息文件.
如果没有保存最新更改,在关闭之前MIME公用程序将提示您保存.
如果这个文件是/READ_ONLY,则这个文件不改变.
MIME>CLOSEEDIT---为指定调用用户的默认文本编辑程序.
MIME>EDITattachment-numberEXIT---退出MIME编辑程序,保存进行中的任何工作.
MIME>EXITEXTRACT---抽取指定到一个原来文件格式的文件.
/ATTACHMENT=n---指定要抽取的编号.
/FDL=filename---把指定转换到一个输出文件时,指定使用的文件描述语言(FDL)定义文件.
MIME>EXTRACTfile-name/ATTACHMENT=nHELP---显示MIME公用程序的求助文件.
MIME>HELPLIST---显示当前消息的信息,包括正文部分和属性,如编号.
MIME>LISTNEW---建立新消息.
MIME>NEWfile-nameOPEN---用指定文件名打开消息.
可用限定词是:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum/DRAFT---消息文件是在上一个对话期间建立的初稿.
/READ---消息是只读的,并且不能更新.
MIME>OPENfile-name/NEWQUIT---异常结束当前MIME编辑对话期,不保存当前消息.
MIME>QUITREAD---把当前消息显示为可读的文本.
如果适用,也显示.
MIME>READREMOVE---从当前消息删除指定的.
MIME>REMOVE1SHOW---显示MIME环境的信息,视指定的任选项而定,.
可能的任选项是CONTENT_TYPE、FILE_TYPES和VERSION.
MIME>SHOWoptionSAVE---把当前消息写入文件.
如果指定文件名,则将使用它.
MIME>SAVEfile-name7.
15.
7出错处理使用OpenVMS信号子系统,特别是lib$signal()和lib$stop(),可报告出错情形.
出错情形有3级:致命的、出错和警告.
这些级别指出出错情形将导致什么结果.
下表描述种种严重性和相应的结果:致命(-F-)导致立即终止程序.
出错(-E-)导致终止当前活动命令,但保留现有的消息环境.
警告(-W-)导致完成当前命令,但不中断MIME编辑对话期.
然而,这不意味着命令成功地完成了所有任务.
要检查出错结果.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum第8章使用EVE编辑文本文件文本编辑程序允许您建立和修改文本文件.
使用文本编辑程序,可以从键盘输入文本,并使用文本编辑命令修改文本.
例如,可以键入报告数据,然后重新整理各节、复制信息、替换短语或格式化文本.
可以使用文本编辑程序建立和修改程序设计语言的源文件.
操作系统支持几个文本编辑程序.
扩展通用编辑程序(EVE)是一个基于DEC文本处理公用程序(DECTPU)的通用文本编辑程序.
本章包括以下内容:EVE特性获得求助开始编辑对话期输入命令保存编辑内容并退出EVE移动光标输入文本擦除和恢复文本移动文本复制文本块编辑使用暂挂删除查找和替换文本使用命令行限定词调用EVE的其他方法日志和恢复EVE格式化命令使用缓冲区建立子进程有关EVE详情,请参阅EVE的联机求助和ExtensibleVersatileEditorReferenceManual.
有关EDT详情,请参阅OpenVMSEDTReferenceManual.
约定在本章中,展示EVE键名时(使用SHOWKEY或HELPKEYS命令),要对控制键、换挡功能键和Alt组合键使用斜杠,以及对GOLD组合键使用空格或破折号.
因而,需要保持按下一个键(例如Ctrl)的同时按下另一个键的组合键展示时要带一个斜杠;而按下一个键之后再按下另一个的组合键展示时带一个空格或一个破折号(例如GOLD-Help).
8.
1EVE特性UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumDECTPU是一种高性能、可编程的文本处理器.
使用EVE软件,可以建立和编辑文本文件,例如商业信件、技术文档和程序源文件.
EVE是OpenVMS操作系统的默认编辑程序.
除非定义了另一默认编辑程序,否则输入EDIT命令时就调用EVE.
使用EVE,可以做以下事情:建立和编辑文本文件,例如信件、报告、程序源码和其他文档.
执行文本格式化操作,例如擦除、剪切、粘贴、填充、查找、替换和分页.
在同一编辑对话期中使用多个缓冲区和窗口观看和编辑不同的文件.
为编辑操作定义键,包括学习序列(把几个命令或按键结合到单个键)和设置EDT小键盘或WPS-PLUS小键盘.
以块或行范围选择文本,用于剪切和粘贴或其他编辑.
使用通配符搜索文本.
在编辑程序内执行DCL命令(例如DIRECTORY).
运行DECspell检查选择区或整个缓冲区.
派生子进程或连接其他进程.
编译和执行DECTPU过程来扩展EVE.
从DECwindows界面添加或删除菜单项目.
保存编译过程、菜单定义、键定义和其他用户化用于以后的对话期.
在启动或编辑对话期间使用初始化文件.
当系统失败中断编辑对话期时,使用按键或缓冲区更改日志恢复工作.
获得关于EVE命令、键、菜单项目和其他题目的全面联机求助,也包括DECTPU内设过程的联机求助.
一旦知道如何调用EVE和如何输入命令,就可以使用EVE命令建立和编辑文件.
使用编辑键和命令,可以移动光标、设置缓冲区模式和执行编辑操作,例如输入、擦除、恢复和移动文本.
8.
2获得求助在编辑对话期间的任何时候,可以获得联机求助.
有两种联机求助可用于EVE编辑程序:小键盘求助,使用终端上Help键存取EVE求助,在EVE命令提示中使用HELP命令存取8.
2.
1使用小键盘求助要存取小键盘求助,执行以下步骤:1.
按下Help键.
Help公用程序显示小键盘的图表.
2.
遵照屏幕指示获得信息:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumoEVE命令要获得EVE命令的求助,输入一个命令名或一个问号()并按下Enter键.
o已定义键要获得已定义键的求助,按下那个键,或使用SHOWKEY命令.
o列出键定义要列出所有键定义,键入字keys并按下Enter键,或按下GOLDHELP.
GOLD键是数字小键盘上的PF1键或NumLock键.
3.
按下Enter键退出Help公用程序.
8.
2.
2使用EVE求助要使用HELP命令存取EVE求助,执行以下步骤:1.
按下Do键.
2.
输入命令HELP.
使用PrevScreen和NextScreen卷动求助题目的列表.
3.
按下Enter键退出Help.
要获得有关特定命令的信息,输入HELP再输入命令名并按下Enter键.
求助文本出现在屏幕上.
您也可以输入命令HELPTPU,获得DECTPU内设过程的求助.
以下例子展示MOVEBYLINE命令的求助文本:MOVEBYLINEMovesthecursoralineatatimeinthecurrentdirection.
Keys:EVEDefaultVT100KeypadF12MINUSonkeypadSteps:1.
Ifnecessary,setthedirectiontomovein---forwardorreverse.
2.
UseMOVEBYLINE(seekeylistabove).
Usagenotes:oInforwarddirection,movestotheendofthecurrentline,ortotheendofthenextline,ifany.
oInreversedirection,movestothestartofthecurrentline,ortoUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumthestartofthenextline,ifany.
Relatedtopics:CHANGEDIRECTIONENDOFLINELINESTARTOFLINE8.
3开始编辑对话期EVE是OpenVMS操作系统的默认编辑程序.
如下所示,EDIT命令自动开始EVE编辑程序(除非您或系统管理员重新定义了默认编辑程序):$EDIT在EVE不是默认编辑程序的系统上,使用EDIT/TPU命令开始EVE.
当开始编辑对话期时,可以指定现有文件名或要建立的新文件的名称.
如果没有指定文件名,而您又已经添加文本到称为Main的默认缓冲区中,那么当结束编辑对话期时,EVE就提示您输入一个文件名.
有关使用缓冲区的详情,请参阅8.
18节.
以下例子调用EVE建立新文件NEWFILE.
DAT:$EDITNEWFILE.
DAT[Endoffile](1)(2)Buffer:NEWFILE.
DAT|Write|Insert|Forward(3)Command:(4)Editingnewfile.
Couldnotfind:FABLES.
TXT(5)检查EVE屏幕显示时,注意以下:1.
end-of-file标记EVE缓冲区的末端.
它只出现在屏幕上,不会成为文件的一部分.
添加文本到缓冲区时,end-of-file向下移动.
当观看包含许多行文本缓冲区的开始部分时,依赖于终端屏幕的长度,这个标记或许不可见.
2.
一个窗口是显示缓冲区的一个屏幕区域.
EVE缓冲区只存在于编辑对话期间.
当结束编辑对话期时,可以保存编辑或丢弃.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum3.
突出显示的状态行出现在EVE窗口的底部,提供在窗口观看的缓冲区信息.
状态行展示缓冲区名、编辑状态(写入或只读)、当前模式(插入或重键)和当前方向(正向或反向).
4.
使用命令行输入行模式命令(参阅8.
4节).
按下Do键可获得命令行.
5.
在命令行中调用EVE并指定一个文件名时,消息窗口就会包含一条通知信息,出现在突出显示的状态行之下.
这条消息说明当前文件是新文件,或者一定数量的文本行已从现有文件读出.
在编辑对话期间,EVE在这个消息窗口显示其他消息.
8.
4输入命令有两种方法输入EVE命令:在命令行界面中键入命令.
使用EDT或WPS小键盘的已定义键.
8.
4.
1键入命令要键入一个命令,执行以下步骤:1.
按下Do键.
光标移动到命令窗口,并且EVE提示键入命令.
2.
键入命令.
使用命令的前几个字母可以缩写命令.
EVE不是大小写敏感的.
在命令中行,可以使用任何混合的大写和小写字母字符,但为FIND和REPLACE命令指定字符串时除外.
3.
按下Do键或Enter键.
EVE执行命令或提示您输入进一步的信息.
8.
4.
2使用定义的键您可以使用已定义的键输入EVE命令.
每个定义键执行一个编辑命令.
您也可以定义自己的键执行EVE功能.
按照默认,EVE定义了一些键.
在VT200、VT300和VT400系列终端的预定义键包括:微型小键盘(在主键盘键和数字小键盘之间,箭头键的上面)某些功能键某些控制组合键控制键、箭头键和Tab、Return和Delete键在所有3类终端上有同样的定义.
图8-1展示VT200、VT300和VT400系列终端的预定义键.
图8-1EVE键---VT200、VT300和VT400系列终端UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在VT100系列终端上,EVE自动定义大多数数字小键盘键、4个箭头键和某些控制键.
图8-2展示VT100系列终端的预定义键.
图8-2EVE键---VT100系列终端UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum8.
5保存编辑内容并退出EVE您可以使用以下方法之一保存编辑:WRITEFILE命令保存文件而不终止编辑对话期EXIT命令终止编辑对话期并且保存对文件的更改QUIT命令终止编辑对话期不保存对文件的更改8.
5.
1使用WRITEFILE命令要将文本写入保存缓冲区保存而不退出EVE,使用WRITEFILE命令.
如果没有文件与缓冲区关联,EVE就提示输入文件名,如下所示:TypefilenameforbufferMain(pressRETURNtonotwriteit):UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum键入文件名并按下Enter键,就把缓冲区的内容写入文件.
8.
5.
2使用EXIT命令要保存编辑的文本,使用EXIT命令.
按下F10键或按下Ctrl/Z也可以输入EXIT命令.
如果修改了当前缓冲区,EVE建立与原始版本具有同样文件名和文件类型的新版本文件,而版本号增1.
例如,如果在修改文件FUN.
DAT;1后使用EXIT命令,那么输出文件命名为FUN.
DAT;2.
8.
5.
3使用QUIT命令要结束对话期而不保存编辑,输入QUIT命令.
如果要放弃不保存编辑,键入YES(Y)并按下Enter键.
如果决定保存编辑,则键入N,按下Enter键,并使用EXIT命令退出缓冲区.
如果修改的缓冲区不是当前缓冲区,那么EVE请问您是否要保存其他缓冲区的内容.
如果键入Y,EVE建立现有文件的新版本,版本号增1.
如果当前不存在文件,EVE就提示输入文件名.
如果缓冲区没有修改,EXIT和QUIT是一样的.
例如,如果使用EVE检查一个文件而没有编辑,就可以按下Ctrl/Z放弃.
在以下例子中,有一个修改的缓冲区FUN.
DAT,并且输入QUIT命令:Command:QUITBuffermodificationswillnotbesaved,continuequitting(YorN)8.
6移动光标使用EVE编辑文件时,要把光标移动到要执行编辑功能的位置.
在文本间光标移动得越快和越有效,就能在编辑对话期间节省越多的时间.
您可以使用键盘或命令移动光标.
表8-1展示移动光标的EVE编辑键.
有关GOLD组合键的详情,请参阅联机求助题目GOLD.
表8-1移动光标的EVE编辑键键或组合键功能向上箭头键与MOVEUP一样.
向上移动光标一行.
在VT100系列终端上,KP5也定义为MOVEUP.
向下箭头键与MOVEDOWN一样.
向下移动光标一行.
在VT100系列终端上,KP2也定义为MOVEDOWN.
左箭头键与MOVELEFT一样.
向左移动光标一个字符或一列.
在VT100系列终端上,KP1也定义为MOVELEFT.
右箭头键与MOVERIGHT一样.
向右移动光标一个字符或一列.
在VT100系列终端上,UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumKP3也定义为MOVELEFT.
Ctrl/E或GOLD右箭头键与ENDOFLINE一样.
移动光标到当前行尾.
Ctrl/H或GOLD左箭头键与STARTOFLINE一样.
移动光标到当前行首.
GOLD向上箭头键与TOP一样.
移动光标到当前缓冲区的顶部.
GOLD向下箭头键与BOTTOM一样.
移动光标到当前缓冲区的底部.
GOLDNextScreen与NEXTWINDOW一样.
如果使用两个或更多的窗口,移动光标到屏幕上面下一个窗口中光标的最后位置.
GOLDPrevScreen与PREVIOUSWINDOW一样.
如果使用两个或更多的窗口,移动光标到屏幕上面前一个窗口中光标的最后位置.
表8-2展示移动光标的EVE命令.
表8-2移动光标的EVE命令命令功能BOTTOM移动光标到当前缓冲区的底部.
按照默认,EVE定义GOLD向下箭头键为BOTTOM.
CHANGEDIRECTION更改当前缓冲区的方向.
缓冲区的方向展示在状态行中.
ENDOFLINE移动光标到当前行尾.
按照默认,EVE定义Ctrl/E和GOLD右箭头键为ENDOFLINE.
FORWARD默认设置.
设置当前缓冲区的方向为正向;即,向右和向下.
缓冲区的方向展示在状态行中.
GOTO移动光标到您指定的位置,如以前用MARK命令标记的.
LINE移动光标到行首(由行号指定).
MARK把一个不可见的标记放在当前位置,并把它与指定的名称关联.
以后,可以使用GOTO命令返回到这个标记位置.
MOVEBYLINE在正向:移动光标到当前行的行尾,如果光标已经在行尾,则移到下一行的行尾.
在反向:移动光标到当前行的行首,如果已经在行首,则移到上一行行首.
在VT200、VT300和VT400系列终端上,EVE定义F12键为MOVEBYLINE.
在VT100系列终端上,EVE定义小键盘的减号键为MOVEBYLINE.
MOVEBYPAGE移动光标到下一个或上一个分页符(换页),视当前方向而定.
如果在当前方向没有分页,则把光标移动到缓冲区的底部或顶部.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumMOVEBYWORD在正向:移动光标到下一个英文字的字首,如果光标已经在行尾,则移到下一行的行首.
在反向:移动光标到上一个英文字的字首,如果光标已经在行首,则移到上一行的行尾.
NEXTSCREEN在当前缓冲区中正向卷动当前窗口的行数减1.
例如,如果当前窗口是12行,那么NEXTSCREEN命令正向卷动光标11行.
在VT200、VT300和VT400系列终端上,EVE定义E6键(NextScreen)为NEXTSCREEN.
在VT100系列终端上,EVE定义小键盘的KP0键为NEXTSCREEN.
NEXTWINDOW或OTHERWINDOW移动光标到屏幕的下一个窗口(如果有).
光标出现在那个窗口以前占据的最后位置.
EVE定义GOLDNextScreen为NEXTWINDOW.
PREVIOUSSCREEN在当前缓冲区中向后卷动当前窗口的行数减1.
例如,如果当前窗口是12行,PREVIOUSSCREEN命令向后卷动光标11行.
在VT200、VT300和VT400系列终端上,EVE定义E5键(PrevScreen)为PREVIOUSSCREEN.
在VT100系列终端上,EVE定义小键盘的句点键为PREVIOUSSCREEN.
PREVIOUSWINDOW移动光标到屏幕的上一个窗口(如果有).
光标出现在那个窗口以前占据的最后位置.
EVE定义GOLDPrevScreen为PREVIOUSWINDOW.
REVERSE设置当前缓冲区的方向为反向;即向左和向上.
缓冲区的方向展示在状态行中.
SETCURSORBOUND使光标跟随文本流.
光标不能移入缓冲区的未使用部分.
类似于EDT、WPS和其他编辑程序的光标行为.
SETCURSORFREE默认设置.
可以移动光标到缓冲区的任何位置,并在那里输入文本.
SETSCROLLMARGINS设置当向上和向下移动光标时,自动开始卷动的顶部和底部距离.
以行数或窗口大小的百分比指定这些距离.
默认设置是0;即当超过窗口的顶部或底部时就开始卷动.
SHIFTLEFT把当前EVE窗口向左移动指定的列数.
使用SHIFTRIGHT和SHIFTLEFT命令,可以观看长行文本的未显示部分,而不必更改窗口的宽度或使用132列模式.
只当使用了SHIFTRIGHT命令时,SHIFTLEFT命令才移动窗口.
SHIFTRIGHT把当前EVE窗口向右移动指定的列数.
使用SHIFTRIGHT和SHIFTLEFT命令,可以观看长行文本的未显示部分,而不必更改窗口的宽度.
STARTOFLINE移动光标到当前行的行首.
按照默认,EVE定义Ctrl/H和GOLD左箭头键为STARTOFLINE.
TOP移动光标到当前缓冲区的开始(左上角).
按照默认,EVE定义GOLD向上箭头键为TOP.
指南:在EVE中移动光标要在缓冲区中移动光标:1.
使用以下命令,调用EVE并建立缓冲区SCHEDULE.
DAT:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$EDITSCHEDULE.
DAT2.
EVE把光标放在缓冲区的顶部,并等待输入文本.
3.
输入以下文本.
Schedulefor1July10:00AMmeetingwithsupervisorReadandreviewmemofromSallyWorkonPascalprogram4.
输入文本时,[Endoffile]标记在缓冲区中向下移动,并且光标定位在插入文本的末端.
5.
输入TOP命令移动光标到文件开始.
6.
按下Ctrl/E移动光标到文本第一行的行尾.
Ctrl/E在EVE中的使用方法与在DCL中一样.
7.
输入BOTTOM命令移动光标到缓冲区的末端.
8.
按下向上箭头键向上移动光标一行,到达文本的第4行.
9.
按下更改方向键更改当前缓冲区方向为反向.
10.
按下按行移动键移动光标到第三行文本的行首.
11.
输入命令LINE1移动光标到缓冲区第一行的行首.
12.
要退出EVE,按下Ctrl/Z.
8.
7输入文本您可以输入键盘字符、整个文件和特殊非打印字符(例如控制字符)到当前编辑的缓冲区.
您可以使用小键盘或命令输入文本.
您也可以添加文本、文件和特殊字符到缓冲区.
8.
7.
1添加文本您可以在键盘上键入字符,并把它们添加到缓冲区的当前光标位置.
键入字符或者是补充字符,或者是替换现有字符,视缓冲区是插入模式还是重键模式而定.
8.
7.
2包括文件按下Do键和输入EVE命令INCLUDEFILE,可以添加整个文件.
在Filetoinclude:提示中,键入文件说明并按下Enter键.
不管缓冲区的当前模式是什么(插入或重键),EVE插入指定文件的整个内容到缓冲区的当前光标所在行之前.
您可以在文件说明中使用通配符.
如果有一个以上匹配于带通配符文件说明的文件,EVE显示一个选择列表并提示您提供一个更完整的文件说明.
如果指定文件不存在,那么EVE显示一条消息说明它不能包括那个文件.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum8.
7.
3特殊的非打印字符按下Ctrl/V后面跟随特殊字符,可以使用QUOTE命令添加特殊的非打印字符.
例如,要插入一个换码符到缓冲区,按下Ctrl/V后面跟随Ctrl/[.
键入字符或者是补充字符,或者是替换现有字符,视缓冲区是插入模式还是重键模式而定.
8.
7.
4输入文本的EVE编辑键下表展示可以用来输入文本EVE的编辑键:键或组合键功能Ctrl/A与CHANGEMODE命令一样.
更改当前缓冲区的编辑模式,如突出显示的状态行中所示.
在插入模式下,EVE在字符位置插入文本,并移动现有文本适应插入操作.
在重键模式下,EVE重写当前位置的文本.
在VT200、VT300和VT400系列终端上,EVE定义F14键为CHANGEMODE.
在VT100系列终端上,EVE定义小键盘上的Enter键为CHANGEMODE.
Ctrl/V与QUOTE命令一样.
可以插入非打印字符或控制代码.
要搜索特殊字符,首先按下Find键,然后按下Ctrl/V和要查找的特殊字符.
按下Enter键激活搜索.
8.
7.
5输入文本的EVE命令下表展示可以用来输入文本的命令:命令功能CHANGEMODE与Ctrl/A一样.
更改当前编辑模式,如突出显示的状态行中所示.
在插入模式下,EVE在当前位置插入文本,并移动现有文本适应插入操作.
在重键模式下,EVE重写当前位置的文本.
在VT200、VT300和VT400系列终端上,EVE定义F14键为CHANGEMODE.
在VT100系列终端上,EVE定义小键盘上的Enter键为CHANGEMODE.
INCLUDEFILE插入指定文件的内容到当前缓冲区的光标所在行之前.
这个命令有助于组合文件.
INSERTMODE设置当前缓冲区为插入模式,与重键不同.
在插入模式下,EVE在当前位置插入文本,并移动现有文本适应插入操作.
OVERSTRIKEMODE设置当前缓冲区为重键模式,与插入不同.
在重键模式下,EVE重写当前位置的文本.
QUOTE与Ctrl/V一样.
通过按下一个键可输入指定的非打印字符或控制代码.
当为FIND或REPLACE命令输入一个字符串时,可以引用控制代码或其他字符.
例如,可以引用Tab键搜索制表符.
8.
7.
6设置缓冲区模式开始键入文本之前,检查缓冲区是插入模式还是重键模式.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum要确定缓冲区的模式,查看突出显示的状态行.
如果缓冲区处于插入模式,文本在光标位置插入,并且移动已经出现在缓冲区的文本以适应插入操作.
如果缓冲区处于重键模式,则在键盘键入的文本插入在光标位置,并且当光标移动时就重写已经出现在缓冲区的文本.
要从一个模式更改为另一个,按下Ctrl/A.
指南:在插入或重键模式下添加文本要在插入模式和重键模式下给文件添加文本:1.
调用EVE编辑现有文件SCHEDULE.
DAT.
2.
检查突出显示的状态行确保EVE是处于插入模式.
3.
如果EVE是处于重键模式,按下Ctrl/A更改到插入模式.
4.
移动光标到supervisor的第一个字母s,键入Engineering,并按下空格键.
这个字Engineering插入到文本缓冲区,而该行的其余文本向右移动.
Schedulefor1July10:00AMmeetingwithEngineeringsupervisorReadandreviewmemofromSallyWorkonPascalprogram[Endoffile]Buffer:SCHEDULE.
DAT|Write|Insert|Forward5.
按下Ctrl/A更改到重键模式.
6.
移动光标到字Sally的字母S并键入Peggy.
字Peggy放入缓冲区中,重写字Sally.
Schedulefor1July10:00AMmeetingwithEngineeringsupervisorReadandreviewmemofromPeggyWorkonPascalprogram[文件结束]缓冲区:SCHEDULE.
DAT|写入|重键|正向7.
要退出EVE,按下Ctrl/Z.
8.
8擦除和恢复文本UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum使用EVE,可以在编辑对话期间容易地擦除文本或纠正错误.
如果错误地擦除了文本,可以恢复最近擦除的文本到它的以前位置,或者通过移动光标可恢复到另一个位置上.
要擦除缓冲区中的文本,移动光标到要擦除的文本,并按下适当的编辑键或输入适当的EVE命令.
表8-3展示擦除和恢复文本的EVE编辑键.
表8-3擦除和恢复文本的EVE编辑键键或组合键功能Delete键或删除擦除光标左侧的字符.
与DELETE命令一样.
如果允许暂挂删除,DELETE则擦除在选择范围内的文本,并把它放入恢复选择缓冲区.
有关使用暂挂删除的详情,请参阅8.
9节.
Ctrl/J与ERASEWORD一样.
擦除当前字,如果光标在字之间,则擦除下一个字.
在VT200、VT300和VT400系列终端上,EVE定义F13键为ERASEWORD.
在VT100系列终端上,EVE定义小键盘的逗号键为ERASEWORD.
Ctrl/U与ERASESTARTOFLINE一样.
擦除光标左侧至行首内的字符.
GOLDInsertHere与RESTORE一样.
在当前位置重新插入刚才使用EVE命令或编辑键擦除的字、行或语句.
GOLDF13与RESTOREWORD一样(除WPS小键盘外).
在当前位置重新插入最后擦除的字.
表8-4展示擦除和恢复文本的EVE命令.
表8-4擦除和恢复文本的EVE命令命令功能DELETE擦除光标左侧的字符.
在插入模式下,EVE移动现有文本适应删除的字符.
在重键模式下,EVE用一个空格替换字符.
在行首,DELETE擦除上一行的回车(不管什么模式)并且当前行向上移动.
如果允许暂挂删除,那么DELETE擦除在选择范围内的文本,并把它放入恢复选择缓冲区.
有关使用暂挂删除的详情,参阅8.
9节.
ERASECHARACTER擦除光标上的字符.
在插入模式下,EVE移动现有文本适应删除的字符.
在重键模式下,EVE用一个空格替换字符.
如果光标在行末,则擦除回车(不管什么模式),而下一行向上移动.
ERASELINE擦除当前字符到行尾,把下一行附加到当前行的行尾.
如果光标在行尾,只擦除回车,而下一行向上移动.
ERASEPREVIOUSWORD擦除光标所在的字或前一个字.
如果光标在字之间,或者在字的首位字符,就擦除前一个字.
如果光标在字的中间,则擦除这个字的所有(与ERASEWORD一样).
如果光标在行首,则擦除在上一行行尾的回车,并且当前行向上移动.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumERASESTARTOFLINE擦除当前行的文本,从光标左侧字符开始直到行首.
如果已经在行首,则不擦除任何东西.
ERASEWORD与Ctrl/J一样.
擦除当前字,如果光标在字之间,那么擦除下一个字.
在VT200、VT300和VT400系列终端上,EVE定义F13键为ERASEWORD.
在VT100系列终端上,EVE定义小键盘的逗号键为ERASEWORD.
如果光标在行尾,则只擦除回车,并且下一行向上移动.
RESTORE在当前位置重新插入刚才使用EVE命令或编辑键擦除的字、行或语句.
RESTORE不恢复单个字符.
EVE定义GOLDInsertHere为RESTORE.
RESTORECHARACTER在当前位置重新插入上次使用EVE命令或编辑键擦除的字符.
在重键模式下,恢复的字符替换光标所在位置的字符.
在插入模式下,恢复的字符插入在光标位置,而现有文本移动适应它.
RESTORELINE在当前位置重新插入上次使用EVE命令或编辑键擦除的行.
RESTORESELECTION在当前位置重新插入上次使用暂挂删除操作擦除的文本.
有关使用暂挂删除的详情,请参阅8.
12节.
RESTOREWORD在当前位置重新插入上次使用EVE命令或编辑键擦除的字.
EVE定义GOLDF13为RESTOREWORD(WPS小键盘除外).
指南:擦除和恢复文本要擦除和恢复文本:1.
调用EVE建立缓冲区RHYMES.
DAT并输入以下文本:Sherhymeswithtree,alsowithbee,andthisonemakesthree.
2.
移动光标到字also的字母l.
输入ERASELINE命令.
EVE擦除从字also的字母l至行尾的所有字符,并把下一行附加到当前行.
Sherhymeswithtree,aandthisonemakesthree.
3.
移动光标到字rhymes的字母y.
输入ERASEWORD命令.
EVE擦除字rhymes并把其余文本移到左边.
Shewithtree,aandthisonemakesthree.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum4.
移动光标到第二行的第二个字母a.
输入RESTORELINE命令.
EVE恢复上次擦除的行,在这种情况下是lsowithbee.
Shewithtree,alsowithbee,andthisonemakesthree.
5.
在第一行中,移动光标到字with的字母w.
输入RESTOREWORD命令.
EVE恢复上次擦除的字,在这种情况下是rhymes.
Sherhymeswithtree,alsowithbee,andthisonemakesthree.
.
6.
要退出EVE,按下Ctrl/Z.
8.
9节描述SELECT和REMOVE命令的功能,它们可以一起使用来擦除缓冲区中的文本.
8.
9移动文本您可以使用EVE命令选择文本来复制、移动、删除或进行其他编辑操作.
本节论述如何移动文本.
有关如何从一个缓冲区移动文本到另一个的详情,请参阅8.
18节.
您也可以选择一个矩形区域(框)的文本,而不是行范围的文本,对文本进行移动、擦除或复制等操作.
有关使用框编辑命令的详情,请参阅8.
11节.
要移动文本,执行以下步骤:步骤任务1一旦在EVE中调用了一个文件,放置光标到要移动的首位字符.
2按下Select键.
3移动光标到要移动的最后字符之外一个字符.
(在反向,移动光标到最后字符,而不是之外.
)要移动的文本以反相显示方式突出显示.
(如果决定不从缓冲区除去文本,则再次按下Select键取消选择.
)4按下Remove键.
EVE从屏幕删除突出显示的文本,并把它放入InsertHere缓冲区.
5按下InsertHere键插入文本.
EVE在光标位置插入文本.
可以任意次数地把InsertHere缓冲区包UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum含的文本插入到任何光标位置,直到选择新的文本并放入InsertHere缓冲区.
InsertHere缓冲区包含上次复制或除去的文本.
表8-5描述用于移动文本的EVE编辑键.
表8-5移动文本的EVE编辑键键或组合键功能InsertHere与INSERTHERE或PASTE命令一样.
在当前位置,插入已除去或复制的文本.
Remove与REMOVE或CUT命令一样.
除去标记SELECT的或被FIND突出显示的文本,并把它放入InsertHere缓冲区.
Select从初始光标位置到光标移动到的位置标记文本(以反相显示方式突出显示它).
突出显示的文本称为选择范围.
要取消选择,再次按下Select键或使用RESET.
GOLDSelect与RESET一样.
取消以下各项,并重新设置缓冲区方向为正向:突出显示选择或找到的范围按下GOLD键(或GOLDn混合重复计数)不完全的或重新调用的命令行,或选择缓冲区显示SHOW、SHOWDEFAULTSBUFFER、SHOWSUMMARY或SHOWWILDCARDS的输出,从而返回到以前处理的缓冲区GGOLDRemove与STORETEXT或COPY命令一样.
复制标记为SELECT或FIND的文本,并把它放入InsertHere缓冲区.
被复制的文本不从它的原始位置除去.
表8-6描述用于移动文本的EVE命令.
表8-6移动文本的EVE编辑命令命令功能INSERTHERE或PASTE插入已除去或复制的文本.
按照默认,EVE定义E2键(在VT200、VT300和VT400系列终端的微型小键盘上的InsertHere)和KP9键(在VT100系列终端上)为INSERTHERE.
REMOVE或CUT除去标记SELECT的或被FIND突出显示的文本,并把它放入InsertHere缓冲区.
按照默认,EVE定义E3键(在VT200、VT300和VT400系列终端的微型小键盘上的Remove)和KP8键(在VT100系列终端上)为REMOVE.
RESET取消以下各项,并重新设置缓冲区方向为正向:突出显示选择或找到的范围按下GOLD键(或GOLDn混合重复计数)不完全的或重新调用的命令行,或选择缓冲区显示SHOW、SHOWDEFAULTSBUFFER、SHOWSUMMARY或SHOWUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumWILDCARDS的输出,从而返回到以前处理的缓冲区RESTORESELECTION重新插入暂挂删除操作擦除的文本.
有关使用暂挂删除的详情,请参阅8.
12节.
SELECT以反相显示方式突出显示从初始光标位置到光标移动到的位置的文本.
突出显示的文本称为选择范围.
要取消选择,再次输入SELECT命令或使用RESET.
按照默认,EVE定义E4键(在VT200、VT300和VT400系列终端的微型小键盘上的Select)和KP7键(在VT100系列终端上)为SELECT.
SELECTALL以反相显示方式突出显示当前缓冲区的所有文本,而不管光标的位置.
突出显示的文本称为选择范围.
要取消选择,输入SELECT命令或使用RESET.
SELECTALL命令暂时撤消暂挂删除,以避免意外擦除所有缓冲区.
SETNOPENDINGDELETE默认设置.
使用Delete键或键入新文本时,不允许删除选定文本.
如果选择缓冲区中的文本,键入新文本添加字符到选择范围,而使用Delete键只能擦除光标左侧的字符.
SETPENDINGDELETE允许暂挂删除,让您很快地擦除文本块.
首先允许暂挂删除,然后使用SELECT命令挑选要擦除的文本.
按下Delete键(或在字母数字小键盘上的任何其他键),可擦除这个文本.
要重新插入删除的文本,移动光标到要文本出现的位置,并输入RESTORESELECTION命令.
默认是SETNOPENDINGDELETE.
STORETEXT或COPY复制标记为SELECT或FIND的文本,并把它放入InsertHere缓冲区.
被复制的文本不会从它的原始位置除去.
指南:移动文本要从一个位置选择、除去和插入文本到另一个位置:1.
调用EVE编辑文件RHYMES.
DAT.
2.
移动光标到RHYMES.
DAT第二行的行首,并按下Select键.
3.
按下向下箭头键一次.
第二行文本是突出显示的.
4.
按下Remove键.
第二行文本就从当前缓冲区除去.
Sherhymeswithtree,andthisonemakesthree.
[Endoffile]5.
按下Enter键两次,然后按下InsertHere键.
在InsertHere缓冲区中的文本插入到当前光标位置.
Sherhymeswithtree,UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumalsowithbee,andthisonemakesthree.
[Endoffile]6.
要退出EVE,按下Ctrl/Z.
8.
10复制文本使用COPY命令,可以复制文本到别处.
STORETEXT命令与COPY命令一样.
在以下例子中,可以用STORETEXT命令代替COPY命令.
指南:复制文本缓冲区设置为正向时,要复制文本:1.
调用EVE编辑文件RHYMES.
DAT.
2.
移动光标到文本的第一行.
3.
按下Select键.
4.
按下Ctrl/E移动光标到第一行的行尾.
5.
输入COPY命令.
InsertHere缓冲区现在包含选定文本的一个副本.
6.
移动光标到在alsowithbee,之上的一行.
7.
按下InsertHere键.
现在,缓冲区应该如下所示:Sherhymeswithtree,Sherhymeswithtree,alsowithbee,andthisonemakesthree.
Endoffile]8.
移动光标到文本第一行的行首.
使用Select键,然后使用Remove键删除第一行文本.
9.
要退出EVE,按下Ctrl/Z.
8.
11框编辑您可以编辑有矩形区域、框和标准行范围的文本.
例如,可以选择一个包含一个列表或表格中几列的框,然后剪切和粘贴这个框,或者执行其他一些以框为单位的编辑操作.
8.
11.
1选择文本框UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum要选择一个文本框,执行以下步骤:1.
把光标放在要开始选择的位置---通常是框的左上角.
2.
输入BOXSELECT命令.
3.
移动光标到框的对角---典型情况是,从左上角移到右下角.
随着光标的移动,越过的文本以粗体显示方式突出显示(常规选择使用反相显示).
框由对角定义.
如果从左上角移动到右下角,光标上的字符在框之外,即框的右下角是在光标的左侧.
然后可以使用普通处理行或矩形范围的任何编辑命令编辑此框.
不需要重新定义键.
有关详情,请参阅ExtensibleVersatileEditorReferenceManual.
如果选择不跨行,可以使用FINDSELECTED或OPENSELECTED.
也可以使用暂挂删除.
如果打算进行几个框编辑---例如,编辑多列表格和列表---使用SETBOXSELECT命令.
SETBOXSELECT重新定义几个命令和键作为相应的BOX命令,并且使其他编辑操作处理框,而不是行范围.
要取消框选择,重复SELECT或BOXSELECT,或使用RESET.
8.
11.
2剪切和粘贴文本框剪切一个框通常用空格填充区域,以保持框右侧文本的列对齐.
粘贴框通常重写现有文本.
在框中或重叠框中的制表符被转换为空格,以保持文本的列对齐.
表8-7列出EVE框编辑命令.
表8-7EVE框编辑命令命令功能BOXCOPY复制文本框而不除去它,因而可以把它粘贴到别处.
BOXCUT剪切文本框因而可以把它粘贴到别处,通常用空格填充这个区域,以保持框右侧文本的列对齐.
BOXCUTINSERT剪切一个框,使框右侧的文本向左移动,并除去间隙.
BOXCUTOVERSTRIKE剪切一个框,用空格填充这个区域,以保持框右侧文本的列对齐.
BOXPASTE粘贴已复制或剪切的文本框,通常重写现有文本.
BOXPASTEINSERT粘贴框,把现有文本向右推.
BOXPASTEOVERSTRIKE粘贴框,重写现有文本.
BOXSELECT选择一个文本框.
典型情况是,从框的左上角开始并移动光标到右下角.
RESTOREBOXSELECTION放回(反删除)一个用暂挂删除擦除的框,通常重写现有文本.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumSETBOXNOPAD撤消框编辑的填充和加粗,除非缓冲区处于重键模式.
SETBOXNOSELECT默认设置.
撤消框选择、剪切和粘贴.
命令(如SELECT、COPY和REMOVE)使用标准的行范围.
要编辑框,使用BOX命令.
SETBOXPAD默认设置.
允许框编辑的自动填充和加粗,不管缓冲区模式.
SETBOXSELECT允许框选择,使诸如SELECT、REMOVE和INSERTHERE命令与相应的BOX命令一样,不必重新定义键.
指南:剪切和粘贴文本要选择然后剪切和粘贴一个文本框:1.
调用EVE建立缓冲区CITIES.
DAT,并输入以下文本:RomeParisNewYorkLondonTunisBostonTokyoBonnLisbon2.
移动光标到字Paris中字母P的左侧.
输入BOXSELECT命令.
3.
移动光标到字Bonn中第二个字母n右侧两个空格处---框的对角.
以粗体显示方式突出显示横过的文本.
输入BOXCUT命令.
EVE除去这个文本框.
4.
移动光标到从字NewYork开始的列的右侧.
5.
输入BOXPASTE命令.
EVE粘贴这文本框到一个新列,如下所示:RomeNewYorkParisLondonBostonTunisTokyoLisbonBonnEndoffile]8.
11.
3SETBOXSELECT命令表8-8列出SETBOXSELECT命令.
表8-8SETBOXSELECT命令命令带SETBOXSELECT的效果INSERTHERE或PASTEBOXPASTEREMOVE或CUTBOXCUTRESTORESELECTIONRESTOREBOXSELECTIONUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumSELECTBOXSELECTSTORETEXT或COPYBOXCOPY于是您可以使用Select、Remove和InsertHere键,选择、剪切和粘贴框,而不必重新定义这些键.
8.
12使用暂挂删除您可以使用暂挂删除擦除选定的文本.
暂挂删除是指通过键入新文本、按下空格键或使用删除(典型情况是,按下Delete键)擦除选择的文本.
使用框选择,暂挂删除效果象BOXCUT,通常用空格填充这个区域以保持框右侧文本的列对齐.
暂挂删除为您给出另一种剪切和粘贴文本的方法,因为暂挂删除不使用InsertHere缓冲区.
有关暂挂删除的详情,请参阅EVE联机求助中称为暂挂删除的题目.
8.
12.
1使用暂挂删除擦除选择要使用暂挂删除擦除一个选择,执行以下步骤:1.
在EVE中调用文件.
2.
要允许暂挂删除,使用SETPENDINGDELETE命令.
默认设置是SETNOPENDINGDELETE.
3.
选择要擦除的文本.
可以使用SELECT或BOXSELECT.
(不能使用SELECTALL.
)4.
键入新文本或使用DELETE命令.
8.
12.
2恢复暂挂删除擦除的选择要放回(恢复)用暂挂删除擦除的文本,执行以下步骤:1.
把光标放在要恢复文本的位置.
如果恢复框选择,把光标放在框左上角.
2.
使用RESTORESELECTION.
如果一个框选择被暂挂删除擦除,使用RESTOREBOXSELECTION.
如果使用SETBOXSELECT,可以使用RESTORESELECTION(不必重新定义键).
恢复一个框象BOXPASTE一样,通常重写现有文本.
使用SETBOXNOPAD命令时,框编辑的效果依赖于缓冲区的模式(插入或重键,它展示在状态行中):在插入模式中,框剪切使框右侧的文本向左移动,除去间隙.
框右侧的制表符也被转换为空格以使文本向左收缩时也保持列对齐.
对于从一个表格或列表除去列的情况,这个方法是有用的,例如把一个4列表格转换为2列表格.
框粘贴把现有文本推向右侧,这有助于在表格的中间添加列.
在重键模式下,框剪切用空格填充区域,以保持框右侧文本的列对齐.
框粘贴重写现有文本.
效果与SETBOXPAD一样,SETBOXPAD是默认设置.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum缓冲区模式也影响用暂挂删除方法擦除框和恢复已擦除的框.
8.
13查找和替换文本使用EVE命令,可以搜索缓冲区中的特定文本.
可以搜索特定文本的每次出现,并且可以在单行或跨行范围搜索文本.
另外,可以使用通配符搜索文本.
本节描述搜索和替换文本的方法.
表8-9描述在缓冲区中找出文本的EVE命令.
表8-9在缓冲区中找出文本的EVE命令命令功能FIND搜索当前缓冲区查找指定的文本串,并突出显示找到的文本.
突出显示的文本称为找到的范围.
FINDNEXT搜索上次使用FIND、REPLACE或WILDCARDFIND命令指定的文本字符串.
FINDSELECTED搜索选定的文本字符串,而不是键入的字符串.
该选择不能跨行.
SETFINDCASEEXACT允许大小写精确搜索.
这对于查找或替换只有小写字母的搜索串是特别有用的.
SETFINDCASENOEXACT默认设置.
撤消大小写精确搜索,使EVE查找以小写字母形式输入搜索串的任何出现.
SETFINDNOWHITESPACE默认设置.
设置FIND和WILDCARDFIND命令正确地匹配搜索串指定的制表符和空格,并且搜索完全在一行的字符串.
SETFINDWHITESPACE设置FIND和WILDCARDFIND命令把空格、制表符、直到一个分行符处理为"白空格",因而可以搜索两个或更多字的字符串,而不管它们是如何分开的.
SETWILDCARDVMSOpenVMS的默认设置.
允许OpenVMS式样用于WILDCARDFIND.
SHOWWILDCARDS列出WILDCARDFIND可以使用的通配符式样.
WILDCARDFIND使用通配符搜索一种式样的文本.
8.
13.
1查找文本使用FIND命令在当前缓冲区中找出特定文本.
按照默认,EVE定义E1键(在VT200、VT300和VT400系列终端上的Find键和在VT100系列终端上的PF1键)为FIND命令.
如果搜索串包含所有小写字母,那么EVE忽略字母的大小写形式而找出这个字符串的任何出现.
因而,搜索串the匹配the、THE、THe和thE.
如果搜索串包含一个或多个大写字母,那么EVE只查找每个字母的大小写形式是完全一样的字符串.
因此,搜索串tHis只匹配tHis.
例如:1.
输入FIND命令.
2.
键入要找出的文本(称为搜索串).
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum缓冲区的当前方向确定EVE是否首先从正向或反向搜索.
如果EVE不能在当前方向找出这个字符串,但是可以从相反方向找到它,那么EVE提示更改方向.
要从相反方向搜索,键入YES(Y)并按下Enter键.
EVE移动光标到该字符串在相反方向的第一次出现.
然而,在突出显示的状态行中的当前方向不会更改.
8.
13.
1.
1当查找到搜索串时EVE找到搜索串时,编辑程序突出显示它,并移动光标到这个字符串的第一个字母.
有关可以在突出显示的搜索串上使用编辑命令的列表,请参阅ExtensibleVersatileEditorReferenceManual.
要取消突出显示,把光标移出搜索串或者使用RESET命令.
要查找搜索串的下一个出现,按下Find键两次或者输入FINDNEXT命令.
8.
13.
2设置大小写精确搜索搜索字符串小写字母的出现时,如果要精确地匹配搜索串的字母大小写,那么输入SETFINDCASEEXACT命令.
于是,当以小写字母形式输入搜索串时,EVE只搜索小写字母的出现,而忽略包含大写字母的出现.
该设置应用于FIND、REPLACE和WILDCARDFIND命令.
可以把设置保存在节文件或命令文件中,供以后的编辑对话期使用.
默认设置是SETFINDCASENOEXACT.
EVE对读音(重音)标记是敏感的,并且只找出精确匹配读音符号的字符串.
例如,在搜索时,EVE不查找e、é、è或ê.
在以下例子中,这命令允许大小写精确搜索,然后只查找digital小写字母形式的出现,忽略如Digital或DIGITAL的出现:Command:SETFINDCASEEXACTCommand:FINDdigital指南:查找文本要对现有文件RHYMES.
DAT使用FIND命令:1.
调用EVE编辑RHYMES.
DAT.
光标出现在缓冲区的第一行第一个字母处,并且当前方向是正向.
2.
按下Find键,键入字母ree,并按下Enter键.
光标移动到字tree的字母r并突出显示字母ree.
3.
按下Find键两次查找字符串ree的下一个出现.
光标移动到字three的字母r并突出显示字母ree.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum当查找到搜索串并突出显示时,可以使用除SPELL之外的任何处理已选定或找到范围的命令.
并且,不能在找到的范围使用暂挂删除操作.
4.
输入UPPERCASEWORD命令.
UPPERCASEWORD命令把突出显示字母的字母大小写从小写字母更改为大写字母,如以下例子所示:Sherhymeswithtree,alsowithbee,andthisonemakesthREE.
[Endoffile]指南:使用FINDSELECTED命令要使用FINDSELECTED搜索特别复杂或容易拼错或打错的字符串:1.
复制文本(从前面的指南)以便该文本在缓冲区中显示两次.
2.
移动光标到第一行的字符串rhymeswithtree,的开始.
3.
输入SELECT命令.
4.
移动光标突出显示这个字符串并选择文本.
注意,选择不能跨行.
5.
输入命令FINDSELECTED.
光标移动到字符串rhymeswithtree,的下一个出现.
选择被取消,而找到的字符串以粗体显示形式出现.
8.
13.
3使用通配符您可以使用通配符搜索文本.
SHOWWILDCARDS命令显示当前通配符设置的通配符式样.
指南:使用通配符学习如何使用通配符:1.
定位光标在缓冲区的开始.
2.
输入命令WILDCARDFIND*ee搜索以ee结束的文本串.
Sherhymeswithtree,alsowithbee,andthisonemakesthREE.
[Endoffile]3.
EVE把光标定位在tree内包含r的行首.
8.
13.
4搜索包括白空格UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum使用SETFINDWHITESPACE和SETFINDNOWHITESPACE命令指定WILDCARDFIND和FIND命令如何处理字间白空格,例如空格、制表符和分行符.
SETFINDNOWHITESPACE命令允许命令搜索单行中的多字字符串,精确地匹配找到的空格和制表符.
SETFINDNOWHITESPACE是默认搜索行为.
SETFINDWHITESPACE命令允许WILDCARDFIND和FIND命令搜索含有两个或更多字的字符串,而不管它们是如何分开的.
它允许FIND命令搜索在字间包含一个单分行符和一个以上空格或制表符的字符串.
8.
13.
5在文本中标记位置MARK和GOTO命令可用于编辑大的文件,以后在编辑对话期间返回到特定位置.
下表描述MARK和GOTO命令:命令功能MARK把不可见标记放在当前光标位置.
在其余编辑对话期时间,标记一直存在直到您更改它;退出时它不被保存.
GOTO光标返回到MARK命令标号的位置.
如果标号的位置在另一个缓冲区找到,那么EVE移动光标到其他缓冲区并把那个缓冲区放入当前窗口.
要标记位置,输入MARK命令后面跟随一个选择的标号名.
标号名可以是一个或多个可打印字符,包括字母数字和标点字符、空格和制表符.
要返回光标到标记的位置,输入GOTO命令后面跟随标号名.
8.
13.
6替换文本使用REPLACE命令,可以在当前缓冲区中用一个文本串替换另一个文本串.
如果在一个长文件中有一个拼错的字,而要修改这个拼错字的每个出现,这是有用的.
8.
13.
6.
1REPLACE命令和字母大小写敏感性REPLACE命令是大小写敏感的.
如果旧字符串有一些大写字母,EVE搜索精确的字母大小写匹配.
如果旧字符串都是小写字母,EVE搜索这个字符串的任何出现,而不管它的字母大小写.
如果新字符串有一些大写字母,EVE精确地替换字符串.
如果旧的和新的字符串都是小写字母,EVE则根据以下规则替换字符串:旧字符串的首字母大写版本(第一个字母大写,其他小写)被新字符串的首字母大写版本替换.
旧字符串的所有大写版本被新字符串的所有大写版本替换(否则,旧字符串被新字符串的所有小写版本替换).
下表展示EVE如何使用字符串的字母大小写:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum旧字符串新字符串突出显示替换buttermargarinebuttermargarineButterMargarineBUTTERMARGARINEBUtteRmargarineButtermargarineButtermargarinebutterMargarinebutterMargarineButterMargarineBUTTERMargarineBUtteRMargarineButterMargarineButterMargarine如果只要查找或替换字符串的小写字母出现,就输入SETFINDCASEEXACT命令.
于是,如果以所有小写字母形式输入搜索串,EVE只搜索字符串的小写字母出现,忽略包含大写字母的出现.
该设置应用于FIND、REPLACE和WILDCASEFIND命令.
下表展示当输入SETFINDCASEEXACT命令时,EVE如何只搜索和替换小写字母的字符串:旧字符串新字符串突出显示替换buttermargarinebuttermargarine默认字母大小写设置是SETFINDCASENOEXACT.
8.
13.
6.
2REPLACE命令响应下表展示REPLACE命令询问的响应和效果:响应效果Yes替换这个出现并查找下一个.
这是默认响应.
按下Enter键.
No跳过这个出现并查找下一个.
All替换所有出现(不再提示,除非EVE从相反方向找到一个出现).
Last替换这个出现并在这里停止.
Quit跳过这个出现并在这里停止.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum8.
14使用命令行限定词调用EVE时,可以使用命令行限定词指定高级EVE编辑特性.
当使用字符单元屏幕更新程序时,默认插入或重键模式由终端设置确定.
表8-10列出可以用于EDIT命令调用EVE的限定词.
表8-10EDIT命令行限定词限定词默认命令文件/COMMAND=TPU$COMMAND.
TPU文件建立/CREATE调试软件包/NODEBUG指定显示模式/DISPLAY=CHARACTER_CELL初始化文件/INITIALIZATION=EVE$INIT.
EVE日志/JOURNAL修改主缓冲区/MODIFY指定输出/OUTPUT=output-file只读存取/NOREAD_ONLY恢复/NORECOVER节文件/SECTION=TPU$SECTION开始位置/START_POSITION=(1,1)工作文件/WORK=SYS$SCRATCH:TPU$WORK.
TPU$WORK8.
14.
1从其他位置开始开始位置限定词确定在命令行指定的缓冲区中光标第一次出现的行与列.
对于EVE,默认开始位置是1、1---行1、列1,是在缓冲区的左上角.
使用开始位置限定词,不影响在编辑对话期间建立另一个缓冲区的初始光标位置,并且不限制缓冲区大小.
开始位置限定词的格式如下所示:/START_POSITION=(row[,column]各字段如下所示:/START_POSITION必须对EDIT命令使用/START_POSITION=限定词.
row调用EVE时想要光标所在的行号.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumcolumn调用EVE时想要光标所在的列号.
使用开始位置限定词在特定行或在特定字符位置(或列)开始编辑.
例如,当要略过一个文件的标准标题时,或者一个批量日志文件或出错消息告知在程序的哪一行出错,就可以指定这个行号作为开始行,以便编辑程序源文件时,光标直接移动到那一行.
以下命令编辑一个文件test.
com并把光标放在行10、列5:$EDITTEST.
COM/START_POSITION=(10,5)如果要从文件的特定行开始,可以省略第二个参数(列).
8.
14.
2使用工作文件工作文件限定词确定用来交换存储器以便编辑很大文件的工作文件.
每个编辑对话期有一个工作文件.
工作文件是临时文件,退出时自动删除.
默认工作文件名是TPU$WORK.
TPU$WORK.
EVE在SYS$SCRATCH建立工作文件,除非指定不同的位置.
有两种方法指定不同的工作文件:定义逻辑名TPU$WORK.
这是有用的,如果要把工作文件建立在不同于SYS$SCRATCH的区域,例如在一个较大的磁盘上.
可以把定义放入LOGIN.
COM文件.
使用/WORK=限定词并指定工作文件.
它取代TPU$WORK逻辑名的任何定义.
例如,以下命令调用EVE并把工作文件指定为SYS$SCRATCH:MYWORK.
TPU$WORK:$EDIT/WORK=MYWORK如果想要工作文件建立在不同于SYS$SCRATCH的区域,使用一个完整文件说明,包括设备(磁盘)和目录.
不能使用通配符指定工作文件.
8.
14.
3修改主缓冲区修改限定词确定是否可修改命令行中指定的缓冲区.
修改不影响在编辑对话期间建立的其他缓冲区.
按照默认,编辑缓冲区中文本就可以修改缓冲区.
退出时,如果缓冲区已修改,EVE就把缓冲区写入一个文件.
使用/NOMODIFY检查文件而不做任何更改.
于是可以使用光标移动命令但不能更改文本.
如果既不指定/MODIFY也不指定/NOMODIFY,则应用程序确定是否可以修改缓冲区.
EVE的默认行为是修改缓冲区.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum使用/MODIFY取代/READ_ONLY或/NOWRITE的效果.
使用/MODIFY连带/READ_ONLY或/NOWRITE在退出编辑操作时不会写入文件.
例如,下命令调用EVE,使命令行中指定缓冲区为只读(或不可写),但可修改:$EDIT/READ_ONLY/MODIFY在EVE中,使用SETBUFFER命令可以设置或更改缓冲区的修改属性.
8.
15调用EVE的其他方法可以使用4种不同方法调用EVE:用搜索列表、用通配符、用通配符目录名或用多个输入文件.
8.
15.
1用搜索表调用EVE可以使用一个搜索列表调用EVE,从而编辑搜索列表中的文件.
例如:$DEFINESTAFFMEMOSHIRING.
DAT,PROMOTION.
LIS,SALARY.
TXT$EDITSTAFFMEMOS在这个例子中,如果搜索列表的第一个文件存在,EVE把文件(HIRING.
DAT)复制到缓冲区并使用其文件名和文件类型作为缓冲区名.
如果这个文件不存在,EVE试着获得第二个文件(PROMOTION.
LIS),等等.
如果搜索列表没有一个文件存在,EVE则建立一个空缓冲区,并且命名为HIRING.
DAT,因为它是搜索列表的第一个文件.
8.
15.
2用通配符调用EVE调用EVE编辑现有文件时,可以使用星号(*)通配符代替文件名和文件类型中的一些或所有字符.
要在EVE中使用通配符,遵循在DCL中使用通配符的同样规则.
可以使用百分号(%)通配符每次代替单个字符,并且可以使用省略号([.
.
.
])通配符代替目录说明.
如果只匹配一个,这个文件就显示在您的屏幕上.
如果匹配一个以上,EVE会显示一列匹配的文件并提示您提供一个更完整的文件说明.
如果没有匹配,EVE则建立一个名为Main的空缓冲区.
如果请求的通配符匹配一个以上文件,那么EVE显示一些匹配文件,从而可以挑选您要的一个.
如果找不到匹配的文件,EVE会建立一个名为Main的空缓冲区.
如果使用搜索列表或通配符目录指定输入文件,EVE就取找到的第一个匹配文件而不显示$CHOICES$缓冲区.
有关使用$CHOICES$缓冲区的详情,请参阅EVE联机求助的题目:ChoicesBuffer.
在以下例子中,将显示文件类型为.
TXT的所有文件:$EDIT*.
TXTUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果指定*.
TXT,那么EVE在第二个窗口中列出在系统缓冲区$CHOICES$中的匹配于通配符请求的文件.
8.
15.
3用通配符目录名调用EVE在目录名([.
.
.
])中您可以使用通配符调用EVE,而您工作在当前目录或当前目录的子目录.
这种处理搜索列表或通配符目录的方法不仅应用于EDIT命令,也应用于使用文件说明参数的EVE命令.
以下EVE命令使用文件说明作为参数:@(at符号)GETFILEINCLUDEFILEOPENOPENSELECTEDRECOVERBUFFER在以下例子中,EVE搜索目录树并取找到的第一个PINK.
TXT文件(如果有).
$EDIT[.
.
.
]PINK.
TXT8.
15.
4用多个输入文件调用EVE在调用EVE的命令行中可以指定多个输入文件.
文件名必须用逗号及可选白空格分开.
如果通配符出现在文件名中,EVE只为有一个以上匹配的第一个通配符文件名显示匹配文件.
对于其他多义文件名,EVE输出一条警告消息.
8.
16日志和恢复日志文件记录您的编辑,以便因系统失败中断了编辑对话期的情况下可以恢复工作.
缓冲区更改日志为您建立的每个文本缓冲区建立一个独立的日志文件.
这是EVE的默认设置.
缓冲区更改日志可在DECwindows和字符单元终端上工作.
通常,在EVE中使用RECOVERBUFFER命令每次可以恢复一个缓冲区.
您可以从不同编辑对话期恢复缓冲区.
恢复操作只恢复文本,但不恢复在系统失败之前的设置、键定义或系统缓冲区的内容(如InsertHerebuffer).
调用EVE时在命令行中使用/NOJOURNAL限定词,可以撤消日志.
使用EVE检查文件而不进行任何编辑或者用于示范对话时,这是有用的.
EVE文件备份是不允许的,并且不能被允许,因为OpenVMS文件系统提供版本号;因此,不需要EVE机制.
8.
16.
1使用缓冲区更改日志UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum缓冲区更改日志为每个文本缓冲区建立一个日志文件.
(EVE不为系统缓冲区建立缓冲区更改日志文件,例如InsertHere缓冲区、DCL缓冲区或$RESTORE$缓冲区.
)当辑缓冲区时,日志文件记录更改操作,例如擦除、插入或重新格式化文本.
退出EVE或者删除这个缓冲区时,就删除日志文件.
如果一个系统失败中断了编辑对话期,就保存日志文件.
几乎不会失去在系统失败之前最后的按键.
表8-11概述缓冲区更改日志和恢复的EVE命令.
表8-11缓冲区更改日志和恢复的EVE命令命令功能或效果RECOVERBUFFER使用缓冲区的日志文件恢复指定的缓冲区.
可以指定要恢复的缓冲区或文件的名称或者缓冲区的日志文件名.
RECOVERBUFFERALL通过使用缓冲区的日志文件(如果有),一次一个地恢复所有文本缓冲区.
SETJOURNALING允许缓冲区更改日志用于指定的缓冲区.
SETJOURNALINGALL允许缓冲区更改日志用于所有缓冲区.
这是默认设置.
SETNOJOURNALING不允许缓冲区更改日志用于指定的缓冲区.
SETNOJOURNALINGALL不允许缓冲区更改日志用于所有缓冲区.
缓冲区更改日志文件写入逻辑名TPU$JOURNAL定义的目录中.
按照默认,这个目录是SYS$SCRATCH,通常是在您的顶级(注册)目录.
可以重新定义TPU$JOURNAL逻辑名,使日志文件写入不同目录.
例如,以下命令建立一个子目录[USER.
JOURNAL],然后把TPU$JOURNAL定义为这个子目录:$CREATE/DIRECTORY[USER.
JOURNAL]$DEFINETPU$JOURNAL[USER.
JOURNAL]可以把这个定义放入LOGIN.
COM文件中.
缓冲区更改日志文件可能相当大(甚至比编辑的文本文件还要大).
因为缓冲区更改日志文件的潜在大小并且因为每个文本缓冲区有一个日志文件,因此可能需要把TPU$JOURNAL定义为大磁盘上的目录或子目录,而不是SYS$SCRATCH.
导出缓冲区更改日志名缓冲区更改日志文件名得自正在编辑的文件或缓冲区名称和用于操作系统的默认文件类型.
要找出当前缓冲区日志文件的名称,在EVE提示下输入SHOW命令.
SHOW命令显示输入文件、输出文件、日志文件的名称和当前缓冲区的其他有关信息.
表8-12展示缓冲区更改日志文件名.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum表8-12缓冲区更改日志文件名文本缓冲区名缓冲区更改日志文件JABBER.
TXTJABBER_TXT.
TPU$JOURNALGUMBO_RECIPE.
RNOGUMBO_RECIPE_RNO.
TPU$JOURNALMAINMAIN.
TPU$JOURNALLATESTNEWSLATEST_NEWS.
TPU$JOURNAL使用缓冲区更改日志恢复编辑使用缓冲区更改日志文件,有两种方法恢复您的编辑:调用EVE时,在EDIT命令行上使用/RECOVER限定词.
在EVE中使用RECOVERBUFFER命令.
在以下例子中,当一个系统失败中断编辑对话期时,您正在编辑一个文件JABBER.
TXT.
于是您使用系统恢复命令恢复您的编辑.
$EDITJABBER.
TXT.
.
.
***systemfailure***.
.
.
$EDITJABBER.
TXT/RECOVER使用RECOVERBUFFER命令要使用恢复缓冲区命令,遵照这个过程:步骤任务1调用EVE并输入以下命令恢复文本:Command:RECOVERBUFFERfile-name.
txt如果缓冲区更改日志文件是可用的,EVE展示以下信息并问是否想要UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum恢复该缓冲区:缓冲区名缓冲区的原始输入文件,如果有缓冲区的输出文件,如果有恢复的源文件,如果有编辑对话期的开始日期和时间日志文件的建立日期和时间2按下Enter键恢复缓冲区.
如果不想恢复缓冲区,则键入No并按下Enter键.
如果删除或重新命名恢复的源文件,则恢复失败.
源文件是最初读入缓冲区的文件(如果有)或者是在系统失败之前最后写入的文件.
如果存在您想要恢复的缓冲区好(通常是Main缓冲区),EVE首先删除那个缓冲区,然后进行恢复.
如果想要恢复的缓冲区已被修改,那么EVE问您是否在恢复之前删除这个缓冲区.
文件名不肯定时如何恢复如果缓冲区名或日志文件名不肯定,则指定星号(*)通配符,如下所示:Command:RECOVERBUFFER*于是,EVE显示一个所有可用日志文件列表,您可以从中挑选一个.
这个列表出现在EVE系统缓冲区$CHOICES$中并在第二个窗口显示.
有关使用$CHOICES$缓冲区的详情,请参阅EVE联机求助的题目:ChoicesBuffer.
如何恢复所有缓冲区要恢复所有文本缓冲区(每次一个),使用RECOVERBUFFERALL命令.
于是EVE尝试恢复每个有缓冲区更改日志的文本缓冲区.
其效果与重复使用不指定缓冲区名或日志文件名的RECOVERBUFFER命令一样.
对于每个文本缓冲区,EVE显示一些信息,例如缓冲区名、与缓冲区关联的文件和建立日志文件的时间和日期.
EVE提示您输入以下之一:响应效果Yes恢复缓冲区,然后请问您是否恢复下一个缓冲区(如果有).
这是默认响应.
按下Enter键.
No跳过这个恢复.
如果有另一个要恢复的缓冲区,那么EVE问您其他缓冲区.
Quit取消---不恢复缓冲区,并且不继续恢复操作.
撤消缓冲区更改日志UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum使用SETNOJOURNALING命令,可以撤消对特定缓冲区的缓冲区更改日志.
要撤消所有缓冲区的缓冲区更改日志,使用SETNOJOURNALINGALL命令.
允许缓冲区更改日志如果已撤消缓冲区更改日志,使用SETJOURNALING命令可以允许记日志.
以下命令允许缓冲区JABBER.
TXT记日志:Command:SETJOURNALINGJABBER.
TXT如果调用EVE时没有日志,然后想要在编辑对话期间允许缓冲区更改日志,那么使用SETJOURNALINGALL命令(这是EVE默认的设置).
如果缓冲区已被修改,您不能允许缓冲区更改日志.
在这种情况下,EVE显示以下消息:Command:SETJOURNALINGMEMO.
TXTBufferMEMO.
TXTisnotsafeforjournaling应该首先使用WRITEFILE或SAVEFILE命令写入(保存)缓冲区,然后才允许记日志.
8.
17EVE格式化命令的EVE提供格式化文本的命令:设置页边距、制表符和字绕接.
可以行对中、去掉文本的额外白空格和插入分页符.
表8-13展示EVE编辑键并描述其功能.
表8-13EVE编辑键及其功能键或组合键功能Return或Ctrl/M在当前位置插入一个回车,开始一个文本新行或者终止键入的命令.
在VT200、VT300和VT400系列终端上,EVE也定义Enter键为Return.
Tab或Ctrl/I根据制表符模式在当前位置插入一个制表符,并在当前设置的制表符停止列插入一个制表符.
Ctrl/L在当前位置插入一个换页字符,标记新页的开始.
分页符出现为一个小的双F(FF),并且总是自占一行.
与INSERTPAGEBREAK一样.
表8-14展示EVE文本格式化命令及其功能.
表8-14EVE文本格式化命令及其功能UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum命令功能CAPITALIZEWORD更改字母大小写,使第一个字母为大写字母而其余字母为小写字母.
适用于范围、框或单个字.
CENTERLINE使当前行在左和右页边距间居中.
光标跟随这行移动,当行移动时,光标保持在同一字符上.
CONVERTTABS在一个框、范围或整个缓冲区中,把制表符转换为适当数目的空格.
FILL根据缓冲区的页边距,重新格式化当前段落、范围或框,使最大数目的字放入一行中.
当填充一个选择范围或找到的范围时,FILL或FILLRANGE命令不重新格式化开始于分页符、DIGITALStandardRunoff(DSR)命令或DOCUMENT标签的文本行;但要重新格式化范围中的其他行.
填充范围不删除空白行.
有关选择范围的详情,请参阅8.
9节.
FILLPARAGRAPH根据缓冲区的页边距设置,重新格式化光标所在的段落.
当填充一个段落时,FILL命令不重新格式化开始于分页符、DSR命令或DOCUMENT标签的文本行;但要重新格式化段落中的其他行.
FILLRANGE根据当前页边距设置,重新格式化范围或框.
填充一个选择范围或找到的范围时,FILL或FILLRANGE命令不重新格式化开始于分页符、DSR命令或DOCUMENT标签的文本行;但要重新格式化范围中的其他行.
填充范围不删除空白行.
INSERTPAGEBREAK在当前位置插入一个换页字符,标记新页的开始.
分页符出现为一个小的双F(FF),并且总是自占一行.
按照默认,Ctrl/L定义为INSERTPAGEBREAK.
LOWERCASEWORD把当前字、范围或框更改为小写字母.
PAGINATE为54行的页插入一个"软"分页符.
软分页符出现为一个换页符后面跟随空字符(FFNL).
输入PAGINATE命令时,EVE退回到上一个分页符(如果有),然后向前检查在下一个54行内的分页符.
如果在那些54行中找到软分页符,EVE就除去它们.
然后EVE向下移动54行,插入一个软分页符,并把光标放在下一行.
插入的软分页自占一行.
如果在这54行中找到一个硬分页符(只是换页符),EVE就停止在硬分页符之后的一行,在这种情况下,就要擦除这个分页符.
SETLEFTMARGIN设置当前缓冲区的左页边距.
左页边距必须大于0但要小于右页边距.
按照默认,左页边距是1(最左边的列).
SETRIGHTMARGIN设置当前缓冲区的右页边距.
右页边距必须大于左页边距.
按照默认,右页边距比宽度小1.
宽度通常是80,因而默认右页边距通常是79.
SETPARAGRAPHINDENT指定要添加到建立的或重新格式化的段落中第一行的空格数目,或从中减去的空格数目.
默认是0(不缩进).
SETTABSAT把制表符停止列设置在指定的列.
这些列号必须是升序并且用空格分开.
按照默认,每8列设置一个制表符停止列.
这个命令不影响终端的硬件制表符设置.
SETTABSEVERY按指定间隔设置制表符停止列.
按照默认,每8列设置一个制表符停止列.
这个命令不影响终端的硬件制表符设置.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumSETTABSINSERT默认设置.
更改制表符模式以便按下Tab键时EVE在当前列插入一个制表符.
光标和文本移动到下一个制表符停止列.
SETTABSMOVEMENT更改制表符模式,以便Tab键成为一个光标移动键.
按下Tab键移动光标到下一个制表符停止列,但不插入一个制表符.
SETTABSSPACES更改制表符模式,以便当按下Tab键时插入适当数目的空格而不是一个制表符.
以前存在的制表符不受影响.
SETTABSINVISIBLE默认设置.
使制表符在屏幕上不可见,出现为白空格.
SETTABSVISIBLE使制表符在屏幕上可见,出现为一个小的HT(水平制表符).
SETNOWRAP撤消在缓冲区右页边距上的字绕接.
要开始新行,按下Enter键或使用FILL命令.
SETWRAP默认设置.
允许在缓冲区右页边距上的字绕接.
EVE开始新行,而不用按下Enter键或使用FILL命令.
UPPERCASEWORD把当前字、范围或框更改为大写字母.
8.
18使用缓冲区缓冲区是只在编辑对话期间存在的存储区域.
编辑一个现有文件时,EVE把文件的内容读入缓冲区.
突出显示的状态行包含缓冲区名、编辑状态(只读或写入)、编辑模式(插入或重键)和方向(正向或反向).
表8-15描述用于建立、处理和删除缓冲区的EVE命令.
表8-15处理缓冲区的EVE命令命令功能BUFFER把指定的缓冲区放入当前窗口,并把光标移到它在那个缓冲区占据的最后位置.
如果指定的缓冲区不存在,就建立一个新缓冲区.
DELETEBUFFER按名称删除指定的缓冲区.
GETFILE或OPEN把指定文件放入当前EVE窗口,如果有必要就建立新缓冲区.
如果这个文件存在,EVE就把它复制到在当前窗口中的一个新缓冲区.
如果这个文件不存在,EVE就建立一个新的空缓冲区,并为缓冲区名使用这个文件名和文件类型.
如果已经有一个同名的缓冲区,EVE就要问一个不同的名称.
GOTO返回光标到MARK命令标号的位置.
如果标号的位置在另一个缓冲区找到,EVE就移动光标到那个缓冲区并且把它放入当前窗口.
(8.
18.
5节解释在编辑对话期间如何使用多个缓冲区.
)INCLUDEFILE把指定文件的内容插入到当前缓冲区的光标位置的上一行.
这有助于组合文件.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumNEW建立新的缓冲区Main并把它放入当前窗口.
如果缓冲区Main已经存在,EVE就问新缓冲区的名称.
NEXTBUFFER把下一个缓冲区(如果存在)放入当前窗口,并把光标移到它在那个缓冲区占据的最后位置.
这个命令让您从一个缓冲区移动到另一个而不必指定缓冲区名.
OPENSELECTED打开其名称已选定或找到的文件.
这个命令与使用GETFILE或OPEN命令一样,不必键入文件名.
REMOVE或CUT如果您处于缓冲区列表缓冲区中,那么与DELETEBUFFER一样.
使用如下REMOVE命令删除一个缓冲区而不必键入缓冲区名:输入SHOWBUFFERS命令(使您处于缓冲区列表缓冲区中),移动光标到要删除的缓冲区名,并输入REMOVE命令.
SAVEFILE把当前缓冲区的内容写入与缓冲区关联的文件但不结束编辑对话期.
如果使用SAVEFILE命令时不指定文件名,那么EVE提示输入您输入输出文件说明.
类似于WRITEFILE.
SAVEFILEAS把当前缓冲区的内容写入指定的文件但不结束编辑对话期.
例如,如果正在编辑文件FIRST.
DAT,可以把它保存为SECOND.
TXT.
这个命令不更改缓冲区名.
然而,它把缓冲区与您命名的文件关联,使得任何后续的SAVEFILE、WRITEFILE或EXIT命令把缓冲区写入您命名的文件.
这个命令需要您提供一个文件说明.
SELECT或RETURN如果处于缓冲区列表缓冲区,选择指定的缓冲区.
使用如下SELECT命令选择一个缓冲区而不必键入缓冲区名:输入SHOWBUFFERS命令,移动光标到要选择的缓冲区名,并输入SELECT命令.
SETBUFFER指定缓冲区的编辑状态:缓冲区是否可以修改,或者当退出EVE时可以写入一个文件.
SHOW显示在编辑对话期间建立的缓冲区信息.
如果在编辑对话期间有一个以上缓冲区是活动的,那么SHOW命令显示当前编辑缓冲区的信息.
有关其他活动缓冲区的信息,按下Do键.
要恢复编辑,按下任何其他键.
SHOWBUFFERS列出在编辑对话期间建立的缓冲区.
可以在列表中移动光标,并且通过按下Select键指定一个特定缓冲区来观看.
SHOWDEFAULTSBUFFER展示有关EVE系统缓冲区$DEFAULTS$的信息,如页边距、制表符停止列、方向、模式和最大行数.
建立新缓冲区时使用这些默认设置.
SHOWSYSTEMBUFFERS列出EVE建立的系统缓冲区,例如消息缓冲区、求助缓冲区、InsertHere缓冲区和$RESTORE$缓冲区.
可以在列表中移动光标,并且通过按下Select键指定一个缓冲区来观看.
WRITEFILE把当前缓冲区的内容写入与缓冲区关联的文件或在命令行中指定的文件,但不结束编辑对话期.
如果当前缓冲区没有一个文件说明与之关联,那么EVE提示您输入一个输出文件说明.
类似于SAVEFILE.
8.
18.
1获得缓冲区信息UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum要显示当前缓冲区的更多信息,输入SHOW命令.
显示的信息包括缓冲区是否已修改,另外有以下信息:缓冲区名输入、输出和缓冲区更改日志文件的名称当前模式和方向行数页边距和屏幕宽度设置段落缩排WPS字绕接绕接缩进制表符停止列如果在编辑对话期间有一个以上缓冲区是活动的,那么EVE提示您按下Do键可获得其他缓冲区的信息.
8.
18.
2删除缓冲区要删除缓冲区,输入DELETEBUFFER命令并指定想要删除的缓冲区名.
如果缓冲区是空的或未修改的,EVE就删除它.
然而,如果缓冲区已修改,EVE则提示您作出选择.
注意,必须完整地键入缓冲区名;不允许缩写.
如果想要删除正在观看的缓冲区,EVE就用在编辑对话期间存在的最旧缓冲区替换这个缓冲区.
下表列出可以输入的选择:关键字效果DELETE_ONLY删除指定的缓冲区.
WRITE_FIRST写出(保存)指定的缓冲区,然后删除它.
QUIT默认选择.
不删除缓冲区.
在以下例子中,请求删除被修改的缓冲区MYFILE.
TXT:Command:DELETEBUFFERMYFILE.
TXTThat'samodifiedbuffer.
Typedelete_only,write_first,orquit:8.
18.
3更改缓冲区状态使用SETBUFFER命令可更改缓冲区的编辑状态;即缓冲区是否可以修改,以及在退出EVE后缓冲区是否会写入一个文件.
您可以为SETBUFFER命令指定以下关键字之一:关键字效果UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumMODIFIABLE默认设置.
缓冲区可以修改.
也恢复缓冲区的以前模式(插入或重键).
READ_ONLY退出时缓冲区不保存(写出),即使它已被修改(与WRITE相反).
也把缓冲区设置为不可修改的.
然而,可以把它设置为可修改的.
UNMODIFIABLE缓冲区不能修改.
也取代缓冲区的模式(插入或重键).
WRITE默认设置.
如果缓冲区已被修改,在退出时就保存(写出)它(与READ_ONLY相反).
如果缓冲区是只读或者不可修改的,那么SETBUFFERWRITE使它可修改,并且恢复到它以前的模式(插入或重键).
按照默认,缓冲区状态设置为MODIFIABLE和WRITE,使您可以更改缓冲区的内容,并把更改的缓冲区保存到一个文件中.
要更改缓冲区的状态,使它的内容不能因疏忽大意而更改,则使用以下命令把缓冲区设置为READ_ONLY(意味着不可修改):Command:SETBUFFERREAD_ONLY要更改缓冲区的状态使它成为临时存储区域(一个"便签簿"),可使用以下命令把缓冲区设置为READ_ONLY和MODIFIABLE:Command:SETBUFFERREAD_ONLYCommand:SETBUFFERMODIFIABLE然后,可以编辑缓冲区,但是当退出EVE时,它将不被保存.
8.
18.
4显示消息缓冲区在编辑对话期间,EVE使用出现在屏幕底部的消息窗口,传达出错和通知信息.
消息窗口显示消息缓冲区中的最新消息.
使用BUFFER命令您可以显示这些消息.
要显示消息缓冲区的内容,按下Do并输入命令BUFFERMESSAGES.
要返回到刚才编辑的缓冲区,按下Do并输入BUFFER命令,后面跟随适当的缓冲区名.
您也可以输入SHOWBUFFERS命令显示已经建立的缓冲区,并按下Select键可挑选一个缓冲区.
8.
18.
5编辑多个缓冲区如果想要编辑一个以上文件,或者如果想要临时存储区域处理多块文本,可以使用几个缓冲区.
您可以使用以下命令之一建立一个新缓冲区:GETFILE或OPEN、OPENSELECTED或BUFFER.
使用GETFILE命令UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum要为一个已经存在的文件建立一个新缓冲区,可输入GETFILE(或OPEN)命令和想要复制到新缓冲区的文件名.
可以使用星号(*)通配符代替在文件名和文件类型中的所有或一些字符.
可以使用百分号(%)通配符代替在文件名和文件类型中的一个字符,并且可以使用省略号([.
.
.
])通配符代替一个目录说明.
使用OPENSELECTED命令您也可以使用OPENSELECTED命令建立一个新缓冲区,如下所示:1.
把光标放在想要打开文件的名称上.
2.
输入OPENSELECTED命令.
使用BUFFER命令要把特定的缓冲区放入当前EVE窗口,输入BUFFER命令和想要放入当前EVE窗口的缓冲区名.
在缓冲区名中不能使用通配符.
星号(*)和百分号(%)被视为缓冲区名中的文字字符.
如果指定的缓冲区不存在,EVE建立一个新缓冲区.
如果存在指定的文件,EVE就把文件的内容读入新缓冲区,并在当前窗口显示缓冲区.
如果带通配符的文件说明有一个以上匹配,EVE就在$CHOICES$缓冲区中显示一个选择列表,并提示您提供一个更完整的文件说明.
如果使用一个搜索列表或一个省略号([.
.
.
])通配符,EVE将打开它匹配的第一个文件.
否则,EVE建立一个空的缓冲区并在当前窗口显示该缓冲区.
要更改在当前窗口的缓冲区,按下Do键,键入BUFFER和想要在屏幕上显示缓冲区的名称,然后按下Enter键.
如果您忘记缓冲区名,输入SHOWBUFFERS命令可显示在编辑对话期间的活动缓冲区名,并使用Select键指定一个缓冲区.
8.
18.
6把文件读入EVE有四种方法可把文件读入EVE缓冲区:调用EVE时带一个文件说明.
输入INCLUDEFILE命令和想要包括文件的名称.
EVE把整个文件内容读入缓冲区,放在光标所在行之前.
使用INCLUDEFILE命令不更改在状态行上的缓冲区名.
输入GETFILE或OPEN命令和想要使用文件的名称.
任意一个命令都建立一个新缓冲区,并把现有文件的内容读入缓冲区.
在状态行上的缓冲区名与使用GETFILE或OPEN命令指定的文件名一样(请参阅8.
18.
5节).
选择或查找一个文件名,然后输入OPENSELECTED命令.
8.
18.
7从EVE写入文件要把当前缓冲区的内容写入文件,输入WRITEFILE命令.
使用WRITEFILE命令可以包括一个文件说明.
如果不包括文件说明,EVE就用输入文件说明写入文件.
如果已使用BUFFER或NEW命令建立当前缓冲区,那么EVE提示输入要写入文件的文件说明.
以下例子展示如何使用与缓冲区关联的输出文件把一个缓冲区写入文件:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumCommand:GETFILERHYMES.
DAT.
.
.
Command:WRITEFILE3lineswrittentoWORKDISK:[USER]RHYMES.
DAT;28.
18.
8使用窗口在EVE编辑对话期间,正在编辑的缓冲区显示在屏幕的一个窗口上.
突出显示的状态行出现在窗口的底部,标识缓冲区的名称、当前编辑模式和当前方向.
EVE让您在终端屏幕上同时观看一个以上窗口.
例如,在终端屏幕上可以有两个窗口观看和编辑同一缓冲区的不同部分.
表8-16描述用于建立和处理窗口的EVE键.
表8-16在EVE窗口中使用的键键或组合键在窗口环境下的功能GOLDNextScreen把光标移入下一个(或其他)窗口.
与NEXTWINDOW命令一样.
GOLDPrevScreen把光标移入上一个(或其他)窗口.
与PREVIOUSWINDOW命令一样.
表8-17描述用于建立和处理窗口的EVE命令.
表8-17EVE窗口命令命令在窗口环境下的功能DELETEWINDOW如果正使用一个以上窗口,则删除当前窗口.
ENLARGEWINDOW按指定行数放大当前窗口.
例如,ENLARGEWINDOW5放大窗口5行.
而邻近窗口相应缩小.
NEXTWINDOW或OTHERWINDOW把光标移入下一个(或其他)窗口.
ONEWINDOW把当前窗口恢复为单个大窗口.
EVE从屏幕上删除所有其他窗口.
不删除与那些窗口关联的缓冲区.
PREVIOUSWINDOW把光标移入上一个(或其他)窗口.
SETWIDTH设置在屏幕上显示的行宽.
指定宽度为一个正整数.
按照默认,屏幕宽度就是您的终端设置(通常80列).
如果设置的宽度比80大,那么EVE把终端设置为132列UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum模式用于当前编辑对话期.
当退出EVE时,终端恢复到默认设置.
宽度设置会更改在所有窗口中的文本显示.
SHIFTLEFT把当前窗口向左移动指定的列数.
使用SHIFTLEFT命令与SHIFTRIGHT命令的效果相反.
SHIFTRIGHT把当前窗口向右移动指定的列数,因而可以观看当前不出现在终端屏幕上的几列字符.
SHRINKWINDOW按指定行数缩小当前窗口.
例如,SHRINKWINDOW5缩小窗口5行.
而邻近窗口相应放大.
SPLITWINDOW拆分当前窗口,形成两个较小窗口.
在这个命令中指定一个数目,可以把窗口拆分成两个以上.
例如,SPLITWINDOW3把窗口拆分为三个窗口.
TWOWINDOWS与SPLITWINDOW2命令一样.
8.
18.
9观看一个缓冲区的两个部分要同时观看一个文件的两个部分,使用SPLITWINDOW命令.
EVE拆分屏幕,建立两个同样的窗口.
光标在缓冲区中保持它的位置,但只在底部窗口出现.
在两个状态行中的缓冲区名是一样的.
显示一个长文件的两个部分,使在文件内移动文本更加有效率.
可以从文件的一个部分选择和除去文本,并把它插入到另一部分.
要把光标从一个窗口移动到另一个窗口,可输入NEXTWINDOW命令.
要从屏幕除去第二个窗口并放大当前窗口占用整个编辑区域,按下Do键,输入命令ONEWINDOW,并按下Enter键.
8.
18.
10编辑两个缓冲区以下过程描述如何编辑包含不同文件的两个缓冲区:步骤任务1输入SPLITWINDOW命令,在屏幕上建立两个窗口.
EVE拆分屏幕并建立两个窗口.
光标在缓冲区中保持它的位置,但只在底部窗口出现.
在每个突出显示状态行中的缓冲区名是一样的.
2使用GETFILE、OPEN或OPENSELECTED命令把第二个文件放入在当前窗口.
要在当前窗口上显示在编辑对话期间较早建立的缓冲区,输入BUFFER命令和想要显示的缓冲区的名称.
现在,终端屏幕显示两个不同缓冲区.
可以从一个缓冲区选择和除去文本,并把它插入到另一个缓冲区.
要把光标从一个窗口移动到另一个窗口,可输入NEXTWINDOW命令.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum8.
19建立子进程您可以建立一个子进程以便在EVE编辑对话期和DCL命令级之间转换,而不必终止编辑对话期.
要建立一个子进程,输入SPAWN命令.
EVE暂停当前编辑对话期,而把终端连接到一个新子进程.
DCL提示($)出现在终端屏幕上.
8.
19.
1派生尽管子进程可以调用任何OpenVMS公用程序或执行任何DCL命令,但要派生子进程的最一般原因是要调用Mail公用程序和运行面向屏幕的程序.
要返回编辑对话期,可输入DCL命令LOGOUT从子进程注销.
EVE恢复编辑对话期,并且光标出现在它在派生子进程之前占据的位置.
也可以为SPAWN命令提供一个DCL命令作为参数来建立特定的子进程.
在以下例子中,Mail公用程序从EVE派生:[Endoffile]Buffer:MAIN|Write|Insert|ForwardCommand:SPAWNMAILMail公用程序的提示(MAIL>)出现在屏幕上.
退出Mail时,自动从这个子进程注销,而EVE恢复编辑对话期.
8.
19.
1.
1从DCL派生EVE比派生进程使用DCL进一步,可以派生一个用于EVE编辑对话期的进程,然后连接父DCL进程来使用DCL命令和公用程序.
要返回到DCL命令级时,使用EVE命令ATTACH返回到父进程.
要恢复编辑对话期,使用DCL命令ATTACH及子进程名,可重新连接到编辑子进程.
在以下例子中,使用DCL命令SPAWN建立一个子进程.
SPAWN命令建立子进程SMITH_1.
在这个子进程级中,调用EVE而建立编辑对话期.
在编辑对话期结束时,输入ATTACH命令而返回到DCL.
然后,要恢复编辑对话期,输入使用子进程名SMITH_1的DCL命令ATTACH:$SPAWN%DCL-S-SPAWNED,processSMITH_1spawnedUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum%DCL-S-ATTACHED,terminalnowattachedtoprocessSMITH_1[Endoffile]Buffer:MAIN|Write|Insert|ForwardCommand:ATTACHSMITH$ATTACHSMITH_1第9章排序和合并文件本章描述如何使用OpenVMSSort/Merge公用程序(SORT/MERGE).
Sort/Merge公用程序执行两个操作:根据选择的字段排序来自一个或多个输入文件的记录,并产生一个重新排序的输出文件根据同样的键字段,合并多达10(高性能Sort/Merge公用程序支持多达12)个以前排序过的输入文件,并产生一个输出文件.
在Alpha系统上,您也可以挑选高性能Sort/Merge公用程序.
这个公用程序利用Alpha结构为多数排序和合并操作提供更好的性能.
有关信息,请参阅9.
1节.
本章描述:高性能Sort/Merge排序文件指定比较顺序以批量作业方式运行Sort合并文件从终端输入记录使用Sort/Merge说明文件优化Sort或Merge操作Sort/Merge限定词概要有关详情,参阅以下:有关本章使用的命令详情,请参阅OpenVMSDCLDictionary.
有关使用Sort/Merge公用程序时系统管理员如何提高效率的详情,请参阅OpenVMSSystemManager'sManual.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum9.
1高性能Sort/Merge在Alpha系统上,您也可以挑选高性能Sort/Merge公用程序.
这个公用程序利用Alpha结构为多数排序和合并操作提供更好的性能.
高性能Sort/Merge公用程序使用与SORT/MERGE同样的命令行界面.
在高性能Sort/Merge公用程序和SORT/MERGE之间的任何差别都在本章加以注释.
使用SORTSHR逻辑名选择高性能Sort/Merge公用程序.
在SYS$LIBRARY中,定义SORTSHR指向高性能排序执行文件,如下所示:$definesortshrsys$library:hypersort.
exe要返回到SORT/MERGE,解除赋值SORTSHR.
如果没有定义SORTSHR,那么Sort/Merge公用程序是默认值.
注意存储器分配差别可能限制高性能Sort/Merge公用程序执行同样数目的并行排序操作的能力,因为Sort/Merge公用程序可以在同样数量的虚拟存储器上执行.
如果出现这种情况,就可以增加可用于进程的虚拟存储器的数量,或者减少工作区范围.
有关使用系统参数更改虚拟存储器数量或减少工作区范围的详情,请参阅OpenVMSSystemManagementUtilitiesReferenceManual.
高性能Sort/Merge公用程序的行为与SORT/MERGE一样,但表9-1所展示的除外.
如果尝试使用一个不支持的限定词或者分配一个不支持值给限定词,那么高性能Sort/Merge公用程序将出错.
表9-1高性能Sort/Merge:在行为上的差别特性高性能Sort/Merge行为键数据类型不支持H-FLOATING和ZONED十进制数据类型.
BINARY数据类型键的大小必须是1、2、4或8字节.
不支持16字节的二进制键.
(这个特性的实现有待将来的OpenVMSAlpha发行版本.
)比较顺序不支持国家字符集(NCS)比较顺序.
(这个特性的实现有UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum待将来的OpenVMSAlpha发行版本.
)不要为/COLLATING_SEQUENCE限定词指定一个NCS比较顺序的名称.
支持ASCII、EBCDIC和MULTINATIONAL比较顺序.
默认是ASCII.
不能使用一个说明文件定义或修改自己的比较顺序.
(这个特性的实现有待将来的OpenVMSAlpha发行版本.
)说明文件不支持说明文件.
(这个特性的实现有待将来的OpenVMSAlpha发行版本.
)不要使用/SPECIFICATION限定词.
内部排序进程只支持记录排序进程.
(这个特性的实现有待将来的OpenVMSAlpha发行版本.
)可以指定/PROCESS=RECORD或省略/PROCESS限定词.
不支持/PROCESS限定词的TAG、ADDRESS和INDEX值.
统计概要信息当前支持以下统计:读取的记录排序的记录输出的记录输入记录长度以下统计是不可用的:内部长度输出记录长度排序树大小初始运行的数目最大合并次序合并成功的数目工作文件分配这个特性的完整实现有待将来的OpenVMSAlpha发行版本.
9.
2排序文件要排序文件,使用DCL命令SORT.
指定要排序文件名,用逗号分开,后面跟随排序后建立的输出文件的名称.
可选地,可以为想要排序的每个字段指定一个键.
每个键包括以下信息:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum记录中键字段的开始位置(必需的)键的大小(必需的)键的数据类型记录排序的次序键的优先级如果不指定任何键,Sort假定只有一个键,并且这个键字段是:在记录的第一个位置开始包括整个记录包含字符数据按升序排序以下两个例子使用默认键.
1.
在这个例子中,文件NAMES.
LST按升序排序:$SORTNAMES.
LSTBYNAME.
LST2.
这个命令建立已排序的输出文件BYNAME.
LST,如图9-1所示.
3.
图9-1按升序排序的列表4.
5.
6.
在这个例子中,文件NAMES.
LST和NAMES2.
LST被排序到已排序的输出文件BYNAME.
LST.
Sort对待这些文件就象它们是一个大文件:$SORTNAMES.
LST,NAMES2.
LSTBYNAME.
LST有关SORT限定词的完整列表,请参阅9.
9节.
9.
2.
1定义键使用/KEY限定词定义一个键.
指定多个键时,为每个键使用一个独立的/KEY限定词.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum表9-2描述组成键的5个元素.
表9-2/KEY限定词值键元素值描述键位置POSITION:n键字段的第一个字节在记录中的位置.
记录第一个字节的位置是1.
POSITION:n是必需的.
键大小SIZE:n键字段的长度.
SIZE:n是必需的,浮点数据除外.
指定大小时,为键指定的数据类型确定什么值是可接受的.
下表列出每类数据的可能值,和用来指定键大小的单位.
数据有效范围单位字符1至32,767字符二进制1、2、4、8或16(对于高性能Sort/Merge公用程序,二进制数据类型的键大小必须是1、2、4或8字节.
对16字节二进制键的支持留待将来的OpenVMSAlpha发行版本.
)字节十进制1至31数字浮点不需要值.
对于十进制数据,如果十进制符号存储在一个单独字节,那么这个字节不计入数据大小的计数中.
如果指定的键超出记录的末端,Sort则把缺失的字符当作空字符.
数据类型CHARACTER字符数据.
CHARACTER是默认数据类型.
BINARY二进制数据.
SIGNED---有符号的二进制或十进制数据.
SIGNED是二进制和十进制数据的默认格式.
UNSIGNED---无符号的二进制或十进制数据.
F_FLOATINGF_FLOATING格式数据.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumD_FLOATINGD_FLOATING格式数据.
G_FLOATINGG_FLOATING格式数据.
H_FLOATING在VAX系统上,H_FLOATING格式数据.
(高性能Sort/Merge公用程序当前不支持.
)S_FLOATING在Alpha系统上,IEEES_FLOATING格式数据.
T_FLOATING在Alpha系统上,IEEET_FLOATING格式数据.
DECIMAL十进制数据.
TRAILING_SIGN---尾随符号的十进制数据.
TRAILING_SIGN是十进制数据的默认格式.
LEADING_SIGN---前导符号的十进制数据.
前导符号必须在字段的第一个位置,而这个字段必须左侧无填补符.
OVERPUNCHED_SIGN---超额打孔的十进制数据.
OVERPUNCHED_SIGN是十进制数据的默认格式.
SEPARATE_SIGN---单独符号的十进制数据.
ZONED分区的十进制数据.
(高性能Sort/Merge公用程序当前不支持.
)PACKED_DECIMAL压缩的十进制数据.
排序次序ASCENDING按递增的字母或数字次序进行排序操作.
ASCENDING是默认次序.
DESCENDING按递减的字母或数字次序进行排序操作.
键优先级NUMBER:n如果没有按照它们的优先级次序列出多个键,则通过它可指定每个键的优先级次序.
可指定值从1至255.
如果键字段的数据不是字符数据,必须指定其数据类型.
Sort/Merge公用程序识别以下数据类型:BINARY,[SIGNED]BINARY,UNSIGNEDCHARACTERDECIMAL,LEADING_SIGN,SEPARATE_SIGN[SIGNED]DECIMAL,LEADING_SIGN,[OVERPUNCHED_SIGN,SIGNED]UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumDECIMAL[,SIGNED,TRAILING_SIGN,OVERPUNCHED_SIGN]DECIMAL,[TRAILINGSIGN],SEPARATE_SIGN,[SIGNED]DECIMAL,UNSIGNEDD_FLOATINGF_FLOATINGG_FLOATINGH_FLOATINGS_FLOATING,IEEE(只用于Alpha系统)T_FLOATING,IEEE(只用于Alpha系统)PACKED_DECIMALZONED在中括号内的项目是默认的,不需要指定.
注意对于十进制字符串数据,Sort/Merge公用程序为VAX和Alpha系统报告在输入串中有一个无效数字是不同的.
在VAX系统上,您会接收到一条消息,告知为了比较把无效数字(或保留操作数)转换为有效的十进制字符串.
在Alpha系统上,Sort/Merge执行同样的转换,但不显示这条消息.
在两种情况下,都把输入文件的数据不更改地写入输出文件.
在图9-2中,文件EMPLOYEE.
LST的每个记录包括3个字段:(1)部门名、(2)帐号和(3)雇员名.
图9-2列表中的记录字段UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum以下例子说明当使用或不使用一个键字段时,如何排序EMPLOYEE.
LST中的记录:1.
在这个例子中,使用/KEY限定词描述帐号字段,按帐号排序EMPLOYEE.
LST:$SORT/KEY=(POSITION:5,SIZE:4,DECIMAL)EMPLOYEE.
LSTBILLING1.
LST2.
这个命令指定键字段(帐号)开始于位置5,是4个字符长,包含十进制数据,并且应该按升序排序(默认).
图9-3展示这个排序操作的结果.
3.
图9-3按键字段排序4.
5.
6.
这个例子展示没有指定键字段时,如何排序文件EMPLOYEE.
LST:$SORTEMPLOYEE.
LSTBYDEPT.
LST7.
因为没有指定键,排序假定默认特征.
图9-4展示这个排序操作的结果.
8.
图9-4用默认键记录排序9.
10.
Sort把EMPLOYEE.
LST的每个记录视为字符数据的一个键.
在这个例子中,每个记录包UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum括一个部门名、一个帐号和一个雇员名.
如果Sort找到重复的部门名,它就按帐号排序部门名.
如果它找到重复的复制帐号,它就按雇员名排序.
注意,帐号是记录的一部分.
除非另外指定,它被视为字符数据.
9.
2.
2多键字段排序可以使用一个以上的键(多达255个键的极限).
可以按它们的优先级次序指定多个键:第一个是主键,下一个是辅助键,等等.
另外,可以使用NUMBER:n指定键的优先级.
每个键可以递增或递减.
在以下例子中,文件EMPLOYEE.
LST排序首先按照雇员名键,然后(当有同名记录时)按照帐号键:$SORT/KEY=(POSITION:10,SIZE:15,CHARACTER)-_$/KEY=(POSITION:5,SIZE:4,DECIMAL)EMPLOYEE.
LSTBILLING2.
LST图9-5展示这个排序操作的结果.
图9-5用多键字段排序在以下例子中,记录排序时首先按部门名的降序,然后按雇员名的升序:$SORT/KEY=(POSITION:1,SIZE:3,DESCENDING)-_$/KEY=(POSITION:10,SIZE:15)-_$EMPLOYEE.
LSTBILLING3.
LST图9-6展示这个排序操作的结果.
图9-6用多键字段排序(升序和降序)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum9.
2.
3同样的键字段按照默认,Sort/Merge保留带同样键字段的记录,但是不维持它们在输入文件中出现的同样次序.
要控制同键记录排序的方法,可指定以下限定词之一:/STABLE维持同键记录的输入次序.
当排序多个输入文件时如果使用这个限定词,那么输出同键记录时,第一个文件的同键记录在第二个文件的同键记录之前,以此类推.
/NODUPLICATES只保留同键记录的一个副本.
如果想要指定保留哪个重复记录,那么在程序级调用Sort并指定一个等键例行程序.
/STABLE和/NODUPLICATES限定词是不兼容的.
在同一命令行中不能同时指定这两个限定词.
在以下例子中,从文件EMPLOYEE.
LST中剔除重复帐号的记录:$SORT/KEY=(POSITION:5,SIZE:4)/NODUPLICATESEMPLOYEE.
LSTBUDGET.
LST图9-7展示这个排序操作的结果.
图9-7用同样的键字段排序9.
2.
4非字符数据UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果排序的记录包含非字符数据的项目,则指定每个键的数据类型.
另外,小心地计算开始位置和大小,因为比较的项目可以占用1个以上字节.
如果要排序的文件记录包含20个字符后面跟随3个F_floating格式的浮点数,那么其位置如下所示:字符数据占用位置1至20(20个字符).
第一个F_floating浮点数占用位置21至24.
第二个F_floating浮点数占用位置25至28.
第三个F_floating浮点数占用位置29至32.
要按第三个浮点数排序文件,指定键字段如下:$SORT/KEY=(POSITION:29,F_FLOATING)STATS.
RAWSTATS.
SOR不需要指定浮点数的大小,因为它是固定四个字节.
9.
2.
5输出文件组织按照默认,排序产生一个输出文件,其文件组织与第一个输入文件相同.
要指定不同的输出文件组织,可在Sort命令行中,在输出文件说明之后包括以下限定词之一:/FORMAT(记录格式)当使用这个输出限定词时,可以定义文件记录格式、长度和块大小.
/INDEXED_SEQUENTIAL使用这个限定词,可以定义输出文件具有索引顺序文件组织.
如果指定索引顺序作为输出文件组织,还必须完成以下步骤:o在执行Sort操作之前,建立一个作为输出文件的空文件.
Sort需要一个已经存在的输出文件,并且是空的.
o在SORT命令行中,在输出文件名之后包括/OVERLAY限定词.
/OVERLAY限定词指出现有文件要被输入文件的排序记录覆盖.
/RELATIVE使用这个限定词,可以定义输出文件有相对文件组织.
/SEQUENTIAL使用这个限定词,可以定义输出文件有顺序文件组织.
在以下例子中,在索引顺序文件EMPLOYEE.
LST排序之后产生一个顺序文件:$SORT/KEY=(POSITION:10,SIZE:15)-_$EMPLOYEE.
LSTBYNAME.
LST/SEQUENTIAL9.
2.
6排序进程UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumSort安排文件时使用以下内部进程之一:记录、标签、地址或索引.
(高性能Sort/Merge公用程序只支持记录进程.
对标签、地址和索引进程的实现留待将来的OpenVMSAlpha发行版本.
)指定的进程可以影响Sort操作的效率.
有关优化Sort或Merge操作的详情,请参阅9.
8节.
下表描述四类进程.
使用/PROCESS=type限定词可指定排序进程.
排序进程类型描述记录RECORD排序时保持记录原样,并且产生一个包含完整记录的输出文件.
记录是默认排序进程.
标签TAG只排序键字段,然后重新读取输入文件,产生一个包含完整记录的输出文件.
其结果与一个完整记录排序一样.
如果磁盘空间很少,标签排序是有用的,因为在排序期间它通常使用较少的工作文件空间.
在大多数情况下,标签排序比记录排序慢,因为它需要额外的时间重新读取输入文件.
地址ADDRESS只排序键字段,并且产生一个输出文件,这个文件是以二进制格式存储的记录文件地址(RFA)的索引.
地址排序比记录排序快,但是必须编写一个程序使记录地址与输入文件的记录关联.
索引INDEX只排序键字段,并且产生一个包含键和RFA的输出文件(以二进制格式).
与地址排序一样,索引排序比记录排序快,但是必须编写一个程序使记录地址与输入文件的记录关联.
9.
3指定比较顺序字符根据比较顺序排序.
对于包含字符数据的文件,可以使用/COLLATING_SEQUENCE=sequence限定词来指定比较顺序.
下表描述比较顺序任选项:比较顺序顺序描述ASCIIASCII字符数据的默认比较顺序.
ASCII顺序先是数字(0至9),然后是大写字母(A至Z),最后是小写字母(a至z).
EBCDICEBCDIC产生一个按EBCDIC顺序排序的输出文件.
数据仍然是ASCII表示.
EBCDIC顺序先是小写字母(a至z),然后大写字母(A至Z),最后是数字(0至9).
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumDEC多国字符集MULTINATIONAL多国比较顺序根据DEC多国字符集比较字符(请参阅附录A).
在MULTINATIONAL字符顺序中,字符根据以下规则排序:所有读音格式的字符具有这个字符的比较值(如,A'、A"和A`比较为A).
小写字母字符与它们的大写字母具有相同的比较值(如,a比较为A,而a"比较为A").
如果两个字符串比较为相同,就执行分解比较.
继续比较字符串来检测由于区别音符、忽略的字符或虽然比较相同但实际上不同字符而导致的差别.
如果字符串仍然比较为相同,那么就比较字符的数字代码.
在最终比较后,小写字母字符排序在大写字母之前.
国家字符集(NCS)比较顺序名命名的比较顺序必须定义在NCS库中.
有关详情,请参阅OpenVMSNationalCharacterSetUtilityManual.
(高性能Sort/Merge公用程序不支持国家字符集(NCS)比较顺序.
对NCS比较顺序的支持留待将来的OpenVMSAlpha发行版本.
)用户自定义顺序(顺序字符串)指定一个用户自定义的比较顺序.
用户自定义比较顺序只支持说明文件,而不支持命令行界面.
(高性能Sort/Merge公用程序不支持用户自定义的比较顺序.
对用户自定义比较顺序的支持要留待将来的OpenVMSAlpha发行版本.
)指定一个单字符、双字符或单字符范围的字符串,可定义一个比较顺序.
(双字符是任何两个单字符的集合,比较时就象它们是一个字符.
例如,"CH"可以定义成比较为"C".
)这个字符串应该括入圆括号内.
也可以用其相应的八进制、十进制或十六进制值表示字符,但要使用基数运算符:%O、%DUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum和%X.
当定义自己的比较顺序时,必须注意以下规则:把字符括入引号("")内.
用逗号(,)分开每个字符和字符范围,并把整个列表括入圆括号内.
为出现在Sort或Merge操作的字符键的所有字符给出比较值.
任何没有比较值的字符将被忽略,除非指定FOLD或MODIFICATION任选项.
不要多次定义一个字符.
不要使用引号("")指定空字符.
改为使用基数运算符,如%X0.
要指定引号,可把它们括入另一组引号("""")内,或者使用一个基数运算符.
以下字符串定义一个比较顺序,其中,双字符LL比较为一个在L和M之间的单字符.
("A"-"L","LL","M"-"Z")注意当使用多国比较顺序排序或合并文件以作进一步处理时,要谨慎使用.
在大多数程序设计语言中的顺序检查过程比较数字字符.
因为多国顺序基于实际的图形字符,而不是表示那些字符的代码,因此常规的顺序检查将失效.
以下例子示范使用说明文件建立用户自定义的比较顺序.
有关说明文件的详情,请参阅9.
7节.
1.
/COLLATING_SEQUENCE=(SEQUENCE=ASCII,IGNORE=2.
这个/COLLATING_SEQUENCE限定词及指定的IGNORE任选项,导致以下字段在分解之前比较为相同:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum252-3412252341225234123.
/COLLATING_SEQUENCE=(SEQUENCE=("A"-"L","LL","M"-"R","RR","S"-"Z"))4.
这个/COLLATING_SEQUENCE限定词定义了一个顺序,在此顺序下,双字符LL比较为在L和M之间的一个单字符,而双字符RR比较为在R和S之间的一个单字符.
另外,这些双字符也按通常的字母顺序出现.
按照默认,这个用户自定义顺序不定义任何其他字符,如小写字母a至z.
9.
4以批量作业方式运行Sort批量作业是独立于当前对话期而运行的程序或DCL命令过程.
如果要排序大文件,那么考虑把Sort操作提交为一个批量作业,因为排序将需要一些时间.
有关批量作业和命令过程的详情,请参阅第16章、第13章和第14章.
9.
4.
1命令过程在命令过程中指定SORT命令,就象在屏幕上写入它.
如果默认目录不包含要排序的文件,就明确地在命令过程中设置默认目录,或者在命令文件说明中包括这个目录.
以下例子提交DCL命令过程SORTJOB.
COM为一个批量作业.
在命令行后,展示命令过程的文本:$SUBMITSORTJOB!
SORTJOB.
COM!
$SETDEFAULT[USER.
PER]!
Setdefaulttolocationofinput$SORT/KEY=(POSITION:10,SIZE:15)EMPLOYEE.
LSTBYNAME.
LST$TYPEBYNAME.
LST$EXIT9.
4.
2包括输入记录UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在批量作业中可以包括输入记录,把它们放在SORT命令之后,每行一个记录.
个别排序记录可以比一行长.
如同使用终端输入记录,指定输入文件参数为SYS$INPUT.
使用/FORMAT限定词指定以字节为单位的记录大小和以块为单位的近似文件大小.
大约6个80个字符行等于一块.
以下例子示范在命令过程中包括输入记录:$SUBMITSORTJOB!
SORTJOB.
COM!
$SETDEFAULT[USER.
PER]$SORT/KEY=(POSITION:10,SIZE:15)-SYS$INPUT-/FORMAT=(RECORD_SIZE:24,FILE_SIZE:10)-BYNAME.
LST$DECKBST7828MCMAHONJANEADM7933ROSENBERGHARRYCOM8102KNIGHTMARTHAANS8042BENTLEYPETERBIO7951LOWELLFRANK$EOD9.
5合并文件MERGE命令把多达10个(高性能Sort/Merge公用程序支持多达12个)排序的文件组合成一个排序的输出文件.
可以合并具有同样格式和通过同样键字段排序的输入文件.
按照默认,Merge检查输入文件中记录的顺序,以确信它们是已排序的.
如果不要Merge检查次序,就指定/NOCHECK_SEQUENCE限定词.
如果指定/CHECK_SEQUENCE限定词而一个记录次序颠倒(例如,如果没有排序一个输入文件),Merge就报告以下出错:%SORT-W-BAD_ORDER,mergeinputisoutoforder使用MERGE命令时可以带与SORT命令同样的限定词,但有两个例外:不能为Merge操作指定一个进程(/PROCESS).
/CHECK_SEQUENCE限定词只用于合并操作.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在以下例子中,文件BYNAME1.
LST和BYNAME2.
LST已经按雇员名升序排序.
展示的命令将它们合并:$MERGEBYNAME1.
LST,BYNAME2.
LSTBYNAME3.
LST输出文件BYNAME3.
LST包含来自这两个文件(即,BYNAME1.
LST和BYNAME2.
LST)的所有记录,如下图所示:9.
5.
1排序的文件要合并使用特定键排序的文件,必须在MERGE命令行上对/KEY限定词指定同样的键.
如果不指定一个键,Merge使用9.
2节描述的默认键.
在以下例子中,文件BILLING1.
LST和BILLING4.
LST按帐号排序(/KEY=POSITION:5,SIZE:4,DECIMAL).
要把这些文件合并到输出文件MAILING.
LST,输入以下命令行:$MERGE/KEY=(POSITION:5,SIZE:4,DECIMAL)-_$BILLING1.
LST,BILLING4.
LSTMAILING.
LST合并结果如下所示:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果想要以排序的次序合并文件,那么指定/NOCHECK_SEQUENCE限定词可以阻止顺序检查.
9.
5.
2同样的键字段如同Sort操作,当输入文件包含同键的字段记录时,Merge不必维持记录在输入文件中的同样次序.
要维持同键记录的输入次序,在MERGE命令行上指定/STABLE限定词.
只要保留同键记录的一个副本,指定/NODUPLICATES限定词.
9.
6从终端输入记录想要排序或合并的记录不一定来自一个文件.
当输入SORT或MERGE命令时,可以直接从终端输入记录.
以下表格描述这个过程:步骤任务1在SORT或MERGE命令行上,指定SYS$INPUT为输入文件.
使用输入文件限定词/FORMAT指定以字节为单位的最长记录大小,和输入文件以块为单位的近似大小.
2在连续行上输入记录.
每按下Return就结束一个记录.
3按下Ctrl/Z结束文件.
以下例子示范一个Sort操作,它排序的输入记录直接从终端输入:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$SORT/KEY=(POSITION:8,SIZE:15)-_$SYS$INPUT/FORMAT=(RECORD_SIZE:24,FILE_SIZE:10)BYNAME.
LSTBST7828MCMAHONJANEADM7933ROSENBERGHARRYCOM8102KNIGHTMARTHAANS8042BENTLEYPETERBIO7951LOWELLFRANK这串命令建立包含排序记录的输出文件BYNAME.
LST.
9.
7使用Sort/Merge说明文件Sort/Merge允许您在说明文件中维护排序定义,并指定更复杂的排序准则.
(高性能Sort/Merge公用程序不支持说明文件.
对这个特性的实现留待将来的OpenVMSAlpha发行版本.
)可以使用任何标准编辑程序,或DCLCREATE命令建立一个说明文件.
Sort/Merge说明文件允许您:选择Sort/Merge操作包括的记录重新格式化输出文件的记录使用条件键或数据指定多个记录格式建立或修改一个比较顺序重新指派工作文件存储频繁使用的Sort/Merge操作在完成说明文件后,使用/SPECIFICATION限定词指定文件名.
说明文件的默认文件类型是.
SRT.
说明文件的每个命令应该以一个斜杠(/)开始.
如果一个命令跨越一行以上,不需要连续字符.
注意在说明文件使用的许多限定词类似于在Sort/Merge命令行使用的DCL限定词.
然而,要注意这些限定词的语法可以不同.
例如,在DCL级的/KEY限定词与在说明文件中的/KEY限定词有不同的语法.
有关说明文件限定词的概要,请参阅9.
9.
3节.
在命令行中指定的任何DCL命令限定词取代在说明文件中的相应条目.
例如,如果在DCL命令行中指定/KEY限定词,Sort/Merge就忽略在说明文件中的/KEY子句.
一般,在说明文件中指定限定词时,对次序没有特殊的要求.
然而,在以下情况下次序是重要的:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum按一个以上键字段排序,如果没有指定NUMBER:n键元素描述输出格式定义多个记录类型对/COLLATING_SEQUENCE限定词指定FOLD、MODIFICATION和IGNORE关键字时,应该在任何FOLD子句之前指定所有MODIFICATION和IGNORE子句.
有关/COLLATING_SEQUENCE限定词的详情,请参阅9.
9.
3节.
在说明文件中可以包括注释,每个注释行由一个感叹号(!
)开始.
与DCL命令行不同,说明文件不需要连字号(-)续行.
例子1.
这是一个说明文件的例子,可以用来按升序排序负数和正数数据:!
按升序排序负数和正数数据!
的说明文件!
/FIELD=(NAME=SIGN,POS:1,SIZ:1)(1)/FIELD=(NAME=AMT,POS:2,SIZ:4)(2)/CONDITION=(NAME=CHECK1,3)TEST=(SIGNEQ"-"))/CONDITION=(NAME=CHECK2,4)TEST=(SIGNEQ""))/INCLUDE=(CONDITION=CHECK1,(5)KEY=(AMT,DESCENDING),DATA=SIGN,DATA=AMT)/INCLUDE=(CONDITION=CHECK2,(6)KEY=(AMT,ASCENDING),DATA=SIGN,DATA=AMT)2.
检查说明文件时,注意以下几点:1.
这个命令行定义一个开始于记录的第1字节并且是1字节长的字段.
它为这个字段指派名称SIGN.
2.
这个命令行定义一个开始于记录的第2字节并且是4字节长的字段.
它为这个字段指派名称AMT.
3.
这是一个条件语句.
如果在SIGN字节中有一个负号(-),满足CHECK1条件.
4.
这是一个条件语句.
如果SIGN字节是空白,满足CHECK2条件.
5.
如果满足条件CHECK1,记录按降序排序.
6.
如果满足条件CHECK2,则记录按升序排序.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum图9-8展示在输入文件BALANCES.
LIS上使用说明文件的结果.
图9-8使用说明文件的输出3.
/FIELD=(NAME=RECORD_TYPE,POS:1,SIZ:1)!
记录类型,1字节/FIELD=(NAME=PRICE,POS:2,SIZ:8)价格,两个文件/FIELD=(NAME=TAXES,POS:10,SIZ:5)税,两个文件/FIELD=(NAME=STYLE_A,POS:15,SIZ:10)!
样式,格式化A文件/FIELD=(NAME=STYLE_B,POS:20,SIZ:10)!
样式,格式化B文件/FIELD=(NAME=ZIP_A,POS:25,SIZ:5)邮政编码,格式化A文件/FIELD=(NAME=ZIP_B,POS:15,SIZ:5)邮政编码,格式化B文件/CONDITION=(NAME=FORMAT_A,条件测试,格式化ATEST=(RECORD_TYPEEQ"A"))/CONDITION=(NAME=FORMAT_B,条件测试,格式化BTEST=(RECORD_TYPEEQ"B"))/INCLUDE=(CONDITION=FORMAT_A,输出格式,类型AKEY=ZIP_A,DATA=PRICE,DATA=TAXES,DATA=STYLE_A,DATA=ZIP_A)/INCLUDE=(CONDITION=FORMAT_B,输出格式,类型BKEY=ZIP_B,UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumDATA=PRICE,DATA=TAXES,DATA=STYLE_B,DATA=ZIP_B)4.
在这个例子中,根据说明文件指定的指令,排序来自一个地产代理的两个分公司的两个输入文件.
在第一个文件中第一个位置开始于A的记录有这个格式:|A|PRICE|TAXES|STYLE|ZIP|121015255.
在第二个文件中第一个位置开始于B的记录有位置调转的样式和邮政编码字段,如下所示:|B|PRICE|TAXES|ZIP|STYLE|121015206.
要按记录A的格式以邮政编码字段排序这两个文件,首先用/FIELD限定词定义这两个记录的字段.
然后,用/CONDITION限定词指定一个测试区别这两类记录.
最后,/INCLUDE限定词在输出时把类型B的记录格式更改为类型A的记录格式.
注意,如果在/INCLUDE限定词中指定键或数据字段,必须在/INCLUDE限定词中为Sort操作明确地指定所有键和数据字段.
也要注意,排序时会省略不是类型A也不是类型B的记录.
7.
/COLLATING_SEQUENCE=(SEQUENCE=("AN","EB","AR","PR","AY","UN","UL","UG","EP","CT","OV","EC","0"-"9"),MODIFICATION=("'"="19"),FOLD)8.
这个/COLLATING_SEQUENCE限定词指定一个用户自定义顺序,按年代顺序为每个月给出一个唯一值.
例如,如果想要根据日期排序文件SEMINAR.
DAT,那么文件SEMINAR.
DAT将被设置如下:16NOV1983CommunicationSkills05APR1984CopingwithAlcoholismUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum11Jan'84HowtoBeAssertive12OCT1983ImprovingProductivity15MAR1984LivingwithYourTeenager08FEB1984SingleParenting07Dec'83Stress---CausesandCures14SEP1983TimeManagement9.
主键是年字段;辅助键是月字段.
因为月字段不是数字,而想要按年代顺序排序月份,因此必须定义自己的比较顺序.
可以这样做,即按年代顺序排序每个月份的后两个字母,即为每个月份给出唯一键值.
MODIFICATION任选项指定省略号(')等同于19,从而允许比较'83和1984.
FOLD任选项指定大写字母和小写字母视为相同.
这个Sort操作的输出如下所示:14SEP1983TimeManagement12OCT1983ImprovingProductivity16NOV1983CommunicationSkills07Dec'83Stress---CausesandCures11Jan'84HowtoBeAssertive08FEB1984SingleParenting15MAR1984LivingwithYourTeenager05APR1984CopingwithAlcoholism10.
有关建立用户自定义比较顺序的其他例子,请参阅9.
3节.
11.
/FIELD=(NAME=AGENT,POSITION:20,SIZE:15)/CONDITION=(NAME=AGENCY,TEST=(AGENTEQ"Real-TTrust"ORAGENTEQ"RealtyTrust"))/DATA=(IFAGENCYTHEN"RealtyTrust"ELSEAGENT)12.
在这个例子中,两个地产文件被排序.
一个文件称一个代理为Real-TTrust;另一个文件称同一代理为RealtyTrust.
/CONDITION和/DATA限定词指示Sort把在排序的输出文件中的AGENT字段列为RealtyTrust.
13.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum/FIELD=(NAME=ZIP,POSITION:60,SIZE:6)/CONDITION=(NAME=LOCATION,TEST=(ZIPEQ"01863"))/KEY=(IFLOCATIONTHEN1ELSE2)14.
在这个例子中,所有带邮政编码01863的记录将出现在排序的输出文件的开始.
条件测试是在用/FIELD限定词定义的ZIP字段;条件被命名为LOCATION.
在这个/KEY限定词的值1和2表示那些满足和不满足条件记录的相对次序.
15.
/FIELD=(NAME=ZIP,POSITION:60,SIZE:6)/CONDITION=(NAME=LOCATION,TEST=(ZIPEQ"01863"))/DATA=(IFLOCATIONTHEN"NORTHCHELMSFORD"ELSE"Outsidedistrict")16.
在这个例子中,/CONDITION限定词测试01863邮政编码.
/DATA限定词指定城镇字段名称将添加到输出记录,视测试结果而定.
17.
/FIELD=(NAME=FFLOAT,POS:1,SIZ:0,F_FLOATING)/CONDITION=(NAME=CFFLOAT,TEST=(FFLOATGE100))/OMIT=(CONDITION=CFFLOAT)18.
在这个例子中,这个数100被认为是一个F_FLOATING数据类型,因为在/FIELD限定词中字段FFLOAT被定义为F_FLOATING,.
19.
/FIELD=(NAME=AGENT,POSITION:1,SIZE:5)/FIELD=(NAME=ZIP,POSITION:6,SIZE:3)/FIELD=(NAME=STYLE,POSITION:10,SIZE:5)/FIELD=(NAME=CONDITION,POSITION:16,SIZE:9)/FIELD=(NAME=PRICE,POSITION:26,SIZE:5)/FIELD=(NAME=TAXES,POSITION:32,SIZE:5)/DATA=PRICE/DATA=""/DATA=TAXESUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum/DATA=""/DATA=STYLE/DATA=""/DATA=ZIP/DATA=""/DATA=AGENT20.
/FIELD限定词定义输入文件记录的字段有以下格式:AGENTZIPSTYLECONDITIONPRICETAXES21.
/DATA限定词,使用/FIELD限定词定义的field-names,重新格式化记录来建立具有以下格式的输出记录:PRICETAXESSTYLEZIPAGENT9.
8优化Sort或Merge操作根据排序环境,有几种方法可以提高Sort或Merge操作的效率.
在SORT或MERGE命令中使用/STATISTICS限定词可获得有关排序环境中变量的信息.
在检查统计显示后,考虑以下几节提出的任何优化任选项.
当输入SORT或MERGE命令使用/STATISTICS限定词时,可看到类似以下的输出:$SORT/STATISTICSPAGEANT.
LISDOCUMENT.
LISOpenVMSSort/MergeStatisticsRecordsread:3(1)Inputrecordlength:26Recordssorted:3Internallength:28Recordsoutput:3Outputrecordlength:26Workingsetextent:16384(2)Sorttreesize:42Virtualmemory:392Numberofinitialruns:0DirectI/O:10Maximummergeorder:0BufferedI/O:11Numberofmergepasses:0Pagefaults:158(3)Workfileallocation:0(4)Elapsedtime:00:00:00.
54ElapsedCPU:00:00:00.
03(5)当检查这些字段时,注意以下几点:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum1.
读取记录列出在Sort操作期间读取的记录数.
有关选择性地从Sort操作省略记录的详情,请参阅9.
8.
2节.
2.
工作区范围展示保留多少块存储器执行排序操作.
有关扩大工作区的详情,请参阅9.
8.
4节.
3.
页故障展示操作系统多少次把部分进程从物理内存传输到分页设备.
有关阻止分页的详情,请参阅9.
8.
4节.
4.
工作文件分配展示为工作文件保留多少磁盘空间.
有关工作文件的详情,请参阅9.
8.
3节.
5.
CPU使用时间展示操作系统使用多少CPU时间处理排序操作.
有关通过挑选不同排序方法节省时间的详情,请参阅9.
8.
1节.
9.
8.
1排序进程内部排序数据时Sort定义以下四个进程:记录、标签、地址或索引.
(高性能Sort/Merge公用程序只支持记录进程.
对标签、地址和索引进程的实现留待将来的OpenVMSAlpha发行版本.
)RECORD是默认进程.
挑选进程的类型影响Sort操作性能和存储需求.
有关不同排序进程的详情,请参阅9.
2.
6节.
在选择排序进程之前,考虑以下几点:如何使用输出文件o因为记录和标签排序产生包含整个排序记录的文件,因此这些重新排序的文件就绪待用.
o地址和索引排序的输出文件可以被用一种程序设计语言例如Pascal、Fortran、MACRO或C编写的程序处理.
o地址排序建立一个包含指针的输出文件,每个指针指向输入文件的记录.
当排序多个输入文件时,这个列表包括二进制的RFA和一个文件号.
程序使用指针存取记录.
o当排序多个文件时,索引排序建立一个包含RFA、键字段和一个文件号的输出文件.
这些键字段的格式与输入文件一样.
如果程序将来处理时需要键字段的内容,那么选择索引排序,而不使用地址排序.
如果针对不同用途需要用几种方法从一个文件重新排序文件记录,那么存储来自地址或索引排序的几个输出文件.
按想要的排序次序,使用输出文件存取主文件的记录.
可用于排序的临时存储空间标签排序比记录排序使用较少的临时存储空间.
因为记录排序在排序时保持记录原样,因此当文件比较大时,它使用很多工作空间.
地址和索引排序使用很少的临时存储空间.
使用的输入和输出设备类型记录排序进程只可以接受读卡机、磁带和磁盘的输入.
标签和记录排序的输出可以写入任何输出设备.
地址和索引排序的输出必须写入能够接受二进制数据的设备.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum速度差别如果在操作中计划检索排序的记录,那么记录排序通常是最快的进程.
否则,地址和索引排序是最快的进程.
9.
8.
2省略记录和字段在说明文件中,使用/CONDITION、/INCLUDE和/OMIT限定词只处理那些输出文件需要的记录,可以提高Sort效率.
(高性能Sort/Merge公用程序不支持说明文件.
对这个特性的实现留待将来的OpenVMSAlpha发行版本.
)也可以使用说明文件限定词重新格式化记录,省略输出文件中不必要的字段.
这些限定词不可用作命令行限定词.
9.
8.
3分配工作文件在Sort操作期间,记录从输入文件读入存储器.
如果分配的存储器不能保存所有记录,Sort把排序的数据传输到一个或多个临时工作文件.
Merge不使用工作文件.
更改工作文件的数目并指派到特定设备,可以提高排序效率:Sort命令行的限定词/WORK_FILES=n取代分配的工作文件的数目.
Sort通常把工作文件放入设备SYS$SCRATCH,并且以任意次序存取它们.
有两种方法可以把工作文件指派到特定设备:o在说明文件中,/WORK_FILES=(device,.
.
.
)限定词把工作文件放入指定的设备.
有关在说明文件中使用/WORK_FILES限定词的详情,请参阅9.
9.
3节.
o如果不使用说明文件,可以使用DCL命令ASSIGN把工作文件指派到特定设备.
Sort使用SORTWORKn逻辑名为工作文件标识用户指定的设备名,在此n是一个从0至9的值.
(对于高性能Sort/Merge公用程序,n是一个从0至254的值.
)定义SORTWORKn逻辑名如下:ASSIGNdevice:SORTWORKno例如,$ASSIGNWORK$2:SORTWORK1$ASSIGNWORK$3:SORTWORK2o这个例子定义SORTWORK1为设备WORK$2:而SORTWORK2为设备WORK$3:.
有关逻辑名的详情,请参阅第11章.
)当指派工作文件给设备时,考虑以下几点:把工作文件指派给最快可用的设备.
例如,随机存储、海量存储设备,如磁盘.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum挑选具有最少活动和最多可用空间的设备.
把每个工作文件指派到不同物理设备,以最大化重叠输入和输出操作.
9.
8.
4修改工作区范围如果Sort需要工作文件(例如,排序一个大文件),那么较大的工作区可以提高排序效率.
然而,如果系统任务繁重,它也许不能为您的进程分配工作区范围的所有页.
这可以导致分页,当操作系统要在物理存储器和分页设备上的存储器之间传输部分进程时发生;只有进程的活动部分保持在物理存储器.
要避免过多分页,可以减少进程的工作区范围.
(使用SETWORKING_SET命令减少工作区范围.
)9.
9Sort/Merge限定词概要以下列表描述SORT和MERGE命令使用的命令限定词.
要使用一个命令限定词,就立即在SORT或MERGE命令之后包括这个限定词.
/[NO]CHECK_SEQUENCE只应用于MERGE命令.
验证在MERGE输入文件的记录顺序.
按照默认,Merge检查记录的顺序.
/CHECK_SEQUENCE限定词检查一个或多个(多达10个;而高性能Sort/Merge公用程序支持多达12个)文件的记录是否已被排序.
(如果想要把输入文件的所有记录指引到输出文件,则必须指定.
)如果要检查记录排序是否按照键字段而不是整个记录,就必须指定键信息以及使用请求顺序.
使用/NOCHECK_SEQUENCE限定词阻止Merge检查记录的顺序.
例子$MERGE/KEY=(SIZE:4,POSITION:3)/NOCHECK_SEQUENCE-_$PRICE1.
DAT,PRICE2.
DATPRICE.
LIS在这个例子中,/NOCHECK_SEQUENCE限定词指定不检查输入文件PRICE1.
DAT和PRICE2.
DAT的顺序.
/COLLATING_SEQUENCE=sequence为字符键字段选择三个预定义比较次序之一,或者指定一个用于比较字符键的国家字符集(NCS)比较顺序名.
(高性能Sort/Merge公用程序不支持NCS比较顺序.
对NCS比较顺序的支持留待将来的OpenVMSAlpha发行版本.
)Sort可以按ASCII(默认)、EBCDIC或多国顺序排列字符.
例子$SORT/COLLATING_SEQUENCE=MULTINATIONAL-_$NAMES.
DAT,NOM.
DATLIST.
LISUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum这个SORT命令根据多国比较顺序排列输入文件NAMES.
DAT和NOM.
DAT,从而建立输出文件LIST.
LIS.
/[NO]DUPLICATES按照默认,Sort保留所有带重复键的多个记录.
/NODUPLICATES限定词剔除所有带重复键的记录,只保留一个.
保留记录出现的次序可能与在输入文件的出现次序不同.
如果想要指定保留哪个重复记录,那么在程序级调用Sort,并指定一个等键例行程序.
/STABLE和/NODUPLICATES限定词是相互排斥的.
例子$SORT/KEY=(POSITION:3,SIZE:5,DECIMAL)/NODUPLICATES-_$ACCT1,ACCT2ACCT.
LIS这个SORT命令根据提供的键排列两个输入文件,剔除所有带相同键的记录,但保留一个.
/KEY=(POSITION:n,SIZE:n[,field,.
.
.
])描述键字段,包括位置、大小、排序次序(ASCENDING或DESCENDING)、优先级(NUMBER:n)和数据类型(例如字符、二进制或h_floating).
按照默认,使用字符数据按升序排序整个记录,Sort重新可排序一个文件.
有关/KEY限定词的详情,请参阅9.
2.
1节.
/PROCESS=type(只应用于SORT命令.
)定义内部排序进程.
/PROCESS限定词允许您挑选四个进程之一:记录、标签、地址或索引.
(高性能Sort/Merge公用程序只支持记录进程.
对标签、地址和索引进程的实现要留将来的OpenVMSAlpha发行版本.
)有关/PROCESS限定词的详情,请参阅9.
2.
6节.
例子$SORT/KEY=(POS:40,SIZ:2,DESC)/PROCESS=TAGYRENDAVG.
DAT-_$DESCYRAVG.
LIS这个Sort操作使用标签排序进程建立输出文件DESCYRAVG.
LIS.
/SPECIFICATION=filespec(高性能Sort/Merge公用程序不支持这个限定词.
对这个特性的实现留待将来的OpenVMSAlpha发行版本.
)标识一个在Sort或Merge操作中使用的Sort或Merge说明文件.
默认说明文件类型是.
SRT.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum有关使用说明文件的详情,请参阅9.
7节和9.
9.
3节.
/[NO]STABLE按照默认,不保证把同键记录按它们在输入文件出现的次序放入输出文件.
/STABLE限定词按原来的次序维护记录.
/STABLE和/NODUPLICATES限定词是相互排斥的.
例子$SORT/KEY=(POS:1,SIZ:5,DECIMAL)/STABLEPRICESA.
DAT,-_$PRICESB.
DAT,PRICESC.
DATSUMMARY.
LIS在这个Sort操作中,首先列出来自PRICESA.
DAT的同键记录,然后是PRICESB.
DAT,最后是PRICESC.
DAT.
/[NO]STATISTICS把统计概要显示到SYS$OUTPUT,这些信息可以用于优化处理.
要把这些统计保存到一个文件,使用以下命令:$DEFINE/USERSYS$ERRORoutput-file统计概要包含以下信息:统计描述RecordsreadSort或Merge读取记录的数目.
Recordssorted使用Sort处理记录的数目.
如果Sort或Merge操作使用一个说明文件只选择某些记录,那么这个数可能比读取的记录数要少.
Recordsoutput写入输出文件的记录数.
如果选定/NODUPLICATES或者当写入输出记录时发生I/O错误,这个数可能比排序的记录数要少.
Workingsetextent在进程工作区范围中的页数.
这个值用作排序数据结构大小的上限.
调整这个值是一种提高Sort操作效率的方法.
Virtualmemory添加到Sort映象用于保存数据的虚拟存储器的页数.
DirectI/O+bufferedI/O读取和写入数据所需要的I/O移动总数.
这个总数越低,排序操作的效率就越高.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumPagefaults指出数据适于放入存储器的程度:页故障数越高,排序操作的效率就越低.
ElapsedtimeSort或Merge操作使用的总计时间,按小时、分钟、秒和百分之一秒计.
Inputrecordlength这个值从记录管理服务(OpenVMSRMS)获得,除非用户提供.
Internallength一个以字节为单位的内部格式节点的大小.
这包括任何键、数据、存储长度的字、记录文件地址(RFA)和转换的键.
Outputrecordlength输出记录的长度.
这个长度是从输入记录长度、排序进程和请求的重新格式记录计算出来的.
Sorttreesize适于放入Sort内部数据结构的记录数.
Numberofinitialruns数据适合放入存储器的一个指示.
Maximummergeorder一次合并的排序字符串的最大数目.
Numberofmergepasses直到产生一个已排序的输出字符串时,Sort公用程序合并字符串的次数.
初始运行数和合并经过次数指出数据适于放入存储器的程度.
这些数越高,工作区大小离包含数据也就越远,并且排序时间也就越长.
Workfileallocation用于工作文件的块数.
当需要一个以上合并经过时,这个大小大约是输入文件分配大小的两倍.
ElapsedCPU排序操作使用的CPU时间;它不包括等待I/O操作完成或等待另一个进程执行的时间开销.
例子$SORT/STATISTICSPRICE1.
DAT,PRICE2.
DATPRICE.
LIS这个SORT/STATISTICS命令导致以下统计显示:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumOpenVMSSort/MergeStatisticsRecordsread:793Inputrecordlength:80Recordssorted:793Internallength:80Recordsoutput:793Outputrecordlength:80Workingsetextent:100Sorttreesize:412Virtualmemory:433Numberofinitialruns:2DirectI/O:22Maximummergeorder:2BufferedI/O:9Numberofmergepasses:1Pagefaults:3418Workfileallocation:114Elapsedtime:00:00:05.
98ElapsedCPU:00:00:03.
63/WORK_FILES[=n](只应用于SORT命令.
)增加Sort工作文件的数目,可从1至10个(高性能Sort/Merge公用程序支持多达255个),可使每个工作文件较小.
如果可用磁盘太小或太满,而不能建立工作文件,那么增加文件数可以提高Sort操作的效率.
Sort需要工作文件才会建立.
如果Sort需要工作文件,按照默认它就建立两个(SORTWORK0、SORTWORK1)放在SYS$SCRATCH目录中.
例子$ASSIGNDRA5:SORTWORK0$ASSIGNDB0:SORTWORK1$ASSIGNDB1:SORTWORK2$SORT/KEY=(POS:1,SIZ:80)/WORK_FILES=3-_$STATS1,STATS2,STATS3,STATS4SUMMARY.
LIS在这个Sort操作中,因为输入文件是个大文件,故指定三个工作文件提高Sort操作的效率.
注意,也可以通过包括目录名把工作文件指派到设备的特定目录.
例如,要把SORTWORK0指派到DRA5上的[WORKSPACE]目录,输入以下命令:$ASSIGNDRA5:[WORKSPACE]SORTWORK09.
9.
1输入文件限定词在SORT或MERGE命令行中,以下输入限定词应该包括在输入文件说明之后:/FORMAT=(RECORD_SIZE:n,FILE_SIZE:n)定义输入文件特征;允许指定或取代记录或文件大小.
在SORT或MERGE命令行中,它必须紧跟在输入文件说明之后指定.
Sort使用输入文件大小信息确定需要的存储器总额,以及用于Sort操作的工作文件大小.
如果文件大小未知(例如,排序文件没有驻留在磁盘上或标准ANSI磁带上),那么Sort假定一个相当大的UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum文件大小.
指定以下限定词值:RECORD_SIZE:n以字节为单位,指定输入文件的最长记录长度(LRL).
可以指定的最大最长记录长度于依赖于文件组织:顺序32,767相对16,383索引顺序16,362对于带固定长度控制(VFC)格式的可变记录,这些值包括控制字节.
FILE_SIZE:n以块为单位,指定输入文件大小.
可接受的最大文件大小是4,294,967,295块.
您也可以使用/FORMAT作为一个输出文件限定词.
有关详情,请参阅9.
9.
2节.
例子$SORT/KEY=(POS:40,SIZ:2,DESC)-_$CRA0:YRENDAVG.
DAT/FORMAT=(RECORD_SIZE:41,FILE_SIZE:3)-_$DESCYRAVG.
LIS因为输入文件YRENDAVG.
DAT不驻留在磁盘设备或ANSI磁带上,故文件组织必须通过/FORMAT限定词加以描述.
9.
9.
2输出文件限定词以下输出限定词可以使用在SORT和MERGE命令中.
要使用一个输出文件限定词,可在SORT或MERGE命令行中在输出文件说明之后包括这个限定词.
/ALLOCATION=n为优化操作,指定预分配给输出文件的块数,从1至4,294,967,295.
如果知道输出文件分配将完全不同于全部输入文件分配,可使用这个限定词(例如,重新格式化数据或省略记录时).
如果使用/CONTIGUOUS限定词,则/ALLOCATION限定词是必需的.
例子$SORT/KEY=(POS:1,SIZ:80)STATS.
DAT-_$SUMMARY.
LIS/ALLOCATION=1000/CONTIGUOUS这个SORT命令为输出文件SUMMARY.
LIS分配1000个邻接块.
/BUCKET_SIZE=n为优化操作指定相对和索引顺序输出磁盘文件使用的OpenVMSRMS桶大小(每桶512字节块的UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum数目).
允许一个1至32之间的值.
如果输出文件组织与输入文件一样,默认值与第一个输入文件的桶大小一样.
如果输出文件组织不同,默认值则是1.
例子$SORT/KEY=(POS:1,SIZ:80)STATS1.
DAT,STATS2.
DAT-_$SUMMARY.
LIS/BUCKET_SIZE=16/RELATIVE这个SORT命令导致输出文件SUMMARY.
LIS具有相对文件组织,并且桶大小为16.
/CONTIGUOUS请求输出文件存储在邻接的磁盘块上,以减少存取时间.
必须与/ALLOCATION限定词一起使用.
按照默认,Sort/Merge不为输出文件分配邻接的磁盘块.
例子$SORT/KEY=(POS:1,SIZ:80)STATS.
DAT-_$SUMMARY.
LIS/ALLOCATION=1000/CONTIGUOUS这个SORT命令为输出文件SUMMARY.
LIS分配1,000个邻接块.
/FORMAT=(类型:n[,.
.
.
])如果与输入文件格式不同,则指定输出文件的记录格式(FIXED:n、VARIABLE:n或CONTROLLED:n).
您也可以指定文件记录的大小(SIZE:n)或块大小(BLOCK_SIZE:n).
如果Sort操作是一个记录或标签排序,默认输出记录格式与第一个输入文件记录格式一样.
如果Sort操作是一个地址或索引排序,默认输出记录格式是固定的记录格式.
如果输入文件有不同的记录格式,那么Sort提供一个足够包含输入文件最大记录的输出记录大小.
可以指定以下限定词值.
BLOCK_SIZE:n如果把文件引入磁带,以字节为单位指定输出文件的块大小.
如果输入文件是磁带文件,那么输出文件的块大小默认为输入文件的块大小.
否则,输出文件的块大小默认为装上磁带时使用的大小.
n可接受的值范围从20至65,532.
然而,要确保与其他Compaq系统的数据交换正确,必须指定一个不比512字节大的块大小.
为了与非Compaq系统兼容,块大小不要超过2,048字节.
CONTROLLED:n指定输出文件中固定长度控制(VFC)记录的变量.
FIXED:n指定输出文件的固定长度记录.
SIZE:n以字节为单位,指定VFC(CONTROLLED)记录固定部分的大小,多达255字节.
如果不指定SIZE,默认是第一个输入文件固定部分的大小.
如果指定这个大UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum小为0,那么OpenVMSRMS默认该值为2字节.
VARIABLE:n指定输出文件的可变长度记录.
对于任何限定词值,您能够可选地指定n作为输出记录的最大记录大小(以字节为单位).
最大记录大小的允许值依赖于文件组织:顺序文件32,767相对文件16,383索引顺序文件16,362这些最大记录大小值包括固定长度控制(VFC)格式的可变记录的控制字节.
例子$SORT/KEY=(POS:1,SIZ:80)STATS.
DATSUMMARY.
LIS/FORMAT=FIXED:80输入文件STATS.
DAT包括80字节长的可变长度记录.
/FORMAT限定词指定输出文件SUMMARY.
LIS包括固定长度记录.
/INDEXED_SEQUENTIAL定义输出文件的文件组织为索引顺序.
注意,输出文件必须已经存在并且必须为空.
另外,必须使用/OVERLAY限定词指定这个空文件可以被排序记录覆盖.
例子$CREATE/FDL=NEW.
FDLAVERAGE.
DAT$SORT/KEY=(POS:1,SIZ:80)DATA.
DAT,STATS.
DAT-_$AVERAGE.
DAT/INDEXED_SEQUENTIAL/OVERLAYCREATE/FDL命令建立空文件AVERAGE.
DAT.
SORT命令指定输出文件具有索引顺序组织,并且写入空文件AVERAGE.
DAT.
/OVERLAY指定一个现有的空文件,输出文件将覆盖它或写入.
当使用/INDEXED_SEQUENTIAL限定词,/OVERLAY限定词是必需的.
如果输入文件组织是索引顺序,输出文件必须已经存在并且是空的.
如果输出文件不空,那么/OVERLAY不重写这个文件.
而是把排序结果附加到现有输出文件的末端.
可以使用CREATE/FDL公用程序建立一个空数据文件.
于是,当建立空文件时指定的任何属性就成为Sort输出文件的属性.
例子UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$CREATE/FDL=NEW.
FDLAVERAGE.
DAT$SORT/KEY=(POS:1,SIZ:80)STATS.
DATAVERAGE.
DAT/OVERLAYFDL文件NEW.
FDL为文件AVERAGE.
DAT指定特殊的属性.
当Sort把输出写入那个文件时,作为结果的Sort输出文件有FDL文件指定的属性.
/RELATIVE定义输出文件的文件组织为相对.
例子$SORT/KEY=(POS:1,SIZ:80)STATS.
DATSUMMARY.
LIS/RELATIVE因为输入文件STATS.
DAT不是一个相对文件,而输出文件SUMMARY.
LIS将是,因此,/RELATIVE限定输出文件说明.
/SEQUENTIAL定义输出文件的文件组织为顺序.
这是地址和索引排序操作的默认组织.
记录和标签排序操作的默认组织与第一个输入文件相同.
例子$SORT/KEY=(POS:1,SIZ:80)STATS.
DATSUMMARY.
LIS/SEQUENTIAL因为输入文件STATS.
DAT不是一个顺序文件,而输出文件SUMMARY.
LIS将是,因此,/SEQUENTIAL限定输出文件说明.
9.
9.
3说明文件限定词以下限定词可以使用在说明文件中.
(高性能Sort/Merge公用程序不支持说明文件.
对这个特性的实现留待将来的OpenVMSAlpha发行版本.
)注意,这些限定词只在Sort/Merge说明文件中有效.
/CDD_PATH_NAME="cdd-path-name"使用CDDRepository命令标识用于通用数据字典(CDD/Plus)而定义的字段和属性.
一旦这些字段被标识,以后就可以用于其他说明文件限定词,如/KEY、/CONDITION、/INCLUDE或/OMIT.
/CDD_PATH_NAME可以用于代替/FIELD语句或与/FIELD语句一起使用.
"cdd-path-name"值是在CDD/Plus内的CDD/Plus记录定义.
只当系统已安装CDD/Plus时,才可以使用/CDD_PATH_NAME限定词.
例子UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum/CDD_PATH_NAME="employee"/CDD_PATH_NAME限定词标识雇员记录,雇员记录以前已在CDD/Plus中定义.
/[NO]CHECK_SEQUENCE(只应用于MERGE命令.
)指定是否检查输入文件中的记录顺序.
按照默认,Merge检查记录的顺序.
例子/NOCHECK_SEQUENCE/NOCHECK_SEQUENCE限定词取代Merge公用程序的默认行为.
/COLLATING_SEQUENCE=(SEQUENCE=sequence-type[,MODIFICATION=("char1"operator"char2")][,IGNORE=characterorcharacterrange,.
.
.
][,FOLD][,[NO]TIE_BREAK])为字符键字段指定三个预定义比较顺序(ASCII、EBCDIC或多国)之一,或者一个用户自定义顺序.
允许您修改任何预定义比较顺序或者任何以前定义的用户自定义顺序.
有关使用ASCII、EBCDIC和多国比较顺序的详情,请参阅9.
3节.
可以指定以下限定词值:SEQUENCE说明文件支持ASCII、EBCDIC、多国和用户自定义比较顺序.
有关这些比较顺序的详情,请参阅9.
3节.
MODIFICATION指定更改在SEQUENCE任选项指定的比较顺序.
可以修改ASCII、EBCDIC、多国或用户自定义顺序.
被修改的顺序必须用SEQUENCE限定词指定,即使这个顺序是默认的(ASCII).
字符在比较顺序中,指定一个字符.
运算符指定用来比较字符的运算符.
可以指定大于(>)、小于("C").
--一个单或双字符可以小于一个已经指派有一个比较值的单字符("D""c")不能用作填充字符.
可以使用字符、十进制、八进制或十六进制数字.
填充字符应该指定为如下:对字符使用引号.
例如,"#"将指定数字符号.
对十进制数字使用十进制基数.
例如,%D35将指定十进制数35.
对八进制数使用八进制基数.
例如,%O043将指定八进制数043.
对十六进制数使用十六进制基数.
例如,%X23将指定十六进制数23.
例子/PAD=".
"这个例子的/PAD限定词指定记录将填充句点.
/PROCESS=type(只应用于SORT命令.
)为排序操作定义处理方法(记录、标签、地址或索引).
如果打算重新格式化输出记录,不能使用地址或索引排序.
指定进程类型为RECORD、TAG、ADDRESS或INDEX.
有关四类进程的比较,请参阅9.
8.
1节.
例子UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum/PROCESS=tag这个例子的/PROCESS限定词指定Sort使用一个标签排序进程.
/[NO]STABLE指定同键记录按它们的输入文件次序写入输出文件.
默认条件是/NOSTABLE.
按照默认,当排序同键记录时,那些记录在输出文件的次序可能与它们在输入文件的出现次序不一样.
在说明文件中指定/STABLE限定词,就会按照在命令行指定的输入文件次序在输出文件中排列同键记录.
当排序多个输入文件时,如果使用这个限定词,那么输出时,在第一个文件的同键记录将在第二个文件的同键记录之前,以此类推.
例子/STABLE这个例子的/STABLE限定词确保同键记录将在输入和输出文件中具有同样的次序.
/WORK_FILES=(device[,.
.
.
])(只应用于SORT命令.
)把工作文件重新指派到不同的磁盘结构设备以改进性能.
如果在说明文件中使用/WORK_FILES限定词,就没有必要在命令或程序级调用Sort之前指派逻辑设备.
不同于DCL限定词/WORK_FILES=n,说明文件限定词/WORK_FILES=(device[,.
.
.
])指定工作文件分配,而不是工作文件的数目.
有关使用工作文件的详情,请参阅9.
8.
3节.
例子/WORK_FILES=("WRKD$:")这个例子的/WORK_FILES限定词把一个Sort工作文件指派到设备WRKD$:因为这个设备有更多的可用空间.
第10章控制存取资源每个系统站点有唯一的安全需求.
基于这个原因,每个站点应该有一个系统安全策略,为系统管理员和用户规划物理的和软件安全需求.
要确保系统安全,OpenVMS操作系统控制对系统的存取权和对任何包含可共享信息对象的存取权.
这些对象,如设备、卷、逻辑名表、文件和队列,被称为受保护对象.
所有受保护对象列出一组存取需求,指定谁有权以给定方式存取对象.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumOpenVMSGuidetoSystemSecurity描述可用于操作系统和系统管理员可以执行维护帐户和系统安全的任务的安全特性.
本章描述OpenVMS保护和审查系统资源的一些方法.
它包括的信息有:显示进程的权限标识符对象的安全简要解释保护码默认文件保护通过网络存取文件审查对您的帐户和文件的存取有关其他安全信息,请参阅以下:OpenVMSGuidetoSystemSecurity,有关保护对象和系统安全的详情OpenVMSDCLDictionary或联机求助,有关本章论述的命令详情安全特性可以通过以下方法熟悉OpenVMS安全特性:了解与进程关联的权限标识符---权限标识符确定可以存取什么资源.
如果进程没有适当的标识符,可能不能存取某些受保护对象.
有关显示权限标识符的详情,请参阅10.
1节.
显示受保护对象的安全简要---安全简要包含有关受保护对象的信息.
可以更改对象的安全简要,使其他用户对它可存取的或者不可存取的.
有关安全简要的详情,请参阅10.
2节.
了解如何通过网络存取文件---通过使用存取控制字符串或代理注册帐户可以完成这件事.
有关存取远程文件的详情,请参阅10.
5节.
审查对帐户和文件的存取---通过仔细观察任何注册消息并且与系统管理员协力审查文件,可以完成这件事.
有关审查对帐户和文件的存取详情,请参阅10.
6节.
10.
1显示进程的权限标识符所有尝试存取受保护对象的进程都携带被称为权限标识符的信任证书.
所有受保护对象列出一组存取需求,指定谁有权以给定方式存取对象.
如果存取进程的权限标识符不匹配那些对象,那么就拒绝存取.
以下例子展示如何使用SHOWPROCESS命令显示当前进程的标识符:$SHOWPROCESS/ALL25-NOV-200215:23:18.
08User:GREGProcessID:34200094Node:ACCOUNTSProcessname:"GREG"UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumTerminal:VTA2195:TNA2170:(Host:16.
32.
123.
45Port:6789)UserIdentifier:[DOC,GREG](1)Basepriority:4Defaultfilespec:WORK1:[GREG.
FISCAL_96]NumberofKthreads:1Devicesallocated:ACCOUNTS$TWA2:ProcessQuotas:.
.
.
Processrights:INTERACTIVE(2)LOCAL(3)SALES(4)MINDCRIMEresource(5)Systemrights:SYS$NODE_ACCOUNTS(6)有三类权限标识符:UIC、环境和通用.
SHOWPROCESS命令输出显示所有这三类:1.
UIC标识符,指出用户Greg是DOC组的成员2.
环境标识符,指出用户Greg是交互用户3.
环境标识符,指出用户Greg在本地注册4.
通用标识符,指出用户Greg也是SALES组的成员5.
通用标识符,指出Greg拥有带资源属性的MINDCRIME标识符,因而他可以为这个标识符增加磁盘空间6.
环境标识符,指出用户Greg正工作在ACCOUNTS节点10.
2对象的安全简要因为操作系统同时支持多用户,因此它有内设安全机制阻止一个用户的活动妨碍另一个.
保护码、存取控制和硬件设计一起保护对存储器、可共享设备和数据的使用,因而许多用户可以共享系统.
对象的安全简要包括用户标识码(UIC)、ACL和分配给对象的保护码.
可以显示或修改自己拥有的任何对象的安全简要.
要观看任何受保护对象的安全简要,使用DCL命令SHOWSECURITY.
例如,以下命令请求文件95_FORECAST.
TXT的安全信息:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$SHOWSECURITY95_FORECAST.
TXTWORK_DISK$:[GREG]95_FORECAST.
TXT;1objectofclassFILEOwner:[ACCOUNTING,GREG]Protection:(System:RWED,Owner:RWED,Group:RE,World)AccessControlList:此显示指出文件95_FORECAST.
TXT被用户Greg拥有.
它也列出文件的保护码,为系统用户和拥有者给出读取、写入、执行和删除存取权.
该代码把读取和执行存取权提供给组用户,但不为全体用户提供任何存取权.
(有关进一步解释,请参阅10.
3节.
)在这个文件上没有ACL.
10.
2.
1修改安全简要您可以为受保护对象的拥有者、保护码或ACL提供新值,或者通过使用SETSECURITY命令可以把简要从一个对象复制到另一个.
例如,在10.
2节的SHOWSECURITY显示展示文件95_FORECAST.
TXT被用户Greg拥有.
作为拥有者,他可以更改这个文件的保护码.
最初,这个代码没有为全体用户类的用户提供任何存取权.
现在,Greg可以更改它,允许全体用户有读取和写存取权:$SETSECURITY/PROTECTION=(W:RW)95_FORECAST.
TXT以下SHOWSECURITY命令验证这个文件的新保护码:$SHOWSECURITY95_FORECAST.
TXT95_FORECAST.
TXTobjectofclassFILEOwner:[GREG]Protection:(System:RWED,Owner:RWED,Group:RE,World:RW)AccessControlList:10.
3解释保护码保护码控制允许(或拒绝)特定用户或用户组的存取类型.
它有以下格式:[category:listofaccessallowed(,category:listofaccessallowed,.
.
.
)]种类包括系统(S)、拥有者(O)、组(G)和全体用户(W).
每个种类可以缩写为它的首位字符.
种类有以下定义:系统其UIC是在1至10(八进制)范围的任何用户进程或应用程序,具有SYSPRV特权,或UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum者与拥有者同组而拥有GRPPRV.
拥有者其UIC与对象的UIC相同的任何用户进程或应用程序.
组其组UIC与对象的组UIC相同的任何用户进程或应用程序.
全体用户在系统上的任何用户进程或应用程序.
指定一个以上用户种类时,用逗号分开种类并把整个代码括入圆括号内.
可以按任何次序指定用户种类和存取类型.
一个空存取说明意味着没有存取权,因而,当省略一个用户种类的存取类型时,就拒绝这类用户有这个存取类型.
要拒绝一个用户种类的所有存取,就不为这个用户种类指定任何取类型.
(当拒绝存取一个用户种类时,就省略这个用户种类之后的冒号.
)对于文件,存取列表包括读取(R)、写入(W)、执行(E)或删除(D)存取类型.
存取类型分配给每个拥有者种类,并且用一个冒号(:)分开它的存取类型.
文件存取类型有以下含义:读取给出读取、打印或复制磁盘文件的权限.
对于目录文件,读取存取权给出读取或列表文件的权限,并且可以使用通配符文件名查找文件.
读取存取权潜在包括执行存取权.
写入给出写入或更改文件内容的权限,但是不能删除它.
写存取权允许修改描述文件内容的文件特征.
对于目录文件,写存取权给出插入或删除在文件目录中的条目.
执行给出执行包含可执行程序映象或DCL命令过程文件的权限.
对于目录文件,执行存取权给出查找已知其文件名的文件的权限.
删除给出删除文件的权限.
要删除一个文件,必须对文件有删除存取权和对包含该文件的目录有写存取权.
10.
4默认文件保护新文件接收默认基于UIC的保护和父目录的默认存取控制列表(ACL).
ACL包含一组条目,定义用户或用户组对特定受保护对象的存取权,如文件、目录或设备.
可以使用默认UIC保护或默认ACL保护取代提供给新文件的默认基于UIC的保护.
10.
4.
1默认UIC保护操作系统为每个进程提供以下基于UIC的保护:(S:RWED,O:RWED,G:RE,W)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum按照默认,带系统UIC的用户和对象拥有者对对象有全部存取权,与对象拥有者在同样UIC组中的用户对对象有读取和执行存取权,而拒绝所有其他用户存取这个对象.
要更改建立文件的默认保护,可输入带/DEFAULT限定词的SETPROTECTION命令.
例如,如果在注册命令过程中输入以下命令,那么准予所有进程对您建立的任何文件有读取和执行存取权.
(记住,必须执行这个注册命令过程以执行这个命令.
)$SETPROTECTION=(S:RWED,O:RWED,G:RE,W:RE)/DEFAULT10.
4.
2默认ACL保护通过把一个默认保护存取控制条目(ACE)放入适当的目录文件的ACL中,可以取代对指定目录或子目录的默认UIC保护.
在ACE中指定的默认保护应用于在指定目录或目录的子目录中建立的任何新文件.
以下必须在一个目录文件的ACL中的ACE,指定对目录和目录的子目录的默认保护允许系统和拥有者进程有全部存取权、组进程有读取和执行存取权而全体用户没有存取权.
$SETSECURITY/ACL=(DEFAULT_PROTECTION,S:RWED,O:RWED,G:RE,W:)[JONES]PERSONAL.
DIR要指定一个将被复制到以后在目录中建立任何文件ACL的默认标识符ACE,在目录文件的标识符ACL中指定DEFAULT任选项.
在以下例子中展示的ACE应用于一个目录文件,并且拒绝网络用户存取在这个目录中建立的所有文件:$SETSECURITY/ACL=(IDENTIFIER=NETWORK,OPTIONS=DEFAULT,ACCESS=NONE)-_$[JONES]PERSONAL.
DIR10.
4.
3重新命名文件不更改重新命名文件的保护.
现有文件的新版本接收上一个版本基于UIC的保护和ACL.
(BACKUP、COPY、CREATE和SETFILE命令可以使用/PROTECTION限定词取代默认基于UIC的保护.
)10.
4.
4显式文件保护可以明确地用/PROTECTION限定词为新文件指定基于UIC的保护(对于BACKUP、COPY和CREATE命令有效).
使用SETSECURITY/PROTECTION命令可以更改现有文件基于UIC的保护.
在建立一个文件并且已为这个文件建立ACL后,可以修改这个ACL并且添加许多想要的条目.
ACL指定的保护取代文件的用户标识码保护.
在以下例子中,指定基于UIC的保护:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$CREATEMAST12.
TXT/PROTECTION=(S:RWED,O:RWED,G,W)在以下例子中,更改文件MAST12.
TXT的基于UIC的保护:$SETSECURITY/PROTECTION=(S:RWED,O:RWED,G:RE,W)MAST12.
TXT10.
5通过网络存取文件以下几节描述如何通过网络存取文件.
10.
5.
1存取控制字符串在通过DECnetforOpenVMS网络执行操作的DCL命令的文件说明中,可以包括网络存取控制字符串.
该存取控制字符串准许本地节点用户存取远程节点的文件.
存取控制字符串包括用于远程帐户的用户名和括入引号内的用户密码,如下所示:NODE"usernamepassword"::disk:[directory]filename.
filetype警告由于存取控制字符串包括允许某人进入远程帐户的足够信息,因此它们可能产生严重的泄密问题.
10.
5.
2保护存取控制字符串要保护存取控制字符串的信息,遵循以下规则:避免在硬拷贝或视频终端展现其信息.
如果使用一个硬拷贝终端,那么恰当地处理输出.
如果使用一个视频终端,则清除屏幕并且当网络作业完成时使用DCL命令RECALL/ERASE清空重新调用缓冲区.
这样可阻止另一个用户通过使用Ctrl/B组合键或使用DCL命令RECALL/ALL显示命令行来查看密码.
不要把包括存取控制字符串的网络命令放入似乎为发现目标的命令过程中.
如果必须把存取控制字符串放入命令过程,那么为这些文件提供最适宜的文件保护.
10.
5.
3使用代理注册帐户保护密码要避免需要存取控制字符串,可以使用代理注册帐户.
代理注册允许您通过网络存取文件,而不用在存取控制字符串中指定用户名或密码.
因而,代理注册有以下安全好处:密码不回应在请求的终端上.
密码不在系统间传送,否则它们会被截取未加密的格式.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum密码不需要出现在执行远程存取的命令文件中.
远程节点的系统或安全管理员必须为您建立一个代理帐户,才可以开始一个代理注册.
象常规帐户一样,使用OpenVMSAuthorize公用程序(AUTHORIZE)建立代理帐户.
他们通常是非特权的帐户.
安全管理员允许您存取一个默认代理帐户和多达15个其他代理帐户.
系统管理员需要为代理注册设置更多的事情,提供更多的安全网络存取以避免用户需要输入存取控制字符串.
以下例子说明正常网络注册请求和代理注册请求的差别.
对于每个例子,存在以下条件:用户KMAHOGANY有两个用户帐户:o一个在节点BIRCH上密码为"XYZ123ABC"的帐户o一个在节点WALNUT上密码为"A25D3255"的帐户KMAHOGANY已注册到节点BIRCH.
KMAHOGANY想要复制其帐户在节点WALNUT的默认设备和目录中的文件BIONEWS.
MEM.
下图展示这些条件.
用户KMAHOGANY可能使用一个存取控制字符串复制文件BIONEWS.
MEM,如下所示:$COPYWALNUT"KMAHOGANYA25D3255"::BIONEWS.
MEMBIONEWS.
MEM注意到回应密码A25D3255.
观看屏幕的任何人可以看到它.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果KMAHOGANY有一个从节点BIRCH存取节点WALNUT上的代理帐户,那么复制文件BIONEWS.
MEM的命令如下所示:$COPYWALNUT::BIONEWS.
MEMBIONEWS.
MEMKMAHOGANY不需要在存取控制字符串中指定密码.
作为代替,系统执行一个代理注册,从他在节点BIRCH上的帐户进入他在节点WALNUT上的帐户,没有交换密码.
10.
5.
4通用存取代理帐户安全管理员也可以授权来自外部节点的用户组共享使用一个通用存取代理帐户.
例如,在节点WALNUT上的安全管理员可以带以下条件建立一个通用存取帐户:用户名GENACCESS.
存取限制为网络注册.
只有帐户拥有者才知道其密码.
(远程用户没有需要知道它.
)这有助于保护这个帐户.
默认设备和目录是STAFFDEV:[BIOSTAFF].
如果安全管理员准予BIRCH::KMAHOGANY代理存取GENACCESS帐户,那么通过输入以下命令,用户KMAHOGANY可以复制文件BIONEWS.
MEM:$COPYWALNUT::[KMAHOGANY]BIONEWS.
MEMBIONEWS.
MEM注意,KMAHOGANY必须指定目录[KMAHOGANY],因为文件BIONEWS.
MEM不是在GENACCESS帐户(STAFFDEV:[BIOSTAFF])的默认设备和目录.
另外,对文件BIONEWS.
MEM的保护必须准许GENACCESS帐户存取.
否则,这个命令失败.
如果可以存取给定节点的一个以上代理帐户,而又不想使用默认代理帐户,那么就指定这个代理帐户名.
例如,要使用代理帐户PROXY2代替GENACCESS帐户(默认),KMAHOGANY可输入以下命令:$COPYWALNUT"PROXY2"::[KMAHOGANY]BIONEWS.
MEMBIONEWS.
MEM这个命令使用PROXY2帐户复制在节点WALNUT的[KMAHOGANY]目录上的文件BIONEWS.
MEM.
10.
6审查对您的帐户和文件的存取虽然安全管理员的工作是监控系统上可能的非法存取企图,但是您也可以帮助安全管理员审查对您的帐户和文件的存取.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum10.
6.
1观察您的最后注册时间OpenVMS系统维护UAF记录中的信息,其中包括您注册帐户的最后时间.
安全管理员决定系统是否应该在注册时显示这个信息.
需要中高级安全的站点频繁地显示这个信息,并请求用户检查是否存在不平常的或不能解释的成功注册和不能解释的失败注册.
如果有一个交互或非交互注册不在您的注册时间内,迅速把它报告给安全管理员.
也更改您的密码.
安全管理员可以使用会计文件和审查记录进行进一步调查.
如果您接收到一条注册失败消息而又不能解释这个失败,那么很有可能某人正在尝试存取您的帐户,但没有成功.
检查您的密码,确保坚持了在1.
9节描述的密码安全的所有推荐.
如果没有,立即更改密码.
如果期望看到一条注册失败消息而它却不出现,或者失败计数太低,那么更改您的密码.
把这些注册失败的问题报告给安全管理员.
安全管理员可以选择一类或多类事件,保证要特别注意其发生.
检测到这样的事件时,安全管理员指示系统发送一个审查到系统安全审查日志文件,或者发送一个警报给终端,使之成为安全操作员终端.
例如,安全管理员可以标识一个或多个文件禁止写存取权.
可以允许审查或者可以设置警报指出尝试对这些文件的存取.
如果推测有一个对您的帐户的非法存取,则更改您的密码.
可以请求安全管理员实现对敏感文件的审查.
10.
6.
2能够触发安全警报的事件触发审查或警报的事件可以包括以下:开始安全审查或警报的事件例子安装映象某些类型的文件存取卷装上和卸下修改系统和用户密码、系统授权文件、网络代理文件或权限数据库ACL文件或全局段请求的存取事件注册、注销、注册失败、非法存取企图在以下例子中,假定您决定审查文件CONFIDREVIEW.
MEM.
如果用户ABADGUY存取CONFIDREVIEW.
MEM并且有删除存取权,那么以下审查记录写入系统安全审查日志文件.
OPCOM11-DEC-199909:21:11.
10MessagefromuserAUDIT$SERVERonBOSTONUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumSecurityaudit(SECURITY)onBOSTON,systemid:19424Auditableevent:AttemptedfileaccessEventtime:11-DEC-199909:21:10.
84PID:23E00231Username:ABADGUYImagename:BOSTON$DUA0:[SYS0.
SYSCOMMON.
][SYSEXE]DELETE.
EXEObjectname:BOSTON$DUA1:[RWOODS]CONFIDREVIEW.
MEM;1Objecttype:fileAccessrequested:DELETEStatus:SYSTEM-S-NORMAL,normalsuccessfulcompletionPrivilegesused:SYSPRV审查消息揭示作恶者的名称、存取方法(通过使用程序[SYSEXE]DELETE.
EXE成功完成删除)、存取时间(9:21A.
M.
)和存取文件的特权(SYSPRV)使用.
根据这个信息,安全管理员可以采取行动.
10.
6.
3安全审查日志文件每当存取任何文件而又满足那个文件ACL的审查条目指定的条件时,安全审查消息就被写入安全审查日志文件(请参阅10.
6.
4节).
存取文件CONFIDREVIEW.
MEM,与存取系统上受到安全审查保护的任何文件一样,提示一个审查记录写入安全审查日志文件.
在引入审查后,就周期性地与安全管理员一起检查是否发生任何非法存取.
10.
6.
4为敏感文件添加ACE如果有一个关键文件可能被不适当地存取,那么可以同安全管理员一起开发一种审查存取这个文件的策略.
一旦看到这种情况,而且确保您已采取了每件可能保护文件的措施,包括标准保护码和一般的ACL(在OpenVMSGuidetoSystemSecurity中描述),您可能断定必需使用安全审查.
要指定安全审查,可以把特殊的存取控制条目(ACE)添加到自己拥有或者有控制存取权的文件.
然而要紧记,审查日志文件是全系统的机制,因而Compaq建议站点安全管理员要控制使用文件审查.
虽然可以把审查ACE添加到您有控制权的文件上,但是安全管理员也要在系统级允许审查文件.
如果推测对您的帐户有非法存取企图,安全管理员可能临时允许审查所有文件存取.
安全管理员也可以允许审查监视对文件的读存取,以发觉文件的浏览者.
频繁的文件存取违例指出存取问题也与其他文件有关.
因此,安全管理员可能需要监视对有安全审查ACE的所有关键文件的存取.
对关键文件出现不希望的存取时,安全管理员必须立即采取行动.
在以下例子中,用户RWOODS和他的安全管理员同时想知道一个高度机密文件CONFIDREVIEW.
MEM何时被存取,因而RWOODS为文件CONFIDREVIEW.
MEM的现有ACL添加一个条目:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$SETSECURITY/ACL=(ALARM=SECURITY,ACCESS=READ+WRITE-_$+DELETE+CONTROL+FAILURE+SUCCESS)CONFIDREVIEW.
MEM第11章定义设备和文件的逻辑名逻辑名可以用来代替另一个表示系统对象,诸如文件、目录、设备或队列的名称.
例如,可以把一个逻辑名分配给您的默认磁盘和目录.
逻辑名提供两个主要功能:增加可读性和文件独立性.
可以用简短、有意义的逻辑名定义常用的文件、目录和设备.
这样的名称比完整文件说明更容易记住和键入.
您可以定义在注册命令过程中频繁使用的名称.
系统管理员可以定义在系统启动命令过程中人们频繁使用的名称.
您可以使用逻辑名使您的程序和命令过程与物理的文件说明无关.
例如,如果一个命令过程引用逻辑名ACCOUNTS,那么可以把ACCOUNTS等同于在任何磁盘上的任何文件.
本章包括以下信息:逻辑名特征使用系统定义的逻辑名建立逻辑名删除逻辑名逻辑名翻译显示逻辑名建立和使用搜索列表逻辑名表特征默认逻辑名表建立逻辑名表修改逻辑名翻译的次序删除逻辑名表与进程并存的逻辑名有关在本章中描述的命令详情,请参阅OpenVMSDCLDictionary或联机求助.
11.
1逻辑名特征逻辑名有以下特征:等同于字符串(称为等价串或等价名)或一个等价串列表(称为搜索列表).
当使用一个逻辑名时,等价串要代替其逻辑名.
存储在默认逻辑名表或建立的逻辑名表.
可以是长文件说明的简写.
可以由您或由系统定义.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum可以使用逻辑名使程序和命令过程与物理的文件说明无关.
例如,如果一个命令过程引用逻辑名ACCOUNTS,那么在执行命令过程之前可以把ACCOUNTS等同于在任何磁盘上的任何文件.
一般而言,当命令接受一个系统对象时,该命令检查您提供的名称是否逻辑名.
如果该名称是一个逻辑名,系统就用它的实际值替换逻辑名并执行这个命令.
在以下例子中,建立逻辑名COMS表示目录DISK7:[WALSH.
COMMAND_PROC]:$DEFINECOMSDISK7:[WALSH.
COMMAND_PROC]然后,逻辑名COMS可以在DCL命令使用,如以下例子所示:$SETDEFAULTCOMS$TYPECOMS:PAYROLL.
COM11.
2使用系统定义的逻辑名系统建立了一组全系统的逻辑名,用于启动系统和注册.
这些逻辑名允许您引用常用的文件或设备,而不使用它们的物理设备名.
有关这些名称的列表,请参阅11.
9.
3节.
每次您注册时,系统为您的进程建立一组逻辑名,并把这些名称放入进程表.
有关这些名称的列表,请参阅11.
9.
1节.
要列出操作系统的程序,您不必知道存储这些程序的磁盘和目录的名称.
您可以使用逻辑名SYS$SYSTEM作为代替,如下所示:$DIRECTORYSYS$SYSTEM注册时,逻辑名SYS$LOGIN引用默认设备和目录.
如果使用SETDEFAULT命令更改了当前默认,那么可以使用以下命令显示来自初始默认目录的文件:$TYPESYS$LOGIN:DAILY_NOTES.
DAT11.
3建立逻辑名您可以使用DEFINE命令或ASSIGN命令建立逻辑名.
在本章内,例子中使用DEFINE命令.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum一般而言,逻辑名建立在进程表中.
通常,在注册命令过程(LOGIN.
COM)定义逻辑名,因而每次注册时,您就可以使用逻辑名.
也可以交互地建立逻辑名.
然而,只有在当前进程是活动时,才可以使用这些逻辑名.
在您的进程表中建立的逻辑名不可用于其他用户的进程.
系统管理员或其他特权用户可以在可共享表中建立名称,其他用户可以存取.
组和系统表是可共享表的例子.
有关可共享表的详情,请参阅11.
9.
4节.
11.
3.
1使用DEFINE命令用DEFINE命令定义逻辑名的格式如下所示:DEFINElogical-nameequivalence-string[,.
.
.
]可以使用同样的格式为节点名、文件说明、设备名、应用程序特定的信息、或其他逻辑名建立逻辑名.
按照默认,DEFINE命令把逻辑名放入您的进程逻辑名表(请参阅11.
8节),其中的逻辑名只可用于您的进程和子进程.
如果想要把逻辑名添加到不同的逻辑名表,那么可以使用以下限定词之一指定另一个表:/JOB、/GROUP、/SYSTEM或/TABLE=table_name.
前三个限定词分别指定默认的作业、组和系统逻辑名表.
/TABLE=table_name可以用来指定任何类型的表,并且只有使用这个限定词才能指定一个簇范围表.
在以下例子中,该命令建立逻辑名WORKFILE,使之等同于等价串DISK2:[WALSH.
REPORTS]WORK_SUMMARY.
DAT:$DEFINEWORKFILEDISK2:[WALSH.
REPORTS]WORK_SUMMARY.
DAT在把WORKFILE定义为一个逻辑名后,可以使用这个逻辑名代替其等价串.
在下一个例子中,该命令为打印队列BLDGC_LPS20_ANSI建立逻辑名MY_Qfor:$DEFINEMY_QBLDGC_LPS20_ANSI然后,可以使用以下命令到BLDGC_LPS20_ANSI打印队列打印文件FABLES.
TXT:$PRINT/QUEUE=MY_QFABLES.
TXT下一个例子展示使用/TABLE=table_name限定词在一个不同于进程逻辑名表的表中建立一个逻辑名.
通过指定LNM$SYSCLUSTER,把逻辑名放入默认簇范围表LNM$SYSCLUSTER_TABLE,因此簇上每个用户可存取.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$DEFINE/TABLE=LNM$SYSCLUSTERCUSTOMERSDISK1:[CUSTOMER_VISITS]CUSTOMERS.
TXT11.
3.
2在命令过程中为文件I/O建立逻辑名在命令过程中可以使用逻辑名执行文件I/O(输入和输出).
用OPEN命令打开文件时,也可以为那个文件建立一个逻辑名.
后续的READ、WRITE和CLOSE命令可以使用这个逻辑名代替实际的文件说明引用文件.
在以下例子中,OPEN命令建立逻辑名INFILE,而CLOSE命令删除它:$OPENINFILEDISK3:[WALSH]DATA.
DAT$READINFILERECORD$CLOSEINFILE11.
3.
3建立逻辑名的规则用DEFINE命令建立逻辑名时,遵守以下规则:限制每个等价串和逻辑名不多于255个字符.
逻辑名可以包含字母数字字符、下划线(_)、美元符($)和连字号(-).
指定一个等价串时,包括文件说明需要的标点符号(冒号、中括号、句点).
例如,用冒号结束设备名,把目录说明括入中括号内,并且文件类型前导一个句点.
如果一个逻辑名只表示一部分文件说明,那么用一个冒号把该名称与文件说明的其余部分分开.
当使用一个逻辑名表示一个完整文件说明时,则不需要结束冒号.
另外,确信逻辑名是文件说明的最左部分.
可选地,用一个冒号结束逻辑名.
注意,ASSIGN命令在把逻辑名放入逻辑名表之前除去这个冒号;DEFINE命令保存冒号作为逻辑名的一部分.
如果把一个逻辑名等同于一个等价串,然后再使同一逻辑名等同于另一等价串.
那么第二个定义将取代第一个,除非把它们定义在不同的逻辑名表中或以不同的存取模式定义它们.
以下命令显示文件DISK1:[SALES_STAFF]PAYROLL.
DAT:$DEFINEPAYDISK1:[SALES_STAFF]PAYROLL.
DAT$TYPEPAY$DEFINEPAY_FILEDISK1:[SALES_STAFF]PAYROLL$TYPEPAY_FILE:*.
DAT$DEFINEPAY_DIRDISK1:[SALES_STAFF]$TYPEPAY_DIR:PAYROLL.
DATUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$DEFINEPAY_DISKDISK1:$TYPEPAY_DISK:[SALES_STAFF]PAYROLL.
DAT11.
3.
4翻译属性当建立一个逻辑名时,可以指定翻译属性来修改系统解释等价串的方式.
要把翻译属性应用于一个等价串,对DEFINE命令使用/TRANSLATION_ATTRIBUTES限定词.
这是一个定位限定词.
它可以把翻译属性应用于所有等价串或者只应用于某些等价串,这取决于它在命令行中的位置,.
在以下例子中,设备名DJA3:被逻辑名DISK隐藏:$DEFINE/TRANSLATION_ATTRIBUTES=CONCEALEDDISKDJA3:$SHOWDEFAULTDISK:[SAM.
PUP]$SHOWLOGICALDISK"DISK"="DJA3"(LNM$PROCESS_TABLE)逻辑名DISK表示物理设备DJA3.
因而,SHOWDEFAULT命令显示逻辑名DISK而不显示物理设备名DJA3.
SHOWLOGICAL命令展现DISK的翻译.
CONCEALED属性使系统消息显示逻辑名,而不是设备的物理名.
通常,您对表示物理设备的逻辑名使用CONCEALED属性.
使用隐蔽设备使您编写程序、编写命令过程和执行其他操作时,不用关心是哪个物理设备拥有磁盘或磁带.
它也使您能够使用比物理设备名更有意义的名称.
TERMINAL属性阻止逻辑名的迭代翻译(即不检查等价串是否也是逻辑名).
第一次翻译后,翻译就"终止"(最后或已完成).
11.
3.
5存取模式OpenVMS操作系统有以下四种存取模式:用户模式(最外和最少特权的模式)监督程序模式执行模式核心模式(最内和最多特权的模式)可以使用DCL命令DEFINE或ASSIGN以前三个模式(用户、监督程序和执行)建立逻辑名.
通过为每个逻辑名定义指定不同的存取模式,可以在同样的逻辑名表中把同样的逻辑名等同于不同的等价串.
注意,必须有SYSNAM或SYSPRV特权才能以执行模式在任何逻辑名表中建立逻辑名.
用户模式UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在用户模式下建立的逻辑名是临时的.
当您只想在执行下一个命令或映象使用它时,就以用户模式定义逻辑名.
在以下例子中,在程序PAYABLE执行后就自动删除逻辑名ADDRESSES:$DEFINE/USER_MODEADDRESSESDISK1:[SAM.
ACCOUNTS]OVERDUE.
LIS$RUNPAYABLE监督程序模式当使用DEFINE命令不指定一个模式时,DCL就以监督程序模式建立逻辑名.
在以下例子中,这些命令在进程逻辑名表中把逻辑名ACCOUNTS等同于两个不同的等价串,一个是监督程序模式,而另一个是执行模式:$DEFINEACCOUNTSDISK1:[ACCOUNTS]CURRENT.
DAT$DEFINE/EXECUTIVE_MODEACCOUNTSDISK1:[JANE.
ACCOUNTS]OBSOLETE.
DAT执行模式在查寻逻辑名过程中,所有特权映象和公用程序(如LOGINOUT)忽略用户模式和监督程序模式名称和表.
如果一个逻辑名要被特权映象(包括公用程序)使用,那么它必须在执行或核心模式表中以执行或核心模式定义.
逻辑名必须以执行模式定义的其他情形是工作组和系统资源使用的公用目录名,如打印队列和系统磁盘.
核心模式只有操作系统和特权程序才可以在核心模式下建立逻辑名.
11.
3.
6建立逻辑节点名您可以使用一个逻辑节点名代替网络节点名,或者代替一个节点名和一个存取控制字符串.
一旦定义了一个逻辑节点名,就可以使用它以避免在屏幕上键入(和显示)您的用户名和密码.
要定义一个逻辑节点名,遵守以下规则:不能用下划线(_)开始逻辑名.
用一个双冒号(::)结束等价串,并把它括入引号("")内.
在存取控制字符串中出现引号的位置,使用两组引号("""").
(有关存取控制字符串的详情,请参阅本手册的3.
1.
6节、3.
1.
12节和10.
5节.
)指定一个包含1至255字符之内的逻辑名.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum警告不要把包括密码的DEFINE命令放入一个文件中(例如,注册命令过程).
否则,如果其他人阅读这个文件,就能看到这个密码.
在以下例子中,该命令把逻辑名BOS等同于节点名BOSTON和一个存取控制字符串,在此,ADAMS是用户名而OLMEKIKA是密码:$DEFINEBOS"BOSTON""ADAMSOLMEKIKA""::"11.
3.
6.
1在文件说明中使用逻辑节点名一个文件说明可以包含一个逻辑节点名(系统在本地节点翻译)和一个逻辑设备名(系统在远程节点翻译).
如果只使用一个逻辑名表示节点名,那么当您在文件说明的节点位置使用这个逻辑名时,必须包括一个双冒号(::).
系统在本地节点翻译了一个逻辑节点名之后,它分析文件说明的其余部分确定格式是否有效.
在以下例子中,系统在本地节点翻译逻辑节点名NYC.
在远程节点(NEWYRK)翻译逻辑设备名(DOC:):$DEFINENYCNEWYRK::$TYPENYC::DOC:[PERKINS]TERM_PAPER.
DAT11.
3.
6.
2取代存取控制字符串要在逻辑节点名中取代存取控制字符串,在命令行中指定逻辑名和一个存取控制字符串.
在以下例子中,存取控制字符串"REVEREHTEBAZILE"取代BOS等价串给出的存取控制字符串:$DEFINEBOS"BOSTON""ADAMSOLMEKIKA""::"$TYPEBOS"REVEREHTEBAZILE"::RIDE.
DAT当系统迭代地翻译一个逻辑节点名时,首次翻译的逻辑节点名的存取控制信息将取代以后的存取控制信息.
例如,逻辑名TEST1翻译为TORONTO"TESTNAMWENLUAP"::DBA1::$DEFINETORONTO"TRNTO""TESTEIZNEKCAM""::"UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$DEFINETEST1"TORONTO""TESTNAMWENLUAP""::DBA1:"$TYPETEST1:PROC.
DATTORONTO是一个逻辑节点名,因而发生迭代翻译.
换句话说,操作系统搜索逻辑名表,直到查找出所有级别的逻辑名定义.
然而,DEFINETEST1逻辑名赋值中的存取控制字符串取代DEFINETORONTO逻辑节点名赋值中的存取控制字符串.
因此,TYPE命令显示以下文件:TRNTO"TESTNAMWENLUAP"::DBA1:PROC.
DAT11.
3.
7为同一对象建立多个逻辑名使用多个DEFINE命令,可以建立引用同一对象的多个逻辑名.
例如,以下命令把逻辑名$TERMINAL和CONSOLE等同于一个终端的物理名,以便两个逻辑名转变为同一设备(LTA69):$DEFINE$TERMINALLTA69$DEFINECONSOLELTA6911.
4删除逻辑名要删除一个逻辑名,使用DEASSIGN命令.
在进程和作业逻辑名表定义逻辑名时,直到进程终止或者用户有明确的删除动作,它们才被删除.
然而,如果为DEFINE命令指定/USER_MODE限定词,那么逻辑名定义在进程逻辑名表中,并且在执行下一个命令映象之后自动删除.
要删除一个以冒号结束的逻辑名,指定两个冒号.
类似ASSIGN命令,DEASSIGN命令在搜索逻辑名表之前除去一个冒号.
11.
5逻辑名翻译当系统读取DCL命令行中的文件说明或设备名时,它检查这个文件说明或设备名查看最左边的部分是否是逻辑名.
如果最左边的部分以一个冒号、空格、逗号或行终止符(例如,Enter)结束,那么系统尝试把它翻译为逻辑名.
如果最左边的部分以任何其他字符结束,那么系统不尝试把它翻译为逻辑名.
在您输入了展示在以下例子中的命令后,系统查看PUP是否是一个逻辑名,因为PUP是文件说明的最左边部分.
由于最左边的部分以Enter结束,因此系统尝试翻译PUP.
$TYPEPUP[Enter]UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在您输入了展示在以下例子中的命令后,系统检查DISK是否是一个逻辑名.
系统尝试翻译DISK,因为它是最左边的部分并且以一个冒号结束.
系统不检查PUP:$TYPEDISK:PUP[Enter]在第三个例子中,系统不设法翻译[DRYSDALE]PUP,因为最左边的部分以一个右方括号(])结束:$TYPE[DRYSDALE]PUP[Enter]11.
5.
1迭代翻译逻辑名翻译可以迭代:系统翻译了一个逻辑名之后,系统为它在第一个逻辑名定义中查找到的任何逻辑名重复翻译进程.
系统限制执行逻辑名翻译的嵌套级数.
级数依系统设施变化,但至少9级.
如果您定义的级数比系统确定的级数更多或者如果您建立了一个循环定义,那么使用这个逻辑名时就会出错.
在以下例子中,第一个DEFINE命令把逻辑名DISK等同于设备名DUA1.
第二个DEFINE命令把逻辑名MEMO等同于文件说明DISK:[JEFF.
MEMOS]COMPLAINT.
TXT:$DEFINEDISKDUA1:$DEFINEMEMODISK:[JEFF.
MEMOS]COMPLAINT.
TXT系统翻译逻辑名MEMO时,它找到等价串DISK:[JEFF.
MEMOS]COMPLAINT.
TXT.
然后它查看这个文件说明最左边部分是否以一个冒号、空格、逗号或行终止符结束.
它找到DISK之后的冒号.
系统也翻译这个逻辑名.
文件说明的最后翻译结果是:DUA1:[JEFF.
MEMOS]COMPLAINT.
TXT11.
5.
2用系统默认值填充遗漏字段系统翻译逻辑名时,它用当前默认设备、目录和版本号填充文件说明的任何遗漏字段.
使用一个逻辑名为一个命令指定输入文件时,这个命令也使用这个逻辑名为输出文件分配一个文件说明.
如果等价串包含文件名和文件类型,那么也为输出文件给定同样的文件名和文件类型.
如果等价串不包含文件类型,则提供一个默认文件类型.
提供的文件类型依赖于使用的命令.
在一列输入文件中使用逻辑名时,每个逻辑名的等价串提供一个临时默认.
在以下例子中,因为没有为逻辑名HIG指定一个设备名,MAL的设备名把DBA1定义为临时默认设备:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$SETDEFAULTDBA2:[CASEY]$DEFINEMALDBA1:[MALCOLM]$DEFINEHIG[HIGGINS]$PRINTALPHA,MAL:BETA,HIG:GAMMAPRINT命令寻找以下文件:DBA2:[CASEY]ALPHA.
LISDBA1:[MALCOLM]BETA.
LISDBA1:[HIGGINS]GAMMA.
LIS11.
5.
3逻辑名翻译的默认搜索次序同样的逻辑名可以存在于一个以上逻辑名表.
当系统翻译文件说明中的逻辑名时,它搜索一列逻辑名表,直到查找到一个匹配.
系统使用找到的第一个匹配.
被搜索的逻辑名表的列表在逻辑名LNM$FILE_DEV的定义中指定.
默认列表包括进程、作业、组、系统和簇范围系统的逻辑名表.
搜索次序是一样的(进程、作业、组、系统和簇范围系统).
您可以修改搜索次序,见11.
11节描述.
11.
6显示逻辑名使用SHOWLOGICAL命令显示逻辑名和它们的等价串.
有时,逻辑名的定义包括另一个逻辑名.
SHOWLOGICAL命令执行迭代翻译.
然后,它显示其等价串和翻译级.
级号是基于0的;即,0是第一级,1是第二级,以此类推.
要只显示找到的指定逻辑名的第一个翻译,使用SHOWTRANSLATION命令.
(有关详情,请参阅OpenVMSDCLDictionary.
)如果使用SHOWLOGICAL命令确定与进程并存文件的等价串(请参阅11.
13节),那么这个命令只显示这个字符串的设备部分.
例如:$SHOWLOGICALSYS$INPUT"SYS$INPUT"="_TTB4:"(LNM$PROCESS_TABLE)在以下例子中,显示逻辑名MYDISK.
执行两级翻译;数字1指出第二级翻译:$SHOWLOGICALMYDISK"MYDISK"="WORK4"(LNM$PROCESS_TABLE)1"WORK4"="$255$DUA17:"(LNM$SYSTEM_TABLE)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在下一个例子中,显示逻辑名WORKFILE的等价串:$SHOWLOGICALWORKFILE"WORKFILE"="DISK2:[WALSH.
REPORTS]WORK_SUMMARY.
DAT"(LNM$PROCESS_TABLE)系统显示逻辑名、它的翻译和包含该逻辑名的表名.
11.
6.
1指定搜索的逻辑名表按照默认,SHOWLOGICAL命令搜索您的进程、作业、组、系统和簇范围系统表,并且显示所有匹配.
然而,使用/TABLE限定词可以指定特定的逻辑名表搜索次序.
也可以使用/GROUP、/SYSTEM、/JOB和/PROCESS限定词来显示分别在组、系统、作业和进程逻辑名表中的逻辑名.
在以下例子中,SHOWLOGICAL命令使用/TABLE限定词显示进程逻辑名表(LNM$PROCESS)中的逻辑名:$SHOWLOGICAL/TABLE=LNM$PROCESS(LNM$PROCESS_TABLE)"DECW$DISPLAY"="_WSA30:""SYS$COMMAND"="_FIFI$VTA65:""SYS$DISK"[super]="WORK1:""SYS$DISK"[exec]="WORK1:""SYS$ERROR"="_FIFI$VTA65:""SYS$INPUT"="_FIFI$VTA65:""SYS$OUTPUT"[super]="_FIFI$VTA65:""SYS$OUTPUT"[exec]="_FIFI$VTA65:""TT"="_VTA65:"11.
6.
2显示翻译属性和存取模式要显示逻辑名的翻译属性和存取模式,使用SHOWLOGICAL/FULL命令,如下所示:$SHOWLOGICAL/FULLSYS$ERROR"SYS$ERROR"[exec]="_PADRAIC$TDA824:"[terminal](LNM$PROCESS_TABLE)这个例子显示在执行模式下的逻辑名SYS$ERROR,并且展示其翻译属性,即终端.
11.
7建立和使用搜索列表在单个DEFINE(或ASSIGN)命令中一个逻辑名等于几个等价串时,就建立了一个搜索列表.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum当您在文件说明中使用搜索列表时,搜索列表的翻译如下所示:如果搜索列表只包含一个设备,那么搜索原始的默认目录.
如果搜索列表包含一个设备和一个目录,则这两个都用来构成一个完整文件说明.
按照指定等价串的次序,系统翻译这个逻辑名,直到找到一个匹配.
这个命令只影响找到的第一个文件.
到达这一点,搜索就结束.
如果没有找到一个匹配,那么系统只在尝试查找最后一个文件时才报告出错.
注意,搜索列表不是一个通配符;它是一个查找位置的列表.
在以下例子中,逻辑名GETTYSBURG是一个搜索列表:$DEFINEGETTYSBURG[JONES.
HISTORY],[JONES.
WORKFILES]$SHOWLOGICALGETTYSBURG"GETTYSBURG"="[JONES.
HISTORY]"(LNM$PROCESS_TABLE)="[JONES.
WORKFILES]"在下一个例子中,TYPE命令在搜索[JONES.
WORKFILES]之前搜索等价串[JONES.
HISTORY](在前面的逻辑名定义GETTYSBURG指定的次序):$TYPEGETTYSBURG:SPEECH.
TXTDISK1:[JONES.
HISTORY]SPEECH.
TXT;2Fourscoreandsevenyearsago,ourfathersbroughtforthonthiscontinentanewnation,conceivedinliberty,anddedicatedtothepropositionthatallmenarecreatedequal.
.
.
.
TYPE命令一旦查找到文件SPEECH.
TXT,它就结束搜索并显示这个文件.
11.
7.
1搜索列表和可以接受通配符的命令一起使用您可以将搜索列表与一个可以接受通配符的命令一起使用.
使用通配符时,系统使用搜索列表的每个等价串形成文件说明.
这个命令在标识现有文件的每个文件说明上都操作.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在以下例子中,指定DIRECTORY命令在版本字段带通配符.
它在GETTYSBURG定义的搜索列表中查找SPEECH.
TXT的所有版本:$DIRECTORYGETTYSBURG:SPEECH.
TXT;*目录DISK1:[JONES.
HISTORY]SPEECH.
TXT;2SPEECH.
TXT;1共2个文件.
目录DISK1:[JONES.
WORKFILES]SPEECH.
TXT;1共1个文件.
总计2个目录,3个文件.
输入搜索列表时(例如,使用DIRECTORY命令),操作系统使用列表的一部分元素提供已从列表的其他部分省略的部分文件说明.
如果文件说明不完整(如在以下例子中的SYS$LOGIN所展示),命令行可以产生多个文件和文件未找到的条件:$DIRECTORYSYS$MANAGER:LOGIN.
COM,SYS$LOGIN把一个分号放在文件说明后面,可以避免产生多个文件和文件未找到的条件,如下所示:$DIRECTORYSYS$MANAGER:LOGIN.
COM;,SYS$LOGIN11.
7.
2搜索列表和SETDEFAULT命令一起使用把搜索列表指定为SETDEFAULT命令的第一个部分参数时,系统把未翻译的搜索列表名分配给SYS$DISK.
(SYS$DISK是一个翻译为默认磁盘的逻辑名.
)注意,当把搜索列表指定为SETDEFAULT命令的第一个部分参数时,搜索列表的每个等价串必须包含一个设备名.
在以下例子中,指定一个设备和一个目录;因而,两个都用于构成文件说明:$DEFINEFIFIDISK1:[FRED],DISK2:[GLADYS],DISK3:[MEATBALL.
SUB]$DIRECTORYFIFI:MEMO.
LIS这个命令显示以下的文件列表:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumDISK1:[FRED]MEMO.
LISDISK2:[GLADYS]MEMO.
LISDISK3:[MEATBALL.
SUB]MEMO.
LIS在以下例子中,SHOWDEFAULT命令展示默认磁盘和目录为DISK2:[MEATBALL.
SUB].
下一步,定义搜索列表FIFI.
SETDEFAULT命令使用这个搜索列表作为其参数.
第二次使用SHOWDEFAULT命令展示默认目录没有被更改.
然而,搜索列表FIFI与其等价串一起显示为默认设备.
SHOWDEFAULT命令按照系统在该搜索列表的求值次序显示搜索列表:$SHOWDEFAULTDISK2:[MEATBALL.
SUB]$DEFINEFIFIDISK1:[FRED],DISK2:[GLADYS],DISK3:$SETDEFAULTFIFI$SHOWDEFAULTFIFI:[MEATBALL.
SUB]=DISK1:[FRED]=DISK2:[GLADYS]=DISK3:[MEATBALL.
SUB]11.
7.
3搜索列表和RUN命令一起使用当RUN命令后面跟随一个搜索列表时,系统象以前描述一样形成文件说明.
然而,系统于是要查看在列表中的任何文件是否是已安装的映象.
系统运行搜索列表中第一个已安装的映象文件.
然后,RUN命令终止.
如果没有文件说明是已安装的映象,那么系统重复形成文件说明的进程.
这次它寻找磁盘上的每个文件说明.
它运行在那里查找到的第一个文件.
如果在已知文件列表或在磁盘上都没有找到指定的文件,则显示一条出错消息.
11.
7.
4多个搜索列表的搜索次序文件说明可以包含一个以上搜索列表.
发生这种情况时,就使用文件名搜索列表的每个项目,同时第一个设备名保持不变.
在文件名搜索列表的所有项目与第一个设备名结合之后,它们与第二个设备名结合.
这个进程继续,直到搜索过每个设备.
您也可以有迭代(嵌套)搜索列表,此时搜索列表的一个名称翻译到另一个搜索列表.
如果发生这种情况,系统使用子列表中的每个名称然后继续下一个上级名称.
以下例子展示一个文件说明,它在文件名和设备名中有一个搜索列表:$DEFINEFILECHAP1.
RNO,CHAP2.
RNO$DEFINEDISKWORK1:[ROSE],WORK2:[THORN]UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$SETDEFAULTDISK$DIRECTORYFILE目录WORK1:[ROSE]CHAP1.
RNO;2CHAP2.
RNO;1共2个文件.
目录WORK2:[THORN]CHAP1.
RNO;1CHAP2.
RNO;1共2个文件.
总计2个目录,4个文件.
展示列出其中每个文件名的目录,第一个目录是WORK1:[ROSE]而第二个目录是WORK2:[THORN].
以下例子展示迭代的搜索列表:$DEFINENESTEDFRED.
DAT,NEW_LIST,RICKY.
DAT$DEFINENEW_LISTETHEL.
DAT,LUCY.
DAT这个搜索列表的搜索次序嵌套如下:FRED.
DATETHEL.
DATLUCY.
DATRICKY.
DAT11.
8逻辑名表特征逻辑名表有以下特征:作用域(它是否是可共享的或进程专用的)存取模式名称父逻辑名表存取控制(只用于可共享的逻辑名表)定额(其逻辑名占据池的数量极限)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在系统初始化期间,建立几个可共享的逻辑名表.
建立新进程时,系统为进程建立几个其他可共享的和进程专用的表.
所有这些表展示在表11-1中.
逻辑名表建立时,可以指定它的存取模式.
如果不指定,其模式默认为请求建立表时的存取模式,这通常是监督程序或用户模式.
逻辑名表包含的逻辑名可以有它自己的存取模式或较少特权的存取模式.
一个逻辑名表可以是另一个表的父表,而这个子表带同样或较少特权的存取模式.
一个逻辑名表通过它的名称标识,而这个名称本身也可以是一个逻辑名.
作为逻辑名,每个逻辑名表名必须包含在一个逻辑名表内.
11.
8.
1逻辑名表目录两个称为目录的特殊逻辑名表以逻辑名表名称的容器形式存在:进程目录,LNM$PROCESS_DIRECTORY进程目录包含该进程的所有进程专用表的名称和它自己的表名.
每个进程有它自己的进程专用目录.
系统目录,LNM$SYSTEM_DIRECTORY系统目录包含所有可共享表的名称和它自己的表名.
每个系统只有一个LNM$SYSTEM_DIRECTORY.
这些目录包含迭代翻译成表名的名称.
所有逻辑名表名和任何翻译成表的逻辑名保持在这些目录中.
逻辑名表的父表不一定是目录表.
即是说,这个分层式结构与逻辑名表名称的位置不同.
11.
8.
2显示目录表的结构要显示逻辑名目录表与逻辑名表的关系,输入SHOWLOGICAL/STRUCTURE命令,如以下例子所示:$SHOWLOGICAL/STRUCTURE(LNM$PROCESS_DIRECTORY)(LNM$PROCESS_TABLE)(LNM$SYSTEM_DIRECTORY)(LNM$SYSTEM_TABLE)(LMF$LICENSE_TABLE)(LNM$CLUSTER_TABLE)(LNM$SYSCLUSTER_TABLE)(LNM$GROUP_000123)(LNM$JOB_824E98E0).
.
.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum这个例子展示逻辑名表名驻留在每个逻辑名表目录中.
它也展示LNM$CLUSTER_TABLE和LNM$SYSCLUSTER_TABLE之间的关系.
11.
9默认逻辑名表由执行者建立的默认表包括系统目录和进程目录表,它们展示在表11-1中.
表11-1默认逻辑名表表名完整表名逻辑名描述进程逻辑名表进程目录LNM$PROCESS_DIRECTORY(没有其他逻辑名)包含进程专用的逻辑名表名和迭代翻译成表名的名称的定义.
进程表LNM$PROCESS_TABLELNM$PROCESS包含进程专用的逻辑名,例如SYS$DISK和SYS$INPUT.
可共享的逻辑名表系统目录LNM$SYSTEM_DIRECTORY(没有其他逻辑名)包含可共享的逻辑名表名和迭代翻译成表名的名称的定义.
系统表LNM$SYSTEM_TABLELNM$SYSTEM包含在系统中所有进程共享的名称,例如,SYS$LIBRARY和SYS$SYSTEM.
簇范围系统表LNM$SYSCLUSTER_TABLELNM$SYSCLUSTER包含在OpenVMS簇系统中所有进程共享的名称.
簇范围父表LNM$CLUSTER_TABLELNM$CLUSTER所有簇范围逻辑名表的父表,包括LNM$SYSCLUSTER_TABLE.
组表LNM$GROUP_gggggg1LNM$GROUP包含在UIC组中所有进程共享的名称.
作LNM$JOB_xxxxxxxx2LNM$JOB包含在作业树中所有进程共享UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum业表的名称,例如,SYS$LOGIN和SYS$SCRATCH.
1字符串gggggg表示一个6位数字的八进制数,它包含进程的UIC组号.
2字符串xxxxxxxx表示一个8位数字的十六进制数,它是作业信息块的地址.
11.
9.
1进程逻辑名目录注册时,在进程逻辑名目录表LNM$PROCESS_DIRECTORY中建立的进程专用逻辑名展示在表11-2中.
表11-2进程逻辑名目录中的默认逻辑名名称描述LNM$GROUP定义为$GROUP_gggggg的组逻辑名,在此gggggg表示组号.
LNM$GROUP_gggggg1是您的UIC组使用的逻辑名表.
表LNM$GROUP_gggggg编目在系统目录表中.
因此,LNM$GROUP是一个迭代翻译成组逻辑名表中名称的逻辑名.
LNM$JOB定义为LNM$JOB_xxxxxxxx的作业逻辑名,在此xxxxxxxx2表示一个您的作业树的唯一数目.
LNM$JOB_xxxxxxxx是您的作业使用的逻辑名表.
表LNM$JOB_xxxxxxxx编目在系统目录表中.
因此,LNM$JOB是一个迭代翻译成作业逻辑名表中名称的逻辑名.
LNM$PROCESS迭代翻译成进程逻辑名表LNM$PROCESS_TABLE的进程逻辑名.
LNM$PROCESS_DIRECTORY进程目录逻辑名表的名称.
1字符串gggggg表示一个6位数字的八进制数,它包含进程的UIC组号.
2字符串xxxxxxxx表示一个8位数字的十六进制数,它是作业信息块的地址.
11.
9.
2进程逻辑名表系统的每个进程有一个进程逻辑名表LNM$PROCESS_TABLE.
进程表中的名称只可用于您的进程和任何后续子进程.
注册时,系统为您的进程建立逻辑名并把它们放入进程表中.
通过此名称LNM$PROCESS可以间接地引用LNM$PROCESS_TABLE.
这个间接引用允许您重新定义LNM$PROCESS为多个等价名,因而它可以包括一个或多个您自己的表,如以下例子所示:$CREATE/NAME_TABLEAPPLICATION_NAMES$DEFINE/TAB=LNM$PROCESS_DIRECTORYLNM$PROCESSAPPLICATION_NAMES,LNM$PROCESS_TABLEUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum按照默认,进程表包含在表11-3中展示的逻辑名.
注意,逻辑名SYS$INPUT、SYS$OUTPUT、SYS$ERROR和SYS$COMMAND引用与进程并存的文件(这些文件在进程的生存周期内保持打开).
有关与进程并存的文件的详情,请参阅11.
13节.
表11-3在进程逻辑名表中的默认逻辑名名称描述SYS$COMMANDDCL从中读取输入的初始文件(通常是终端).
DCL从中读取输入的文件称为输入流.
命令解释程序使用SYS$COMMAND记住原始的输入流.
SYS$DISK注册时建立的或用SETDEFAULT命令更改的默认设备.
SYS$ERRORDCL把警告、出错和严重出错产生的系统出错消息写入的默认设备或文件.
SYS$INPUTDCL从中读取输入的默认文件.
SYS$NET调用DECnetforOpenVMS任务到任务通信的目标进程的源进程.
当它被目标进程打开时,SYS$NET代表一个逻辑链接,进程通过它可以与伙伴进程交换数据.
SYS$NET只在任务到任务通信期间定义.
SYS$OUTPUTDCL写入输出的默认文件(通常是终端).
DCL写入输出的文件称为输出流.
TT终端默认设备名.
11.
9.
3系统逻辑名目录默认系统逻辑名包含在系统目录表LNM$SYSTEM_DIRECTORY中,详见表11-4.
表11-4在系统逻辑名目录中的默认逻辑名名称描述LNM$CLUSTER迭代翻译成LNM$CLUSTER_TABLE的簇范围父表的逻辑名.
LNM$DCL_LOGICAL定义为LNM$FILE_DEV的DCL逻辑名.
LNM$DCL_LOGICAL迭代翻译成被SHOWLOGICAL命令、SHOWTRANSLATION命令和F$TRNLNM词法函数搜索和显示的逻辑名表列表.
按照默认,这些命令按这个次序搜索和显示进程、作业、组、系统和簇范围系统的逻辑名表.
LNM$DIRECTORIES定义为LNM$PROCESS_DIRECTORY和LNM$SYSTEM_DIRECTORY的目录逻辑名.
LNM$FILE_DEV搜索列表的逻辑名,定义为处理文件说明时系统搜索的逻辑名表列表.
如果定义为LNM$PROCESS、LNM$JOB、LNM$GROUP和LNM$SYSTEM,那么系统按这个次序搜索进程、作业、组、系统和簇范围系统的逻辑名表.
LNM$GROUP定义您的组表LNM$GROUP_gggggg1的组逻辑名.
LNM$JOB定义为LNM$JOB_xxxxxxxx2的作业逻辑名.
LNM$PERMANENT_MAILBOX定义为LNM$SYSTEM的永久邮箱逻辑名.
与永久邮箱关联的逻辑名被输入到这个逻辑名表中,而且逻辑名LNM$PERMANENT_MAILBOX迭代翻译成这个逻辑名表.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumLNM$SYSCLUSTER迭代翻译成LNM$SYSCLUSTER_TABLE的簇范围系统逻辑名表的逻辑名.
LNM$SYSTEM系统逻辑名表名称,它迭代翻译成LNM$SYSTEM_TABLE、LNM$SYSCLUSTER.
LNM$TEMPORARY_MAILBOX定义为LNM$JOB的临时邮箱逻辑名.
与临时邮箱关联的逻辑名被输入到这个逻辑名表中,而且逻辑名LNM$TEMPORARY_MAILBOX迭代翻译成这个逻辑名表.
1字符串gggggg表示一个6位数字的八进制数,它包含进程的UIC组号.
2字符串xxxxxxxx表示一个8位数字的十六进制数,它是作业信息块的地址.
11.
9.
4可共享的逻辑名表本节描述默认可共享的逻辑名表:簇范围系统表簇范围父表组表作业表系统表簇范围系统表LNM$SYSCLUSTER_TABLELNM$SYSCLUSTER_TABLE是簇范围系统逻辑名表的名称.
这个表包含的逻辑名可用于簇的所有用户.
通过名称LNM$SYSCLUSTER,可以间接地引用LNM$SYSCLUSTER_TABLE.
间接引用允许您重新定义LNM$SYSCLUSTER为多个等价名,从而把您自己的表包括在这个表中.
簇范围父表LNM$CLUSTER_TABLELNM$CLUSTER_TABLE是所有簇范围逻辑名表的父表,包括LNM$SYSCLUSTER_TABLE.
使用逻辑名LNM$CLUSTER可引用它.
组表LNM$GROUP_gggggg组表的名称是LNM$GROUP_gggggg(gggggg表示用户标识码[UIC]组号).
这个表中的名称可用于有同样UIC组号的所有用户.
系统上的每个组有一个相应的组逻辑名表.
通过名称LNM$GROUP,可以间接地引用LNM$GROUP_gggggg.
间接引用允许您重新定义LNM$GROUP_gggggg为多个等价名,从而把您自己的表包括在这个表中.
这也使您不需要记住UIC组号,并且确保使用最近定义的表.
作业表LNM$JOB_xxxxxxxxUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum作业表的名称是LNM$JOB_xxxxxxxx(xxxxxxxx表示系统为作业树定义的作业信息块[JIB]地址).
作业表包含可用于作业树中所有进程(您的进程和任何子进程)的逻辑名.
在系统中的每个作业树有一个作业表.
作业表是共享的,使得作业树中的所有进程可以存取它.
通过名称LNM$JOB可以间接地引用LNM$JOB_xxxxxxxx.
间接引用允许您重新定义LNM$JOB为多个等价名,从而把您自己的表包括在这个表中.
此外,使用LNM$JOB,您不必找出JIB地址,并且确保使用最近定义的作业表.
系统把为装上的磁盘、装上的磁带和临时邮箱建立的逻辑名放入作业逻辑名表中.
另外,系统建立以下逻辑名:SYS$LOGIN注册时的默认设备和目录.
SYS$LOGIN_DEVICE注册时的默认设备.
SYS$REM_ID对于通过DECnetforOpenVMS网络连接开始的作业,SYS$REM_ID就是在远程节点上启动这个作业的进程标识.
在OpenVMS操作系统上,如果允许代理注册,这个标识就是进程的用户名;如果不允许代理注册,这个标识则是进程标识(PID)号.
(到代理帐户的代理注册允许用户不指定存取控制字符串就可通过网络存取文件.
)SYS$REM_NODE对于通过DECnetforOpenVMS网络连接开始的作业,SYS$REM_NODE就是启动这个作业的的远程节点的名称.
SYS$SCRATCH写入临时文件的默认设备和目录.
系统表LNM$SYSTEM_TABLE系统表的名称是LNM$SYSTEM_TABLE.
在系统级上,系统表包含可用于系统中所有用户的逻辑名.
通常通过LNM$SYSTEM间接地引用系统表,LNM$SYSTEM定义为搜索列表LNM$SYSTEM_TABLE和LNM$SYSCLUSTER.
使用名称LNM$SYSTEM可包括本地节点的系统名和可用于簇上所有节点的系统名.
系统启动时自动定义在系统表中的逻辑名展示在表11-5中.
表11-5系统逻辑名表中的默认逻辑名名称描述默认地址DBG$INPUTOpenVMS调试程序的默认输入流,等同于进程级的SYS$INPUT不适用DBG$OUTPUTOpenVMS调试程序的默认输出流,等同于进程不适用UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum级的SYS$OUTPUTSYS$COMMON用于SYS$SYSROOT共同部分的设备和目录名SYS$SYSDEVICE:[SYSn.
SYSCOMMON.
],在此n是处理器的根目录数SYS$ERRORLOG出错记录数据文件的设备和目录名SYS$SYSROOT:[SYSERR]SYS$EXAMPLES系统例子的设备和目录名SYS$SYSROOT:[SYSHLP.
EXAMPLES]SYS$HELP系统求助文件的设备和目录名SYS$SYSROOT:[SYSHLP]SYS$INSTRUCTION系统指令数据文件的设备和目录名SYS$SYSROOT:[SYSCBI]SYS$LIBRARY系统库的设备和目录名SYS$SYSROOT:[SYSLIB]SYS$LOADABLE_IMAGES操作系统执行的可装载映象、设备驱动程序和其他执行装载代码的设备和目录SYS$SYSROOT:[SYS$LDR]SYS$MAINTENANCE系统维护文件的设备和目录名SYS$SYSROOT:[SYSMAINT]SYS$MANAGER系统管理文件的设备和目录名SYS$SYSROOT:[SYSMGR]SYS$MESSAGE系统消息文件的设备和目录名SYS$SYSROOT:[SYSMSG]SYS$NODE如果DECnetforOpenVMS在系统上是活动的,并且已连接到网络,那么该名就是本地系统的网络节点名.
不适用SYS$PROCDMP写入映象转储的目录(用户设置)不是默认设置SYS$SHARE系统可共享映象的设备和目录名SYS$SYSROOT:[SYSLIB]SYS$SPECIFIC用于SYS$SYSDEVICE节点特定部分的设备和目录名SYS$SYSDEVICE:[SYSn.
],在此n是处理器的根目录号SYS$STARTUP系统启动文件的设备和目录名一个先指向SYS$SYSROOT:[SYS$STARTUP]然后指向SYS$MANAGER的搜索列表UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumSYS$SYSDEVICE包含系统目录的系统磁盘通常是SYS$DISKSYS$SYSROOT系统目录的设备和根目录一个搜索列表,先指向SYS$SYSDEVICE:[SYSn.
],在此n是处理器的根目录号,然后指向SYS$COMMONSYS$SYSTEM操作系统程序和过程的设备和目录SYS$SYSROOT:[SYSEXE]SYS$TEST用户环境测试程序包(UETP)文件的设备和目录名SYS$SYSROOT:[SYSTEST]SYS$UPDATE系统更新文件的设备和目录名SYS$SYSROOT:[SYSUPD]11.
9.
5可共享逻辑名表的默认保护操作系统提供的可共享逻辑名表建立时带默认保护.
每种类型可共享逻辑名表的默认保护展示在表11-6中.
表11-6可共享逻辑名表的默认保护表类型表名默认保护作业表LNM$JOB_xxxxxxxx1SYSTEM=RWCD,OWNER=RWCD,GROUP=NOACCESS,WORLD=NOACCESS组表LNM$GROUP_gggggg2SYSTEM=RWCD,OWNER=R,GROUP=R,WORLD=NOACCESS系统表LNM$SYSTEM_TABLESYSTEM=RWC,OWNER=RWC,GROUP=R,WORLD=R簇范围系统表LNM$SYSCLUSTER_TABLESYSTEM=RWC,OWNER=RWC,GROUP=R,WORLD=RUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum簇范围父表LNM$CLUSTER_TABLESYSTEM=RWC,OWNER=RWC,GROUP=R,WORLD=R用户建立的表用户指定SYSTEM=RWCD,OWNER=RWCD,GROUP=NOACCESS,WORLD=NOACCESS1字符串xxxxxxxx表示一个8位数字的十六进制数,它是作业信息块的地址.
2字符串gggggg表示一个6位数字的八进制数,它包含进程的UIC组号.
11.
9.
6管理可共享逻辑名的特权和存取需求表11-7展示需要用于建立、删除和读取(翻译)在每种类型可共享逻辑名表中的逻辑名的特权和存取权.
有关特权、存取类型和存取控制的详情,请参阅本手册的第10章.
表11-7可共享逻辑名任务所需要的特权或存取类型名称所在的表表名任务需要的特权或存取类型作业表LNM$JOB_xxxxxxxx1建立或删除逻辑名对该逻辑名将从中建立或删除的表有WRITE(W)存取权读取(翻译)逻辑名对该逻辑名所在的表有READ(R)存取权组表LNM$GROUP_gggggg2建立或删除逻辑名对该逻辑名将从中建立或删除的表有WRITE(W)存取权,或有GRPNAM特权读取(翻译)逻辑名对该名称所在的表有READ(R)存取权系统表LNM$SYSTEM_TABLE建立或删除逻辑名有系统UIC组号(在0和系统参数MAXSYSGROUP值之间),或有SYSNAM特权读取(翻译)逻辑名对该名称所在的表有READ(R)存取权簇范围系统表LNM$SYSCLUSTER_TABLE建立或删除逻辑名有系统UIC组号(在0和系统参数MAXSYSGROUP值之间),或有SYSNAM特权读取(翻译)逻辑对该名称所在的表有READ(R)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum名存取权簇范围父表LNM$CLUSTER_TABLE建立或删除逻辑名有系统UIC组号(在0和系统参数MAXSYSGROUP值之间)读取(翻译)逻辑名对该逻辑名所在的表有READ(R)存取权用户建立的表用户指定建立或删除逻辑名对该逻辑名将从中建立或删除的表有WRITE(W)存取权读取(翻译)逻辑名对该逻辑名所在的表有READ(R)存取权1字符串xxxxxxxx表示一个8位数字的十六进制数,它是作业信息块的地址.
2字符串gggggg表示一个6位数字的八进制数,它包含进程的UIC组号.
11.
10建立逻辑名表CREATE/NAME_TABLE命令建立一个逻辑名表,并把它编目到一个目录逻辑名表中.
标识逻辑名表或者迭代翻译成逻辑名表的逻辑名必须总是进入到一个目录逻辑名表.
11.
10.
1建立进程专用的逻辑名表要建立一个进程专用的逻辑名表,把这个表建立在LNM$PROCESS_DIRECTORY中(默认).
目录表中的名称可以包含1至31个字符.
只有大写字母数字字符、美元符($)和下划线(_)是有效的.
如果指定小写字母的表名,它将自动转换为大写字母.
以下例子建立一个进程专用的逻辑名表TAX,把逻辑名CREDIT的定义放入这个表,并验证该表的建立.
SHOWLOGICAL/TABLE命令允许指定逻辑名表显示出来.
$CREATE/NAME_TABLETAX$DEFINE/TABLE=TAXCREDIT[ACCOUNTS.
CURRENT]CREDIT.
DAT$SHOWLOGICAL/TABLE=TAXCREDIT"CREDIT"="[ACCOUNTS.
CURRENT]CREDIT.
DAT"(TAX)要使系统在文件查寻时自动搜索新表,可以重新定义LNM$PROCESS,如以下例子所示:$DEFINE/TABLE=LNM$PROCESS_DIRECTORYLNM$PROCESSLNM$PROCESS_TABLE,TAX11.
10.
2建立可共享的逻辑名表要建立一个可共享的逻辑名表,使用/PARENT_TABLE限定词并指定可共享的表名.
例如:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$CREATE/NAME_TABLE/PARENT_TABLE=LNM$SYSTEM_DIRECTORYNEWTAB11.
10.
3建立簇范围逻辑名表用建立其他可共享逻辑名表的同样方法,可以建立一个簇范围逻辑名表.
簇范围逻辑名表是一类特殊的可共享逻辑名表,并服从应用于所有可共享逻辑名表的特权和存取需求(请参阅11.
10.
4节).
以下例子展示如何建立一个簇范围逻辑名表:$CREATE/NAME_TABLE/PARENT_TABLE=LNM$CLUSTER_TABLE-_$new_clusterwide_logical_name_table要建立将驻留在新的簇范围逻辑名表中的簇范围逻辑名,使用DEFINE命令定义新的簇范围逻辑名,并用/TABLE限定词指定这个新表的名称,如以下例子所示:$DEFINE/TABLE=new_clusterwide_logical_name_tablelogical_name-_$equivalence_string11.
10.
4特权和存取需求特权用户可以建立特殊用途的可共享逻辑名表.
例如,一个应用程序可以建立一个或多个可共享的逻辑名表传达信息(如文件位置)给应用程序的用户:$CREATE/NAME_TABLEAPPX_FILE_LOCATOR/PARENT=LNM$SYSTEM_DIRECTORY-_$/PROTECTION=(S:RWD,O:RWD,G:R,W:R)要建立一个可共享的逻辑名表,必须具有:对父表的CREATE(C)存取权对LNM$SYSTEM_DIRECTORY的SYSPRV特权或WRITE(W)存取权要删除一个可共享逻辑名表,必须具有:对该表的DELETE(D)存取权对LNM$SYSTEM_DIRECTORY的SYSPRV特权或WRITE(W)存取权11.
10.
5修改默认保护操作系统为它建立的和用户建立的可共享逻辑名表提供默认保护.
默认保护存储在系统管理员或表拥有者可以修改的安全简要中.
有关详情,请参阅OpenVMSGuidetoSystemSecurity.
您可以修改您建立的表的默认保护:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum使用DCLCREATE/NAME_TABLE命令的/PROTECTION限定词.
这个命令让您设置基于UIC的保护.
对已经用ACL编辑程序或用SETSECURITY/ACL/OBJECT_TYPE=LOGICAL_NAME_TABLE命令建立的表,应用ACL保护.
可共享逻辑名表的ACL在系统引导之间不保存.
每次系统引导时,必须重新建立这些逻辑名表的ACL.
有关对可共享逻辑名表应用ACL保护的详情,请参阅OpenVMSDCLDictionary的SETSECURITY/ACL命令.
11.
10.
6建立逻辑名表的定额定额用来限制一个给定逻辑名表可以消耗的系统资源数量.
进程、组和系统逻辑名表有无限定额.
按照默认,当建立一个逻辑名表时,它也有一个无限定额.
您可以指定一个定额限制您建立的逻辑名表的大小,以字节为单位.
在建立一个逻辑名之前,要根据这个表的剩余定额检查其数据结构的大小.
如果没有足够定额用于新条目,那么系统显示一条出错消息.
一旦为一个表设置了定额,就不能更改它.
如果这个表的空间用完了,就使用DEASSIGN命令删除旧的逻辑名.
这将为新逻辑名释放空间.
在以下例子中,建立逻辑名表ABC,并给出500字节的定额:$CREATE/NAME_TABLE/QUOTA=500ABC11.
10.
6.
1设置作业表定额作业逻辑名表是一个可共享表.
建立该表时,就确定这个作业逻辑名表的定额.
其定额由以下一个或多个准则确定:在系统用户授权文件SYSUAF.
DAT中为用户建立的JTQUOTA值(如果被进程激活的第一个映象是系统映象LOGINOUT).
在调用CreateProcess($CREPRC)系统服务中指定的PQL$_JTQUOTA定额列表值.
在用来建立分离进程的RUN命令上指定的/JOB_TABLE_QUOTA限定词值.
SYSGEN参数PQL_DJTQUOTA(如果没有应用前缀条件).
这个参数的标准默认值是1024字节;然而,系统管理员可以更改它.
SystemGeneration公用程序(SYSGEN)可以用来显示和设置参数PQL_DJTQUOTA(默认作业逻辑名表定额)和PQL_MJTQUOTA(最小作业逻辑名表定额)的值.
作业逻辑名表定额值为0,意味着没有定额.
为了实用,这个定额是无限的.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum11.
11修改逻辑名的翻译次序LNM$FILE_DEV定义将要搜索的逻辑名表和所有逻辑名翻译的搜索次序.
一般,不需要修改默认搜索次序.
然而,您可能想要添加新的、进程专用的逻辑名表的名称,使之在用LNM$FILE_DEV指定的表之前首先搜索.
同样,系统管理员可能想要添加一个或多个可共享逻辑名表的名称,使之在用LNM$FILE_DEV指定的表之前首先搜索.
要用一个逻辑名新表建立LNM$FILE_DEV进程专用定义,使之首先被系统搜索,执行以下步骤:1.
建立一个包含新逻辑名的文件.
2.
把这个新文件转换为一个新逻辑名表.
3.
把这个进程逻辑名目录表指定为其父表,建立LNM$FILE_DEV专用定义.
4.
把新逻辑名表的名称添加到LNM$FILE_DEV专用定义中表名列表的开始.
在以下例子中,建立一个新逻辑名表NEWTAB,然后使用NEWTAB建立LNM$FILE_DEV进程专用定义,并将其列为搜索的第一个表:$CREATE/NAME_TABLENEWTAB$DEFINE/TABLE=LNM$PROCESS_DIRECTORYLNM$FILE_DEV-_$NEWTAB,LNM$PROCESS,LNM$JOB,LNM$GROUP,LNM$SYSTEM在上面这个例子中,基于以下原因,系统首先搜索NEWTAB:使用LNM$FILE_DEV进程专用定义代替默认系统版本.
在LNM$FILE_DEV之内,NEWTAB在其他逻辑名表之前列出.
要把一个新逻辑名表添加到LNM$FILE_DEV系统定义中,必须有SYSNAM或SYSPRV特权.
以下例子类似上一个,只是NEWTAB被建立为一个可共享表,而不是一个进程专用表:$CREATE/NAME_TABLE/PARENT=LNM$SYSTEM_DIRECTORYNEWTAB$DEFINE/TABLE=LNM$SYSTEM_DIRECTORYLNM$FILE_DEV-_$NEWTAB,LNM$PROCESS,LNM$JOB,LNM$GROUP,LNM$SYSTEM您也可以从LNM$FILE_DEV定义的搜索列表中除去逻辑名表.
在以下例子中,建立LNM$FILE_DEV进程专用定义,并且只包含进程和系统逻辑名表.
由于进程专用的定义不包含LNM$JOB和LNM$GROUP,因此需要翻译逻辑名的后续命令将不搜索作业或组表.
$DEFINE/TABLE=LNM$PROCESS_DIRECTORY-_$LNM$FILE_DEVLNM$PROCESS,LNM$SYSTEMUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum11.
12删除逻辑名表要删除一个逻辑名表,指定包含它的表(系统或进程目录逻辑名表)和表名.
删除一个父逻辑名表时,将删除在后代表(和后代表自己)中的所有逻辑名.
要删除一个可共享逻辑名表,必须拥有对表的DELETE存取权或SYSPRV特权.
在以下例子中,这个命令删除逻辑名WORKFILE:$DEASSIGNWORKFILE在以下例子中,这个命令从进程目录表中删除逻辑名表TAX:$DEASSIGN/TABLE=LNM$PROCESS_DIRECTORYTAX11.
13与进程并存的逻辑名注册时,DCL建立与进程并存的逻辑名.
这些名称在进程的生存期保持定义.
不能解除这些逻辑名的赋值.
可以重新定义它们(在DEFINE命令中指定一个不同的等价串),但是如果重新定义的名称以后被解除赋值,那么与进程并存的名称就会重新建立.
以下与进程并存的逻辑名是可提供的:SYS$INPUT引用默认输入设备或文件的逻辑名SYS$OUTPUT引用默认输出设备或文件的逻辑名SYS$ERROR引用系统写入消息的默认设备或文件的逻辑名SYS$COMMAND注册时引用SYS$INPUT值的逻辑名11.
13.
1在交互和批处理中同等名的差别交互使用系统时,DCL把SYS$INPUT、SYS$OUTPUT、SYS$ERROR和SYS$COMMAND等同于终端.
然而,执行命令过程和提交批量作业时,DCL为这些逻辑名建立新的等价串.
交互执行一个命令过程时,发生以下情况:SYS$INPUT等同于命令过程.
因此,DCL从命令过程获得数据.
这个赋值是临时的.
在命令过程终止后,SYS$INPUT重新获得它的原始值.
SYS$OUTPUT、SYS$COMMAND和SYS$ERROR仍然等同于终端.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum提交一个批量作业时,发生以下情况:SYS$INPUT和SYS$COMMAND等同于批量作业命令过程.
SYS$OUTPUT和SYS$ERROR等同于批量作业日志文件.
嵌套命令过程时(即是说,当编写一个执行其他命令过程的命令过程时),SYS$INPUT的等价串更改为指向当前正在执行的命令过程.
然而,SYS$OUTPUT、SYS$ERROR和SYS$COMMAND的等价串保持不变,除非明确地更改它们.
另外,当输入一个打开文件的命令时,DCL就打开这个文件作为一个与进程并存的文件.
例如,如果使用OPEN命令打开一个文件,那么这个文件就被打开为一个与进程并存的文件.
文件保持打开,直到明确地关闭这个文件,或者直到注销.
与进程并存的文件存储在存储器的特殊区域.
注意,如果保持很多文件同时打开,那么可以用尽这个区域.
如果发生这种情况,就关闭一些文件(或者注销).
11.
13.
2使用与进程并存的逻辑名重定向文件I/O可以使用与进程并存的逻辑名重定向文件I/O.
在命令过程中,可以使用这些名称从终端读取数据,并且显示数据(请参阅第13章和第14章).
注意DCL忽略SYS$INPUT和SYS$COMMAND的新定义.
在OpenVMSV7.
1中,引入了DCLPIPE命令.
PIPE命令是重定向文件I/O的替代方法.
有关PIPE命令的详情,请参阅OpenVMSDCLDictionary:N--Z.
11.
13.
2.
1重定义SYS$INPUT您可以重新定义SYS$INPUT,以便一个由命令过程调用的映象可以从终端或另一个文件读取输入.
由于DCL总是从默认输入流获得输入,因此DCL忽略SYS$INPUT的重新定义.
在以下例子中,所列命令是新命令过程文件的一部分.
DEFINE命令把SYS$INPUT重新定义为SYS$COMMAND.
注册时,SYS$COMMAND引用终端作为初始输入流.
通过这个新定义,命令过程调用的映象从终端获得输入,而不是从命令过程文件(默认),但是这只用于一段时间.
/USER_MODE限定词告诉命令过程,只为下一个映象重新定义SYS$INPUT.
在这个例子中,下一个映象是编辑程序.
当这个编辑程序完成时,SYS$INPUT就恢复它的默认值.
在这种情况下,其默认值是命令过程文件.
$DEFINE/USER_MODESYS$INPUTSYS$COMMAND$EDIT/TPUMYFILE.
DAT.
.
.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum11.
13.
2.
2重定义SYS$OUTPUT您可以重新定义SYS$OUTPUT把输出从默认设备重定向到另一个文件.
当重新定义SYS$OUTPUT时,系统用这个逻辑名赋值指定的名称打开文件.
当定义SYS$OUTPUT时,所有后续输出被指引到这个新文件.
记住要解除SYS$OUTPUT赋值.
否则,输出将继续写入指定的文件.
注意,可以按用户模式(用DEFINE/USER_MODE)重新定义SYS$OUTPUT来重定向映象的输出.
只有当执行下一个命令映象时,这个定义才是有效的.
一旦执行完这个命令映象(即,其输出被俘获到一个文件),逻辑名SYS$OUTPUT就恢复为它的默认值.
您注册时,系统建立两个称为SYS$OUTPUT的逻辑名.
一个名称在执行模式建立;另一个名称在监督程序模式建立.
通过重定义SYS$OUTPUT可以取代监督程序模式逻辑名.
如果解除监督程序模式名赋值,那么系统在监督程序模式重新定义SYS$OUTPUT,使用执行模式等价串.
您不能解除执行模式名赋值.
重新定义SYS$OUTPUT为一个文件时,这个逻辑名只包含文件说明的设备部分,即使输出被指引到指定的文件.
重新定义SYS$OUTPUT时,如果系统不能打开指定的文件,它就显示一条出错消息.
在重新定义SYS$OUTPUT之后,多数命令把输出指引到这个文件的现有版本.
然而,某些命令在写入输出之前会建立这个文件的新版本.
在以下例子中,在输入SHOWDEVICES命令之前,SYS$OUTPUT被定义为MYFILE.
LIS.
SHOWDEVICES产生的显示被指引到当前目录的MYFILE.
LIS,而不是终端.
您可以象任何其他文本文件一样处理这个数据:$DEFINESYS$OUTPUTMYFILE.
LIS$SHOWDEVICES在以下例子中,SYS$OUTPUT被重新定义为文件TEMP.
DAT.
重新定义SYS$OUTPUT时,来自DCL和映象的输出被指引到文件TEMP.
DAT.
来自SHOWLOGICAL命令和SHOWTIME命令的输出也被发送到TEMP.
DAT.
当SYS$OUTPUT被解除赋值时,系统关闭文件TEMP.
DAT并把SYS$OUTPUT重新定义为终端.
当输入TYPE命令时,收集在TEMP.
DAT的输出显示在终端上.
$DEFINESYS$OUTPUTTEMP.
DAT$SHOWLOGICALSYS$OUTPUT$SHOWTIMEUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$DEASSIGNSYS$OUTPUT$TYPETEMP.
DAT"SYS$OUTPUT"="DISK1:"(LNM$PROCESS_TABLE)06-MAY-199613:26:53重新定义SYS$OUTPUT时,其等价串包含设备名DISK1,不是完整文件说明.
11.
13.
2.
3重定义SYS$ERROR您可以重新定义SYS$ERROR把出错消息指引到一个指定的文件.
然而,如果重新定义SYS$ERROR,使它不同于SYS$OUTPUT(或如果重新定义SYS$OUTPUT而没有重新定义SYS$ERROR),那么DCL命令就把通知、警告、出错和严重出错消息发送给SYS$ERROR和SYS$OUTPUT.
因此,您接收这些消息两次,一次是在SYS$ERROR定义指出的文件中,另一次是在SYS$OUTPUT指出的文件中.
成功消息只发送到SYS$OUTPUT指出的文件.
DCL命令和映象使用标准出错显示机制,把出错消息发送给SYS$ERROR和SYS$OUTPUT,即使SYS$ERROR不同于SYS$OUTPUT.
然而,如果重新定义SYS$ERROR,然后运行一个引用SYS$ERROR的映象,那么这个映象只把出错消息发送给SYS$ERROR指出的文件.
即使SYS$ERROR不同于SYS$OUTPUT,也是如此.
11.
13.
2.
4重定义SYS$COMMAND虽然您可以重新定义SYS$COMMAND,但DCL忽略您的定义.
DCL总是使用初始输入流的默认定义.
然而,如果执行一个SYS$COMMAND引用的映象,那么这个映象可以使用您的新定义.
第12章定义符号、命令和表达式符号是表示数字、字符或逻辑值(例如真或假)的名称.
在DCL命令行中使用一个符号时,DCL在执行这个命令之前用它的值替换符号.
输入包括参数、多个限定词和值的DCL命令行可能需要很多键入并且可能耗费很多时间.
要简化与DCL的交互并节省时间,可以建立符号来代替频繁地键入命令.
您也可以在命令过程中使用符号来收集、存储和处理某些类型的数据.
有关命令过程的详情,请参阅第13章和第14章.
本章描述:使用符号UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum显示符号与其他符号一起使用符号使用符号存储和处理数据字符串使用数值和表达式使用逻辑值和表达式在表达式中转换值的类型理解符号表屏蔽符号值理解符号替换命令处理程序的三个阶段使用符号的备用方法:自动外部命令有关详情,请参阅以下:OpenVMSDCLDictionary,有关符号和使用的详情OpenVMSCommandDefinition,Librarian,andMessageUtilitiesManual,有关定义新命令的详情12.
1关于符号您可以用以下方法使用符号:作为命令、参数或命令行的同义词.
代替键入长命令行,您可以建立代替使用的符号.
定义一个外部命令,允许您只输入符号名就可执行一个映象.
该命令是"外部的",因为对于DCL来说,它是未知的.
在命令过程文件中,执行编程任务,如条件执行和变量替换.
可以使用符号作为表达式中的变量,或者传送参数给命令过程和从命令过程传回.
另外,DCL命令(如READ、WRITE和INQUIRE)可使用符号引用数据记录.
在以下例子中,建立一个符号,并把它设置为经常存取的默认目录.
这些命令展示如何定义和使用符号WORK把默认目录设置为WORK1:[JONES.
WORK]目录:$WORK:==SETDEFAULTDISK1:[JONES.
WORK]$WORK$SHOWDEFAULTDISK1:[JONES.
WORK]12.
1.
1比较逻辑名和符号虽然逻辑名和符号类似,但它们的使用不同.
以下表格比较逻辑名和符号的功能、使用和其他特征:特征逻辑名符号UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum功能表示设备、目录、文件、队列和其他系统对象说明.
表示命令或部分命令串.
使用用于代替任何完整的设备、目录、文件、队列或其他系统对象说明.
逻辑名必须用作命令串参数的一部分,以便传送给文件系统翻译.
用于代替任何命令串.
符号必须用作命令字符串中的第一个字,以便命令语言解释程序翻译.
存储存储在进程、作业、组或系统逻辑名表内.
请参阅11.
10节.
存储在全局或局部符号表.
请参阅12.
10节.
建立使用ASSIGN或DEFINE命令建立逻辑名.
请参阅11.
3节.
使用赋值语句(=或==)建立符号.
请参阅12.
2节.
显示使用SHOWLOGICAL或SHOWTRANSLATION命令显示逻辑名.
请参阅11.
6节.
使用SHOWSYMBOL命令显示符号.
请参阅12.
3节.
删除使用DEASSIGN命令删除逻辑名.
请参阅11.
4节.
使用DELETE/SYMBOL命令删除符号.
请参阅12.
2.
5节.
12.
2使用符号您可以建立两类符号,局部和全局.
局部符号可从当前命令级和当前命令级执行的命令过程中存取.
全局符号则可从所有命令级存取.
您可以用一个字符串、数、词法函数、逻辑值或另一个符号定义一个符号.
符号名可以是1至255个字符长,并且必须开始是一个字母、下划线(_)或美元符($).
在符号名中,小写和大写字母都被处理为大写字母.
要建立一个符号,使用赋值语句(=或==)或字符串赋值(:=或::=、=).
当使用字符串赋值时,所有字母字符被转换为大写字母,而多个空格和制表符被压缩为单个空格.
可以使用字符串赋值来建立一个表示DCL命令或定义外部命令的符号(注意,在任何一种情况下,都有255个字符长的限制).
要在一个字符串赋值中使字符串跨行,使用一个连字号.
您也可以使用READ和INQUIRE命令建立符号(请参阅第13章和第14章).
建立局部符号在以下例子中,局部符号SS被赋值为DCL命令SHOWSYMBOL:$SS="SHOWSYMBOL"在以下例子中,局部符号DB赋值为DCL命令DIRECTORYACCOUNTS:[BOLIVAR]:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$DB:=DIRECTORYACCOUNTS:[BOLIVAR]建立全局符号在以下例子中,全局符号DC用来表示一个DCL命令行.
当输入这个符号名时,DCL命令DIRECTORY带指定限定词执行:$DC=="DIRECTORY/SIZE=ALLDISK1:[JONES.
TAX]MONEY.
LIS"在以下例子中,全局符号READY用来表示一个DCL命令行.
当输入这个符号名时,DCL命令PRINT带指定限定词执行:$READY:==PRINT/CONFIRM/QUEUE=AKI$LN03/NOTIFY/RESTART$READYFILE.
DAT12.
2.
1使用符号表示DCL命令您可以在注册命令文件(LOGIN.
COM)或在DCL级交互地定义一个表示DCL命令的符号.
在注册命令文件中定义符号时,就可以每次注册时使用这个符号;当您交互地定义符号时,只可以在当前进程期间使用这个符号.
如果定义的符号与DCL命令同名,您的定义将取代这个DCL命令名.
例如,如果把符号HELP定义为命令TYPEHELP.
LST,那么键入HELP时就可以不再调用系统的Help公用程序.
12.
2.
2符号缩写使用星号(*)建立一个可以缩写的符号.
一般而言,可以在允许使用符号的任何情形下使用缩写符号定义.
包括子串替换的符号是一个例外.
有关详情,请参阅12.
6.
5节.
注意,现有的符号也许被取代.
如果一个现有符号正确匹配带星号的新符号,那么新符号将替换现有的符号.
另外,不能定义另一个其名称部分匹配于带星号的现有符号的符号.
以下例子建立局部符号PRINT,它可以缩写为PR、PRI或PRIN:$PR*INT="PRINT/CONFIRM/QUEUE=AKI$LN03/NOTIFY/RESTART"要带指定限定词执行这个DCL命令PRINT,可以输入这个符号或它的任何缩写.
12.
2.
3定义外部命令如果把一个非DCL映象的文件说明等同于一个符号,键入这个符号名就可以运行这个映象.
一个运行映象的符号被称为一个外部命令.
外部命令是一个映象,它不被命令解释程序识别为DCL命令.
(注意,象DCL命令一样,外部命令也有255个字符长的限制.
)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum把符号定义为外部命令的格式如下所示:symbol-name:=[=]$image-file-specsymbol-name=[=]"$image-file-spec"注意,在符号定义的开始,美元符($)在文件说明之前并且在美元符和文件说明之间不带任何空格时,意味着请求运行这个映象.
对于映象文件说明,默认设备和目录名是SYS$SYSTEM,默认文件类型是.
EXE,而默认文件版本号是最高版本.
使用外部命令的另一个方法是使用CommandDefinition公用程序定义新命令.
有关详情,请参阅OpenVMSCommandDefinition,Librarian,andMessageUtilitiesManual.
也有自动执行外部命令的一种方法,不必指定符号.
有关详情,请参阅12.
14节.
在以下例子中,定义全局符号PRINTALL执行映象DISK1:[ACCOUNTS]PRINTALL.
EXE:$PRINTALL:==$[ACCOUNTS]PRINTALL在命令行中,PRINTALL后面可以跟随一个参数.
在以下例子中,文件说明RAT.
DAT是一个传送给PRINTALL定义的映象的参数:$PRINTALLRAT.
DAT12.
2.
4符号替换命令解释程序寻找括入省略号(')内的符号,并翻译它们.
因而,如果使用前面加上省略号指定参数的符号或词法函数,就发生符号替换(请参阅12.
12节).
否则,命令解释程序不分析这一行.
映象必须获得参数,并且执行命令行的任何分析或求值.
12.
2.
5删除符号DELETE/SYMBOL命令删除符号.
要删除全局符号,可包括/GLOBAL限定词.
例如,要删除全局符号TEMP,输入以下命令:$DELETE/SYMBOL/GLOBALTEMP12.
3显示符号UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumSHOWSYMBOL命令显示符号的值.
要显示特定符号的值,输入SHOWSYMBOL命令,并且后面跟随这个符号的名称.
要显示特定全局符号的值,要包括/GLOBAL限定词.
SHOWSYMBOL/ALL命令显示所有局部符号.
命令SHOWSYMBOL/ALL/GLOBAL显示所有全局符号.
注意,当符号有整数值时,SHOWSYMBOL命令以十进制、十六进制和八进制符号显示这个值.
在以下例子中,显示符号PR:$SHOWSYMBOLPRPR*INT="PRINT/CONFIRM/COPIES=2/QUEUE=DOC$LN03/NOTIFY/RESTART"在以下例子中,显示符号TOTAL的整数值:$SHOWSYMBOLTOTALTOTAL=4Hex=00000004Octal=0000000000412.
4与其他符号一起使用符号在定义了一个符号后,可以使用它作为另一个符号定义的一部分.
DCL把符号解释为一个字符串或一个数字,视使用符号的环境而定.
在以下例子中,整数值3赋值给符号COUNT:$COUNT=3然后,COUNT的值可以使用在其他赋值语句中.
例如,这里把COUNT的值加1:$TOTAL=COUNT+1结果(4)是等于符号TOTAL.
12.
4.
1符号串联使用加号(+),可以把几个符号连接起来建立一个长字符串.
使用省略号(')括住每个符号名,也可以连接两个或更多的符号.
有关请求符号替换的详情,请参阅12.
12.
2节.
在以下例子中,使用符号"Saturday"和"Sunday"建立符号"WEEKEND":UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$DAY1="Saturday,"$DAY2="Sunday"$WEEKEND=DAY1+DAY2$SHOWSYMBOLWEEKENDWEEKEND="Saturday,Sunday"在以下例子中,省略号用来连接符号NAME和TYPE:$NAME="MYFILE"$TYPE=".
DAT"$PRINT'NAME''TYPE'PRINT命令打印MYFILE.
DAT的一个副本.
12.
4.
2在字符串赋值中包括符号要在字符串赋值中包括局部符号,使用一个冒号和一个等号(:=).
要在字符串赋值中包括全局符号,使用一个冒号和两个等号(:==).
对于任意一类符号(局部或全局),把符号括入省略号('')内.
否则,DCL将不把它识别为符号.
如果为一个符号定义一个空字符串,那么这个符号的值是0.
在以下例子中,符号COUNT包括在一个字符串赋值语句中:$BARK:=P'COUNT'在上一个例子中,COUNT被赋值为整数值3.
在这个例子中,COUNT被转换为一个字符串值,并且附加在字符P之后.
局部符号BARK现在的值是P3.
在以下例子中,符号A为空:$A=""$B=2$C=A+B$SHOWSYMBOLCC=2Hex=00000002Octal=0000000000212.
5使用符号存储和处理数据UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在命令过程中,可以把符号用作变量.
变量拥有您计算或分配不同于文字值的值.
例如,可以把词法函数的值分配给变量,或者把文件记录的值读入变量.
表达式是值的混合.
在命令过程中,表达式用于符号赋值语句(在等号的右边)、IF语句、WRITE命令和词法函数的变元.
定义一个符号时,赋值语句的左边定义符号名;赋值语句的右边包含表达式.
表达式中的每个值(也称为操作数)可以通过运算符连接到另一个值.
DCL求表达式的值,并把结果分配给符号.
如果表达式求值为字符串,那么符号有字符串值.
在以下例子中,局部符号BARK等于一个加三个数的表达式:$BARK=1+2+3操作数是1、2和3.
运算符是加号(+).
求值的表达式是整数,因而符号有一个整数值.
12.
6字符串字符串可以包含任何可以打印的字符.
附录A包括ASCII字符集和DEC多国字符集的表.
这些表列出可以在字符串中包括的字符.
字符主要分为三类:字母数字字符大写字母A至Z、小写字母a至z、数字1至9、美元符($)、下划线(_)和连字号(-).
特殊字符所有可以显示或打印的其他字符:感叹号(!
)、引号(")、数字符号(#),等等.
不可打印的字符所有不能打印或显示的字符.
一般而言,显示和打印时,忽略不可打印的字符.
然而,有几个不可打印的字符具有控制功能,如下所示:字符功能HT在下一个水平制表符开始打印或键入LF在下一行开始打印或键入FF在下一页顶部开始打印或键入CR在同一行第一个空格处开始打印或键入ESC引入终端换码符SP插入一个空格12.
6.
1定义字符串UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum把一个字符串括入引号("")内可以定义它.
按这种方法进行符号赋值时,保持字母大小写和空格.
注意以下几点:要在字符串内包括引号("),键入两个连续引号.
要使字符串跨行,使用一个加号(用于字符串串联)和一个连字号(用于续行).
在引用的字符串内,不能使用连字号续行字符.
在以下例子中,字符串"YES"被引用,因而它必须在引号内定义:$PROMPT="Type""YES""or""NO"""$SHOWSYMBOLPROMPTPROMPT="Type"YES"or"NO""在以下例子中,字符串跨行:$HEAD="MONTHLYREPORTFOR"+-_$"DECEMBER1999"$SHOWSYMBOLHEADHEAD="MONTHLYREPORTFORDECEMBER1999"12.
6.
2字符串表达式字符串表达式可以包含字符串、求值为字符串的词法函数或有字符串值的符号.
在表达式中使用字符串时,必须把它括入引号("")内.
如果不使用引号,DCL把字符串处理为符号.
字符串表达式结合以下值(称为字符串操作数):必须出现在引号内的字符串表示字符串的符号求值为字符串的词法函数如果在一个字符串和一个数之间执行一个操作或比较,那么DCL将把字符串转换为一个数.
字符串操作数可以添加(字符串串联)、减去(字符串缩减)、比较或用其他字符串替换,如以下小节所述.
在以下例子中,字符串"CAT"必须出现在引号内:$TEMP="CAT"在以下例子中,符号TEMP表示字符串"CAT".
符号TOPIC是字符串"THE"和符号TEMP表示的字符串("CAT")的串联.
其结果是"THECAT".
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$TOPIC="THE"+TEMP在以下例子中,符号COUNT表示词法函数F$STRING(65):$COUNT=F$STRING(65)12.
6.
3字符串操作可以指定以下字符串操作:串联---加号连接两个字符串.
缩减---减号从第一个字符串除去第二个字符串.
如果第二个字符串在第一个字符串中出现一次以上,那么只除去这个字符串的第一次出现.
在以下例子中,加号(+)用来连接两个字符串:$COLOR="lightbrown"$WEIGHT="30lbs.
"$DOG2="Notag,"+COLORWEIGHT$SHOWSYMBOLDOG2DOG2="Notag,lightbrown,30lbs.
"在以下例子中,减号(-)用来除去一个字符串:$SHOWSYMBOLDOG2DOG2="Notag,lightbrown,30lbs.
"$DOG2=DOG2-",30lbs.
"$SHOWSYMBOLDOG2DOG2="Notag,lightbrown"12.
6.
4比较字符串比较两个字符串时,字符串是一个字符接着一个字符进行比较.
不同长度的字符串是不相同的(例如,"dogs"大于"dog").
比较准则是字符的ASCII值.
按照这些准则,数字0至9小于大写字母A至Z,而大写字母A至Z小于小写字母a至z.
当以下任意一个条件为真时,就结束字符串比较:已比较所有字符,在那种字母大小写情况下字符串是相同的.
出现第一个不匹配.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum表12-1列出不同类型的字符串比较.
表12-1字符串比较比较运算符描述等于.
EQS.
把一个字符串与另一个进行比较,检测是否相同.
大于或等于.
GES.
把一个字符串与另一个进行比较,检测是否第一个指定字符串具有较大的值或者相同.
大于.
GTS.
把一个字符串与另一个进行比较,检测是否第一个指定字符串具有较大的值.
小于或等于.
LES.
把一个字符串与另一个进行比较,检测是否第一个指定字符串具有较小的值或者相同.
小于.
LTS.
把一个字符串与另一个进行比较,检测是否第一个指定字符串具有较小的值.
不等.
NES.
把一个字符串与另一个进行比较,检测是否不同.
在以下所有例子中,假定符号LAST_NAME值为"WHITFIELD".
在以下例子中,符号TEST_NAME求值为0(假);符号LAST_NAME的值不等于文字"HILL":$TEST_NAME=LAST_NAME.
EQS.
"Hill"$SHOWSYMBOLTEST_NAMETEST_NAME=0.
.
.
在以下例子中,符号TEST_NAME求值为1(真);符号LAST_NAME的值大于或等于文字"HILL":$TEST_NAME=LAST_NAME.
GES.
"HILL"$SHOWSYMBOLTEST_NAMETEST_NAME=1.
.
.
在以下例子中,符号TEST_NAME求值为1(真);符号LAST_NAME的值大于文字"HILL":$TEST_NAME=LAST_NAME.
GTS.
"HILL"$SHOWSYMBOLTEST_NAMETEST_NAME=1.
.
.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在以下例子中,符号TEST_NAME求值为0(假);符号LAST_NAME的值不小于或等于文字"HILL":$TEST_NAME=LAST_NAME.
LES.
"HILL"$SHOWSYMBOLTEST_NAMETEST_NAME=0.
.
.
在以下例子中,符号TEST_NAME求值为0(假);符号LAST_NAME的值不小于文字"HILL":$TEST_NAME=LAST_NAME.
LTS.
"HILL"$SHOWSYMBOLTEST_NAMETEST_NAME=0.
.
.
在以下例子中,符号TEST_NAME求值为1(真);符号LAST_NAME的值不等于文字"HILL":$TEST_NAME=LAST_NAME.
NES.
"HILL"$SHOWSYMBOLTEST_NAMETEST_NAME=1.
.
.
12.
6.
5替换子串指定替换字符串的位置和大小,可以用另一个字符串替换一个字符串的一部分.
局部符号的格式是:symbol-name[offset,size]:=replacement-string全局符号的格式是:symbol-name[offset,size]:==replacement-string各元素如下所示:offset一个整数,指出替换字符串相对于原始字符串首位字符的位置.
偏移0是指符号的首位字符,偏移1是指第二个字符,以此类推.
size一个整数,指出替换字符串的长度.
要替换子串,遵守以下规则:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum方括号是需要的符号.
在符号名和左中括号之间不允许有空格.
大小和偏移值的整数值范围可以从0至768.
替换字符串必须是一个字符串.
指定的符号名可以是最初未定义的.
赋值语句建立符号名,如果有必要,在符号值中提供前导或尾随空格.
可以指定偏移和大小来建立一个表示空白行的符号.
按列排列记录使列表更易于读取和排序.
可以使用这个格式指定如何存储数据.
在以下例子中,第一个赋值语句为符号A给出值PACKRAT.
第二个语句指定MUSK替换A值的前四个字符.
其结果是A成为MUSKRAT.
$A:=PACKRAT$A[0,4]:=MUSK$SHOWSYMBOLAA="MUSKRAT"在以下例子中,符号B以前没有值,因而它被给定一个前导四个空格并尾随RAT的值:$B[4,3]:=RAT在以下例子中,一个80个空白空格的值赋值给符号LINE:$LINE[0,80]:=""在以下例子中,第一个语句使用NAME的值填充DATA的前15列.
第二个语句用GRADE的值填充第18列.
第16和17列包含空白:$DATA[0,15]:='NAME'$DATA[17,1]:='GRADE'12.
7使用数值和表达式一个数可以有以下值:十进制---ASCII字符0至9十六进制---ASCII字符0至9和A至F八进制---ASCII字符0至7UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum赋值给符号的数范围必须在--2147483648至2147483647(十进制).
如果一个指定的或计算的数超出这个范围,则不会报告出错,但会得出一个错误结果.
12.
7.
1指定数在DCL命令级和在命令过程中,如下所示指定一个数:正数键入适当的数字指定一个正数.
负数在负数之前带一个减号(-).
基数在数(但不是减号)之前为十六进制数前导%X而为八进制数前导%0,指定一个非十进制为基的数.
小数一个数不能包括十进制小数点.
在计算中,小数部分被截取.
例如,8除3等于2.
在以下例子中,数13赋值给符号DOG_COUNT:$DOG_COUNT=13$SHOWSYMBOLDOG_COUNTDOG_COUNT=13Hex=0000000DOctal=00000000015在以下例子中,负数(-15237)用减号(-)表示:$BALANCE=-15237$SHOWSYMBOLBALANCEBALANCE=-15237Hex=FFFFC47BOctal=37777742173在以下例子中,十六进制数D用前缀%X表示:$DOG_COUNT=%XD$SHOWSYMBOLDOG_COUNTDOG_COUNT=13Hex=0000000DOctal=00000000015$BALANCE=-%X3B85$SHOWSYMBOLBALANCEBALANCE=-15237Hex=FFFFC47BOctal=3777774217312.
7.
2数的内部存储数在内部存储为有符号的4字节整数,称为长字;正数的值从0到2147483647,而负数的值为4294967296减去这个数绝对值.
例如,数-15237存储为4294952059.
对于ASCII或十进制显UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum示,负数转回减号格式;然而,对于十六进制和八进制显示,它们是不转换的.
例如,数-15237显示为十六进制FFFFC47B(十进制4294952059),而不是十六进制-00003B85.
使用ASCII惯例以数字串格式把数存储在文本文件中(例如,数字1有存储值49).
在数字表达式中,包括的值必须是文字数(例如3)或带数值的符号.
另外,可以使用表示数的字符串(例如,"23"或"-51").
如果在一个数和一个字符串之间执行一个操作或比较,DCL把字符串转换为一个数.
数字表达式组合以下值(称为整数操作数):整数.
例如:$COUNT=1求值为整数的词法函数.
例如:$B=F$INTEGER("-9"+23)有整数值的符号.
例如:$A=B-6在前面的例子中,符号B表示F$INTEGER函数返回的整数值(-923).
这些整数操作数可以通过算术、逻辑和比较运算符连接在一起,如以下几节所述.
12.
7.
3执行算术运算可以指定以下算术运算:乘法星号(*)乘两个数.
除法斜杠(/)用第二个指定数去除第一个指定数.
如果一个数不能整除,那么将失去余数.
不发生舍入.
加法加号(+)加两个数.
减法减号(-)从第一个指定数减去第二个指定数.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum一元加减加号和减号更改在它们之后的数的符号.
例子以下例子示范当赋值一个符号时使用乘法:$BALANCE=142*14$SHOWSYMBOLBALANCEBALANCE=1988Hex=000007C4Octal=00000003704以下例子示范当赋值一个符号时使用除法:$BALANCE=BALANCE/14$SHOWSYMBOLBALANCEBALANCE=142Hex=0000008EOctal=00000000216以下例子示范当赋值一个符号时使用加法:$BALANCE=BALANCE+37$SHOWSYMBOLBALANCEBALANCE=179Hex=000000B3Octal=00000000263以下例子示范当赋值一个符号时使用减法:$BALANCE=BALANCE-15416$SHOWSYMBOLBALANCEBALANCE=-15237Hex=FFFFC47BOctal=00000142173以下例子示范使用一元减符号更改数-142的符号:$BALANCE=-(-a142)$SHOWSYMBOLBALANCEBALANCE=142Hex=0000008EOctal=0000000021612.
7.
4比较数表12-2列出不同类型的数字比较.
表12-2数字比较UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum比较运算符描述等于.
EQ.
把一个数与另一个数进行比较,检测是否相同.
大于或等于.
GE.
把一个数与另一个数进行比较,检测是否第一个数有较大的值或者相同.
大于.
GT.
把一个数与另一个数进行比较,检测是否第一个数有较大的值.
小于或等于.
LE.
把一个数与另一个数进行比较,检测是否第一个数有较小的值或者相同.
小于.
LT.
把一个数与另一个数进行比较,检测是否第一个数有较小的值.
不等于.
NE.
把一个数与另一个数进行比较,检测是否不同.
在以下例子中,假定符号BALANCE有值-15237.
在以下例子中,TEST_BALANCE求值为1(真);BALANCE等于-15237:$TEST_BALANCE=BALANCE.
EQ.
-15237$SHOWSYMBOLTEST_BALANCETEST_BALANCE=1.
.
.
在以下例子中,TEST_BALANCE求值为1(真);BALANCE大于或等于-15237:$TEST_BALANCE=BALANCE.
GE.
-15237$SHOWSYMBOLTEST_BALANCETEST_BALANCE=1.
.
.
在以下例子中,TEST_BALANCE求值为0(假);BALANCE不大于-15237:$TEST_BALANCE=BALANCE.
GT.
-15237$SHOWSYMBOLTEST_BALANCETEST_BALANCE=0.
.
.
在以下例子中,TEST_BALANCE求值为1(真);BALANCE小于或等于-15237:$TEST_BALANCE=BALANCE.
LE.
-15237$SHOWSYMBOLTEST_BALANCETEST_BALANCE=1.
.
.
在以下例子中,TEST_BALANCE求值为0(假);BALANCE不小于-15237:$TEST_BALANCE=BALANCE.
LT.
-15237UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$SHOWSYMBOLTEST_BALANCETEST_BALANCE=0.
.
.
在以下例子中,TEST_BALANCE求值为0(假);BALANCE等于-15237:$TEST_BALANCE=BALANCE.
NE.
-15237$SHOWSYMBOLTEST_BALANCETEST_BALANCE=0.
.
.
12.
7.
5执行数字覆盖使用赋值语句的特殊格式,可以对当前符号值执行二进制(位级)覆盖.
对于局部符号,格式是:symbol-name[bit-position,size]=replacement-expression对于全局符号,格式是:symbol-name[bit-position,size]==replacement-expression各元素如下所示:bit-position一个整数,指出发生覆盖的相对于位0的位置.
size一个整数,指出覆盖的位数.
要使用数字覆盖,遵守以下规则:方括号([])是需要的符号.
不允许在符号名和左中括号之间有空格.
文字值假定为十进制数.
大小(size)的最大长度是32位.
替换表达式必须是一个数字表达式.
当symbol-name未定义或者已定义为字符串时,覆盖的结果是字符串.
否则,结果是整数.
以下例子中定义符号BELL的值为7.
BELL的低位字节有二进制值00000111.
把偏移5的0更改为1(从0开始,从右到左计算位数),可以建立二进制值00100111(十进制值39):$BELL=7$BELL[5,1]=1$SHOWSYMBOLBELLBELL=39Hex=00000027Octal=00000000047UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum12.
8使用逻辑值和表达式以下几节描述如何使用逻辑值和表达式.
12.
8.
1逻辑操作有些操作把数和字符串解释为带值的逻辑数据,如下所示:真值如果一个数是奇数(即,最低位是1),这个数有逻辑真值.
如果字符串的首位字符是大写字母或小写字母的T或Y,那么这个字符串有逻辑真值.
假值如果一个数是偶数(即,最低位是0),这个数有逻辑假值.
如果字符串的首位字符不是大写字母或小写字母的T或Y,那么这个字符串有逻辑假值.
在以下例子中,DOG_COUNT赋值为13.
IFSTATUS意味着如果STATUS的逻辑值为真.
$STATUS=1$IFSTATUSTHENDOG_COUNT=13$STATUS="TRUE"$IFSTATUSTHENDOG_COUNT=1312.
8.
2逻辑表达式逻辑操作影响操作数的所有位.
逻辑表达式的值是整数,而且其表达式的结果也是整数.
如果在逻辑表达式中指定一个字符串值,那么在表达式求值之前字符串转换为一个整数.
通常,使用逻辑表达式求值逻辑值的最低位;即是说,要确定其值是否为真或为假.
可以指定以下逻辑操作:.
NOT.
运算符.
NOT.
使逻辑值的位配置反向.
一个真值成为假.
而一个假值成为真.
.
AND.
运算符.
AND.
结合两个逻辑值,如下所示:位级实体级1.
AND.
1=1true.
AND.
true=true1.
AND.
0=0true.
AND.
false=false0.
AND.
1=0false.
AND.
true=false0.
AND.
0=0false.
AND.
false=falseUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum.
OR.
运算符.
OR.
结合两个逻辑值,如下所示:位级实体级1.
OR.
1=1true.
OR.
true=true1.
OR.
0=1true.
OR.
false=true0.
OR.
1=1false.
OR.
true=true0.
OR.
0=0false.
OR.
false=false以下例子把真值反向为假.
表达式求值为-2;其值是偶数,因此为假:$SHOWSYMBOLSTATUSSTATUS=1Hex=00000001Octal=00000000001$STATUS=.
NOT.
STATUS$SHOWSYMBOLSTATUSSTATUS=-2Hex=FFFFFFFEOctal=37777777776以下例子结合一个真值和一个假值,从而产生一个假值:$STAT1="TRUE"$STAT2="FALSE"$STATUS=STAT1.
AND.
STAT2$SHOWSYMBOLSTATUSSTATUS=0Hex=00000000Octal=00000000000以下例子结合一个真值和一个假值,从而产生一个真值:$STAT1="TRUE"$STAT2="FALSE"$STATUS=STAT1.
OR.
STAT2$SHOWSYMBOLSTATUSSTATUS=1Hex=00000001Octal=0000000000112.
8.
3逻辑操作结果以下表格示范基于逐位和逐数字的逻辑操作结果.
在逻辑操作中,从大写字母或小写字母T或Y开始的字符串被视为数1;从任何其他字符开始的字符串被视为数0.
在逻辑操作中,奇数为真值,而偶数和零为假值.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum给定:结果是:位A位B.
NOT.
AA.
AND.
BA.
OR.
B11011100010110100100给定:结果是:数A数B.
NOT.
AA.
AND.
BA.
OR.
B奇奇偶奇奇奇偶偶偶奇偶奇奇偶奇偶偶奇偶偶12.
8.
4使用词法函数的返回值词法函数通常在命令过程中使用,它从系统检索信息,包括有关系统过程、批量和打印队列和用户进程的信息.
也可以使用词法函数处理字符串和翻译逻辑名.
当把一个词法函数赋值给一个符号时,这个符号就等于这个词法函数返回的信息(例如,一个数或字符串).
然后在DCL级,可以用DCL命令SHOWSYMBOL显示这个信息.
在命令过程中,存储在符号上的信息以后可以使用在过程中.
有关词法函数的详情,请参阅第15章.
要使用词法函数,需指定词法函数的名称(它总是从F$开始)和它的变元列表.
使用以下格式:F$function-name(args[,.
.
.
])变元列表跟随函数名,可以带任何数目的插入空格和制表符.
当使用词法函数时,遵守以下规则:把变元列表括入圆括号内.
在这个列表中,以准确次序指定变元,并且用逗号分开;即使省略可选变元,也不能省略逗号.
如果不需要变元,那么键入空的圆括号.
遵循以下规则编写表达式:把字符串括入引号内;不把整数、符号和词法函数括入引号内.
以使用字符串、整数和符号同样的方法使用词法函数.
在表达式中使用词法函数时,DCL自动求出函数的值,并用它的返回值替换这个函数.
在以下例子中,F$LENGTH函数返回指定为变元的BUMBLEBEE的值长度.
DCL自动确定返回值(9),并使用这个值来求出表达式的值.
因此,表达式(9+1)的结果是10,并且把这个值赋给符号SUM:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$SUM=F$LENGTH("BUMBLEBEE")+1$SHOWSYMBOLSUMSUM=10Hex=0000000AOctal=00000000012注意,每个词法函数返回的信息是一个整数或者是一个字符串.
另外,必须为词法函数指定一个表示整数或字符串的变元.
例如,F$LENGTH函数需要一个字符串表达式的变元,并返回整数值.
在上一个例子中,变元"BUMBLEBEE"是字符串表达式,而返回值(9)是整数.
可以在使用符号的任何位置使用词法函数.
在符号替换的位置,必须强制把符号括入省略号内(请参阅12.
12节),词法函数求值必须强制把词法函数放入省略号内.
词法函数也可以用作其他词法函数的变元值.
以下例子展示可以为F$LENGTH函数指定变元的不同方法.
在每个例子中,变元是字符串表达式.
以下例子展示一个用作变元的符号:$BUG="BUMBLEBEE"$LEN=F$LENGTH(BUG)$SHOWSYMBOLLENLEN=9Hex=00000009Octal=00000000011把符号BUG用作变元时,不用引号括住它.
词法函数自动用值"BUMBLEBEE"代替BUG,确定其长度,并返回值9.
以下例子展示包含符号和字符串的变元:$BUG="BUMBLEBEE"$LEN=F$LENGTH(BUG)$SHOWSYMBOLLENLEN=9Hex=00000009Octal=00000000011$LEN=F$LENGTH(BUG+"S")$SHOWSYMBOLLENLEN=10Hex=0000000AOctal=00000000012符号BUG不括入引号,而字符串"S"要括入.
变元必须在F$LENGTH函数可以确定其长度之前求值.
符号BUG表示的值("BUMBLEBEE")与字符串"S"连接;其结果是"BUMBLEBEES".
F$LENGTH函数确定字符串"BUMBLEBEES"的长度并返回值10.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum以下例子为F$LENGTH函数使用另一个词法函数作为变元.
F$DIRECTORY函数返回当前默认目录的名称,并且包括方括号.
在以下例子中,当前默认目录是[SALMON].
$LEN=F$LENGTH(F$DIRECTORY())$SHOWSYMBOLLENLEN=8Hex=00000008Octal=00000000010把F$DIRECTORY函数用作变元时,不必使用引号;这个函数自动求值.
F$DIRECTORY函数的结果必须在F$LENGTH函数可以确定其长度之前返回.
然后,F$LENGTH函数确定默认目录的长度,并且包括方括号.
12.
8.
5操作次序一个表达式可以包含很多运算和比较.
如果在表达式中有两个或更多运算符时它们的求值次序见下表.
运算符列出次序从最高优先权到最低优先权;即是说,在表顶部的运算符在底部的运算符之前执行.
优先权运算7一元加(+)和一元减(-)6乘法(*)和除法(/)5字符串加(串联)和减(缩减)4所有数字和字符比较3逻辑.
NOT.
操作2逻辑.
AND.
操作1逻辑.
OR.
操作如果表达式包含具有同样优先权次序的运算符,那么运算是从左至右执行.
把要先执行的运算放入圆括号内,可以取代正常的优先权次序(运算和比较求值的次序).
圆括号也可以嵌套.
在以下例子中,圆括号强制加法在乘法之前执行.
如果不用圆括号,那么乘法先执行,结果是26:$RESULT=4*(6+2)$SHOWSYMBOLRESULTRESULT=32Hex=00000020Octal=0000000004012.
8.
6求值的数据类型DCL对符号的求值结果是字符串或者是整数值.
符号的数据类型(字符或整数)由当前赋值的数据类型确定.
其数据类型不是永久的:如果值更改了数据类型,那么符号也更改其数据类型.
表达式可以有整数或字符串值,这取决于值的类型和使用的运算符,.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在以下例子中,局部符号NUM先赋予一个字符值,然后当赋值一个整数表达式时转换为一个整数值:$NUM="ABC"$NUM=2+5以下表格概述DCL如何对表达式求值.
第一列列出表达式可以包含的不同值和运算符.
对于每种情况,第二列告诉整个表达式等于什么.
在表中,任何值代表字符串或整数.
表达式结果值类型整数值整数字符串值字符串整数词法函数整数字符串词法函数字符串整数符号整数字符串符号字符串+、-或.
NOT.
任何值整数任何值.
AND.
或.
OR.
任何值整数字符串+或-字符串字符串整数+或-任何值整数任何值+或-整数整数任何值*或/任何值整数任何值(字符串比较)任何值整数任何值(数字比较)任何值整数12.
9在表达式中转换值的类型在DCL可以求值表达式之前,在表达式中的所有操作数必须具有同样的值数据类型.
值有字符串或整数数据类型.
字符串数据包括字符串、带字符串值的符号和返回字符串值的词法函数.
整数数据包括整数、带整数值的符号和返回整数值的词法函数.
当表达式包含数和字符串操作数时,DCL把所有字符串转换为整数,或者把所有整数转换为字符串.
一般而言,如果使用字符串和整数值,那么字符串值转换为整数.
唯一的例外是当DCL执行字符串比较时.
在这些比较中,整数转换为字符串.
另外,以下词法函数确定或更改表达式的值:F$TYPE---确定符号的当前值类型UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumF$INTEGER---把字符串表达式转换为整数值F$STRING---把整型表达式转换为字符串值12.
9.
1把字符串转换为整数按以下方法把字符串转换为整数:包含数的字符串转换为它们的整数值.
例如,字符串"45"转换为整数45.
如果字符串从T、t、Y或y开始,那么将它转换为整数1.
如果字符串从任何其他字母开始,则将它转换为整数0.
下表展示字符串转换为整数值的例子:字符串作为结果的整数"123"123"12XY"0(假)"Test"1(真)"hello"0(假)12.
9.
2把整数转换为字符串当整数被转换为字符串时,作为结果的字符串包含对应于整数值的数.
下表展示整数如何被转换为字符串值:整数作为结果的字符串123"123"1"1"0"0"12.
10理解符号表符号存储在局部或全局符号表,它们由操作系统维护.
12.
10.
1局部符号表DCL维护一个局部符号表,用于您的主要进程和当执行一个命令过程、使用CALL命令或提交批量作业时建立的每个命令级.
当建立局部符号时,DCL把符号放入当前命令级的局部符号表.
在命令级的整个活动期间,DCL为这个命令级维护这个局部符号表;当一个命令级不再活动时,它的局部符号表(和它包含的所有符号)被删除.
有关进程、命令过程和批量作业的详情,请参阅第16章.
除您建立的局部符号之外,局部符号表包含DCL维护的8个符号.
这些符号,命名为P1、P2,以此类推,直至P8,用于传送参数给命令过程.
传送给命令过程的参数被当作字符串.
否则,P1至P8定义为空字符串("").
它们存储在局部符号表中.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum12.
10.
2全局符号表DCL在进程期间只维护一个全局符号表,并把所有全局符号放入这个表中.
除您建立的全局符号之外,全局符号表包含保留的全局符号.
这些全局符号给出有关程序和命令过程以及系统指令和公用程序的状态信息.
$STATUS保留的全局符号$STATUS是大多数最近执行命令返回的条件代码.
符号$STATUS符合OpenVMS操作系统消息代码的格式.
应用程序把一个参数值包括在EXIT命令中,可以设置全局符号$STATUS的值.
系统使用$STATUS的值确定显示哪一条消息(如果存在),并确定是否在下一个更高命令级继续执行.
$STATUS最低三个位的值放入全局符号$SEVERITY中.
$SEVERITY保留的全局符号$SEVERITY是大多数最近执行命令返回的条件代码的严重级.
符号$SEVERITY等于$STATUS最低三个位,可以有以下值:0警告1成功2出错3信息4严重的(致命)出错$RESTART保留的全局符号如果一个批量作业因系统失败中断后重新启动,那么$RESTART有值TRUE.
否则,$RESTART有值FALSE.
12.
10.
3符号表搜索次序当命令解释程序确定一个符号的值时,它按以下次序搜索符号表:1.
当前命令级的局部符号表2.
每个上一命令级的局部符号表,当前级向后搜索3.
全局符号表12.
11屏蔽符号的值以下几节描述如何屏蔽值符号.
12.
11.
1SETSYMBOL命令UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum按照默认,所有符号(全局和局部)定义在内部过程级可存取的外部命令过程级.
然而,使用SETSYMBOL命令,可以把命令过程的局部或全局符号从其他命令过程定义的符号隔离出来.
SETSYMBOL命令屏蔽局部和全局符号的值,而不删除它们.
因而,如果一个命令过程执行另一个命令过程,并且在第二个过程中指定SETSYMBOL命令,您就可以在两个过程中使用同样的符号名.
SETSYMBOL命令也控制DCL是否在处理命令行之前尝试把动词字符串(在命令行中的第一个字)翻译为一个符号.
其默认行为是尝试翻译.
更改这个行为的优点是当一个命令过程调用一个命令时,它不会受到外部过程级环境的影响.
12.
11.
2符号作用域状态符号作用域对局部符号和全局符号是不同.
当您退出一个过程级返回到上一个过程时,就为局部符号和全局符号恢复上一级符号作用域上下文.
要显示当前、一般的符号作用域状态,使用词法函数F$ENVIRONMENT("SYMBOL_SCOPE").
要显示当前动词作用域状态,使用词法函数F$ENVIRONMENT("VERB_SCOPE").
局部符号作用域局部符号依赖于过程级.
如果在外部过程级定义一个局部符号,这个符号可以在任何内部过程级被读取(而不是写入).
如果把一个值赋给一个外部过程级的局部符号,就在当前过程级建立一个新符号.
然而,在外部过程级的这个符号没有被修改.
SETSYMBOL/SCOPE=NOLOCAL命令使当前过程级和任何内部级不可存取定义在外部过程级的所有局部符号.
例如,如果在过程级2和4指定SETSYMBOL/SCOPE=NOLOCAL,那么:过程级2只可以读取和写入级2的局部符号.
过程级3可以读取(但是不能写入)级2的局部符号.
级3也可以读取和写入级3的局部符号.
过程级4只可以读取和写入级4的局部符号.
全局符号作用域全局符号与过程级无关.
当前全局符号作用域上下文以后可应用于所有过程级.
/SCOPE=NOGLOBAL限定词使所有后续命令不可存取所有全局符号,直到指定/SCOPE=GLOBAL限定词或者退出这个过程到可存取全局符号的上一级.
另外,指定/SCOPE=NOGLOBAL限定词使您不能建立任何新的全局符号,直到指定/SCOPE=GLOBAL限定词.
12.
12理解符号替换在某些上下文中,DCL把其字符开始于字母的字符串用作一个符号名或词法函数.
在这些上下文中,DCL尝试用替换符号或词法函数的值来替换它的符号或词法函数.
用符号的当前值替换该符号,称UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum为符号替换.
如果在任何其他上下文中使用符号或词法函数,那么必须使用一个替换运算符来请求符号替换.
当符号和词法函数用作如下情况时,DCL自动对它们求值:在赋值(=)语句的右边在词法函数的变元中在DEPOSIT、EXAMINE、IF或WRITE命令中在命令行的开始,而这个字符串后面没有一个等号或冒号当执行子串替换或数字覆盖时,在赋值语句左边的中括号内(请参阅12.
6.
5节)在以下例子中,命令解释程序把开始于字母字符的任何字符串用作一个符号名,而把开始于数字或带基数运算符(%)的任何字符串用作一个文字数值.
在以下例子中,COUNT被自动识别并求值为一个符号:$TOTAL=COUNT+1在这个例子的第二行中,当符号QUERY与F$LENGTH函数一起使用时它被自动求值.
另外,因为F$LENGTH函数是在赋值语句的右边,因此自动对它求值:$QUERY="Havewemetbefore"$LEN=F$LENGTH(QUERY)+5$SHOWSYMBOLLENLEN=27Hex=0000001BOctal=000033在以下例子中,IF命令把A和B用作符号名,并使用它们的当前值:$IFA.
EQ.
BTHENWRITESYS$OUTPUT"DONE"在这个例子的第二行中,命令解释程序自动用PDEL的当前值替换PDEL,并执行作为结果的命令:$PDEL="DELETESYS$PRINT/ENTRY="$PDEL181在以下例子中,DCL自动把符号BELL定义为值7,然后基于在赋值语句左边括入中括号内的值赋予一个新值.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$BELL=7$BELL[5,1]=1$SHOWSYMBOLBELLBELL=39Hex=00000027Octal=0000000004712.
12.
1强制符号替换要强制替换不在所列位置的符号,把这个符号括入省略号(')内,如下所示:$TYPE'B'要强制替换在引用字符串内的符号,在这个符号之前放置两个省略号(')并后跟单个省略号('),如下所示:$T="TYPE''B'"处理一个命令行时,DCL按以下次序用它们的值替换符号:强制替换从左至右,DCL替换用省略号定界的所有字符串(或者对于在引号内的字符串使用双省略号).
前面加上单个省略号的符号被迭代翻译;而对于前面加上双省略号的符号则不必.
自动替换从左至右,DCL求出命令行中的每个值,如果它是命令就执行它,而如果它是表达式就求出它的值.
表达式中的符号被替换为它们的赋予值;这个替换不是迭代的.
以下例子示范DCL符号替换次序的效果.
首先,定义符号PN、FILE1和NUM:$PN="PRINT/NOTIFY"$FILE1="[BOLIVAR]TEST_CASE.
TXT"$NUM=1给出上述符号定义后,以下命令打印文件[BOLIVAR]TEST_CASE.
TXT:$FILE="'FILE''NUM''"$PN'FILE'在第一个命令中,强制替换使NUM成为1,使FILE''NUM'成为FILE1.
如果输入命令SHOWSYMBOLFILE,可看到FILE="'FILE1'".
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum第二个命令执行两个替换.
首先,'FILE'被'FILE1'替换.
'FILE1'也需要替换,因为它括入省略号(')内.
自动替换使FILE1成为[BOLIVAR]TEST_CASE.
TXT.
然后,这个文件名附加到PN的值,即PRINT/NOTIFY.
作为结果的字符串如下所示:$PRINT/NOTIFY[BOLIVAR]TEST_CASE.
TXT12.
12.
2符号替换运算符在DCL通常不执行符号替换的位置,可以使用替换运算符请求符号替换.
DCL接受两个替换运算符:省略号(')和号(&)这两个运算符的差别是发生替换的时间.
前面加上省略号的符号在DCL命令处理的第一个阶段替换;而前面加上和号的符号在第二个阶段替换.
有关命令处理阶段的详情,请参阅12.
13节.
省略号(')省略号(')是最频繁使用的替换运算符.
当您使用符号代替命令参数或限定词时,使用它可请求符号替换.
在字符串赋值(:=)语句的右边使用省略号可请求符号替换.
要在引用字符串内请求符号替换,把两个省略号放在符号名之前并把一个省略号放在它的后面.
当使用省略号请求符号替换时,不能在被替换值的中间续行(使用连字号使字符续行).
在以下例子中,TYPE命令需要一个文件说明.
省略号指出LIT是一个必须求值的符号.
如果省略这个省略号,那么DCL寻找一个称为LIT.
LIS的文件(.
LIS是TYPE命令的默认文件类型):$LIT="LIGHT.
BILLS"$TYPE'LIT'在以下例子中,NAME的值被替换,以便FILE成为REPORT.
DAT:$NAME:=REPORT$FILE:='NAME'.
DAT$SHOWSYMBOLFILEFILE="REPORT.
DAT"在以下例子中,符号NAME的当前值是FRED:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$MESSAGE="Creatingfile''NAME'.
DAT"因此,MESSAGE有以下值:CreatingfileFRED.
DAT和号(&)和号(&)也是一个命令解释程序能够识别的替换运算符.
在很多情况下,省略号与和号执行同样的功能.
当和号与省略号一起使用来影响替换执行的次序时,和号是更有效的替换运算符.
当符号未定义时命令解释程序采取的动作依赖于命令的上下文.
有关详情,请参阅12.
13.
5节.
这里展示的第一个命令中,命令处理的第一个阶段(扫描),命令解释程序用其当前值替换符号名.
命令处理的第二个阶段(分析),第二个命令用其当前值替换符号名.
尽管方法不同,但结果一样:$TYPE'NAME'$TYPE&NAME在以下例子中,和号(&)与省略号一起使用来影响替换次序:$P1="FRED.
DAT"$COUNT=1$TYPE&P'COUNT'首先,命令解释程序对括入省略号内的符号('COUNT')求值.
其结果如下所示:TYPE&P1其次,命令解释程序对前面加上和号的符号(P1)求值.
其结果如下所示:TYPEFRED.
DAT在以下例子中,省略号与P和COUNT一起使用:$TYPE'P''COUNT'UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum从左至右进行处理,命令解释程序尝试求出P的值.
因为P是没有定义的符号,因此DCL给它一个空值.
然后,它求出符号COUNT的值.
其结果如下所示:TYPE1在以下例子中,A等于B的当前值:$B="MYFILE.
DAT"$A="&B"$TYPE'A'当和号(&)用在引号("")内时,它不引起符号替换.
因此,赋值时,不替换B的值.
然而,TYPE命令显示MYFILE.
DAT.
因为命令解释程序首先把A替换为值&B,因此发生这种情况.
然后,它把符号&B替换为MYFILE.
DAT.
如果重新定义了B,那么TYPE命令的结果将因此更改.
使用和号时要遵守以下规则:把和号放在符号名之前,而不是之后.
和号必须跟随一个定界符(任何空白或特殊字符).
不能使用和号来请求替换括入引号("")内的字符串.
不能使用和号来连接两个或更多的符号名.
一般而言,在符号替换时不要使用和号,除非必需正确地翻译符号.
12.
13命令处理程序的三个阶段命令解释程序分三个阶段执行符号替换.
12.
13.
1第一阶段:命令输入扫描命令输入扫描(也称为词法输入阶段),命令解释程序从左至右对前面加上省略号的符号求值.
前面加上单个省略号符号被迭代翻译,如在第一阶段替换所述.
前面加上两个省略号的符号不被迭代翻译.
12.
13.
2第二阶段:命令分析在命令分析阶段中:命令解释程序分析命令行.
它检查命令行中的第一个项目,查看它是否是一个符号.
如果它是,就求出它的值.
命令解释程序从左至右对前面加上和号的符号求值.
在这个阶段的符号替换是不迭代的.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum12.
13.
3第三阶段:表达式求值在表达式求值阶段:命令解释程序对前面加上DEPOSIT、EXAMINE、IF和WRITE命令的符号求值.
命令解释程序对在词法函数中的符号求值.
在这个阶段的符号替换是不迭代的.
注意,命令解释程序不扫描被命令或在命令过程中执行的程序读取为输入数据的任何行.
因此,命令解释程序不在这些数据行中执行符号替换.
在以下例子中,程序AVERAGE从SYS$INPUT(命令输入流)读取55、57和9999.
命令解释程序从不读取这些数据行.
如果输入符号名作为输入,则对它们不求值:$RUNAVERAGE5557999912.
13.
4重复和迭代替换符号替换可以重复或迭代:重复替换是指在单个命令行中发生一个以上类型的替换.
迭代替换是指命令解释程序查看替换的值本身是否是一个符号.
只在命令处理的第一个阶段翻译前面加上省略号的符号时,才发生迭代替换.
第一阶段替换使用省略号(')请求符号替换时,命令解释程序在命令处理的第一个阶段执行迭代替换.
当符号包括在引用字符串内时,使用省略号的替换不迭代.
在以下例子中,替换是迭代的:$MAC="5"$A="'MAC'"$B='A'$SHOWSYMBOLBB=5Hex=00000005Octal=00000000005在语句B='A'之后,符号B的结果值是5,因为:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum符号名A括入省略号内,因而用它的当前值('MAC')替换它.
因为这个值('MAC')也括入省略号内,因此命令解释程序用它的当前值(5)替换MAC.
因为这个值(5)没有省略号,因此命令处理的第一个阶段就结束.
没有必要在第二或第三阶段进行进一步的替换.
因此,5是符号名B的最后值.
然而,要注意在引用字符串中包括A的情形:$B="''A'"$SHOWSYMBOLBB="'MAC'"在这种情况下,B有值'MAC'.
因为在引用字符串中替换是不迭代的,因此符号名A只替换一次.
第二阶段替换只当省略号在命令行中时,命令解释程序才自动执行迭代替换.
有些情况下,您可能要嵌套命令同义字定义.
在以下例子中,处理EXEC时,命令解释程序只执行替换一次:$MAC="TYPEA.
B"$EXEC="'MAC'"$EXEC其结果是字符串'MAC'.
因为MAC不被识别为一个命令,因此命令解释程序显示一条出错消息.
因为在命令处理的第一个阶段,没有替换被执行(字符串EXEC没有被省略号定界),因此发生这个出错.
在第二个阶段,因为EXEC是命令行的第一个值,因此字符串'MAC'被替换为EXEC.
这个替换不是迭代的.
因此,即使用省略号定界'MAC',也不执行附加的替换.
要正确地使用命令同义字EXEC,把它括入省略号内:$'EXEC'在这种情况下,在命令处理的第一个阶段对符号EXEC求值.
因为这个替换是迭代的,因此('MAC')也被求值,并且替换为字符串TYPEA.
B.
第三阶段替换当命令解释程序分析命令中的表达式时,在表达式中指定的任何符号只替换一次.
然而,可以在表达式中使用省略号或和号,强制迭代替换.
以这种方法强制迭代替换时,必须记住以下规则:在执行命令字符串之前,命令解释程序执行省略号和和号请求的所有替换.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在命令处理的第一个和第二个阶段之后,自动执行符号替换的命令做这件事.
然而,要注意,如果替换的结果不是一个有效符号名,那么这个命令将失败.
以下例子展示IF命令中的迭代替换:$P1="FRED.
DAT"$COUNT=1$IFP'COUNT'.
EQS.
""THENGOTOEND当命令解释程序扫描这个命令行时,用它的当前值替换符号COUNT.
其结果如下所示:IFP1.
EQS.
""THENGOTOEND因为这个字符串没有省略号,因此命令解释程序不执行任何其他替换.
然而,当IF命令执行时,它自动对符号名P1求值并把它替换为它的当前值.
在以下例子中,符号名FILENAME无效:$FILENAME="A.
B"$IF'FILENAME'.
NES.
""THENTYPE'FILENAME'命令解释程序把符号FILENAME替换为它的当前值(A.
B).
其结果如下所示:IFA.
B.
NES.
""THENTYPEA.
B当IF命令执行这个命令行时,因为A.
B不是一个有效符号而出错.
要正确地处理这个IF命令,可省略这个省略号,如下所示:$IFFILENAME.
NES.
""THENTYPE'FILENAME'12.
13.
5未定义的符号如果在命令行中使用的符号没有定义,命令解释程序或者显示一条出错消息,或者用空串替换这个符号,视上下文而定.
其规则如下:在命令处理的第一个和第二个阶段,命令解释程序用空串替换所有前面加上省略号或和号的未定义符号.
在命令处理的第三个阶段,如果命令解释程序发现一个未定义符号,它就显示一条警告消息并且不完成处理.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum以下例子展示命令解释程序如何处理前面加上省略号的未定义符号:$FILE:=MYFILE'FILE_TYPE'$SHOWSYMBOLFILEFILE="MYFILE"$PRINT'FILE'建立符号FILE时,符号FILE_TYPE被替换为它的当前值.
如果FILE_TYPE没有定义,那么命令解释程序用一个空串替换FILE_TYPE.
在文件说明中缺少文件类型使PRINT命令使用默认文件类型.
LIS.
因而,这个文件说明被解释为MYFILE.
LIS.
在以下例子中,表达式在命令处理的第三个阶段求值:$A=1$C=A+B%DCL-W-UNDSYM,undefinedsymbol-checkvalidityandspelling符号B是未定义的,因而命令解释程序不能对这个表达式求值.
12.
14使用符号的备用方法:自动外部命令不用为过程定义符号,也可以从DCL级调用一个命令过程(.
COM文件类型)或可执行映象(.
EXE文件类型).
使用自动外部命令,DCL可以搜索特定目录集来查找命令过程或可执行映象,并自动运行它.
输入的命令动词不是一个DCL符号并且不在DCL命令表中时,系统通常显示以下消息:DCL-W-IVVERB,unrecognizedcommandverb-checkvalidityandspelling然而,如果逻辑名DCL$PATH已定义(并且不是空白),那么DCL就执行RMS$SEARCH查找其文件名包含无效动词的任何文件,并且把DCL$PATH:.
*用为默认文件说明.
如果DCL查找到一个.
COM或.
EXE文件,那么DCL将自动执行那个文件,并且把命令行的其余部分作为它的参数.
(这个行为类似于DOS、UNIX和其他操作系统的PATH任选项.
)在以下例子中,不再需要DCL符号SYSGEN.
DCL查看SYS$SYSTEM目录并查找SYSGEN.
EXE.
DCL的这种形为就象符号"SYSGEN"被定义为"$SYS$SYSTEM:SYSGEN",它把SYSGEN映象激活为一个外部命令.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$SYSGEN%DCL-W-IVVERB,unrecognizedcommandverb-checkvalidityandspelling\SYSGEN\$DEFINEDCL$PATHSYS$SYSTEM,SYS$DISK:[]FOO$SYSGENSHOWMAXPROCESSCNTParameterNameCurrentDefaultMin.
Max.
UnitDynamicMAXPROCESSCNT15732128192Processes在以下例子中,SS不必定义为"@SS.
COM",因为DCL将自动搜索SYS$SYSTEM目录来查找SS.
COM或SS.
EXE.
如果失败,DCL就搜索当前目录来查找SS.
COM或SS.
EXE.
$TYPESS.
COM$SHOWSYMBOL/LOCAL/ALL$EXIT$SS"Thisisaparameter"P1="Thisisaparameter"P2=""P3=""P4=""P5=""P6=""P7=""P8=""$SS.
EXE"Thisisaparameter"P1=".
EXE"P2="Thisisaparameter"P3=""P4=""P5=""P6=""P7=""P8=""在这个例子中,DCL找出SS.
COM,其行为就象"SS"已被定义为"@SS.
COM"的符号.
激活的命令过程把命令行的其余部分分析为参数.
注意,"SS.
EXE"不调用映象SS.
EXE,而是用两个参数来调用SS.
COM,其中第一个是文本串".
EXE".
这与OpenVMS操作系统执行命令分析和符号替换的方法一致.
12.
14.
1使用自动外部命令注意以下:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum逻辑名DCL$PATH可以是搜索列表类型逻辑.
只使用每个逻辑名翻译的节点、设备和目录部分.
发生正常的逻辑优先.
通过用户自己的定义,用户可以取代DCL$PATH的系统定义.
如果系统定义存在,而用户不想要这个特性,那么用定义""取代这个逻辑而关掉它.
DCL动词和符号名的有效字符集不同于文件名的有效字符集.
例如,DCL符号不能包含连字号(-)或开始于美元符($).
如果希望执行的映象或过程不是有效的DCL符号名,那么不能通过这个新特性直接调用它.
DCL不分析这个命令.
它让被调用的映象执行自己的命令分析.
对于C程序,使用main()例行程序的"argc"和"argv"参数.
对于用其他语言编写的程序,调用LIB$GET_FOREIGN可获得整个命令行,然后该程序必须分析它.
如果一个目录包含命令过程和可执行映象,那么将调用第一个查找到的文件.
在OpenVMS系统上,目录按字母顺序编目文件,因而将在".
EXE"文件之前找到".
COM"文件.
如果在DCL$PATH逻辑名中有一个指向运行其他操作系统节点的网络文件说明,则可能在".
COM"文件之前找到".
EXE"文件.
因为DCL执行搜索时把无效动词用作文件说明并把"DCL$PATH:.
*"使用为默认文件说明,因此可能以这种查找特定文件的方法定义逻辑名.
例如,如果把逻辑名FOO定义为"FOO.
EXE",并且在DCL提示下键入"FOO",那么就决不能调用FOO.
COM,而只能是FOO.
EXE.
警告如果您是特权用户,并且把您的默认设备和目录设置为其他用户帐户,就不要把"SYS$DISK:[]"放入DCL$PATH逻辑名的定义中.
这样做将使DCL搜索当前目录,在那里搜索列表中的排字错误或不恰当地放置翻译将使当前目录的用户映象被发现,而被错误地以特权调用.
12.
14.
2自动外部命令限制注意以下限制:在OpenVMS操作系统V6.
2之前的任何版本中,不能使用自动外部命令.
因为新动词可以在任何时候都添加到DCL命令表,使用自动外部命令的命令以后某一天或许不能使用.
自动外部命令特性不是在所有情况下都能正常工作.
在以下例子中,DCL(只看任何动词的前四个字符)查找匹配SHOW动词(SHOWME的前四个字母)并执行SHOWUSERS命令来代替SHOWME.
COM过程.
如果把SHOWME定义为DCL符号,那么SHOWME命令将调用SHOWME.
COM.
$DEFINEDCL$PATHSYS$SYSTEM,SYS$DISK:[]FOO$TYPESHOWME.
COM$SHOWSYMBOLP1$EXIT$SHOWMEUSERSUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumOpenVMS用户进程在MARCH2,199901:40PM用户总数=1,进程数=11用户名交互子进程批量RSMITH92第13章介绍命令过程命令过程是一个包含DCL命令和DCL命令使用的数据行的文件.
有些简单命令过程可以只包含一个或两个DCL命令;复杂的命令过程可以象复杂的计算机程序一样运行.
当命令过程运行时,DCL解释程序读取文件并执行它包含的命令.
如果系统管理员已设置一个系统注册命令过程,注册时它就执行.
系统注册命令过程让系统管理员确保当您和其他用户注册系统时总要执行的某些命令.
在运行系统注册命令过程后,系统运行您的个性化注册命令过程(如果存在).
个性化注册命令过程让您用户化计算环境.
每次注册时就执行它包含的命令.
注册时,系统可自动执行至多两个注册命令过程(全系统的注册命令过程和您自己的注册命令过程,如果存在).
为您设置帐户的人可以把注册命令过程放入您的顶级目录.
如果注册命令过程不在您的顶级目录,那么您自己可以建立一个.
把它命名为LOGIN.
COM并把它放入您的顶级目录.
除非系统管理员告诉您其他情况,否则注册时将运行您建立的LOGIN.
COM文件.
本章分为以下几节:编写命令过程的基本信息编写命令过程的步骤执行命令过程退出、中断和出错处理命令过程注册命令过程有两类DCL命令过程:简单按编写次序执行一串DCL命令复杂执行类似程序的功能13.
1编写命令过程的基本信息有两种方法建立命令过程:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum使用文本编辑程序,例如EVE,建立新文件使用DCL命令CREATE建立新文件建立的文件可以包含命令行、标号、注释、条件语句和变量.
13.
1.
1默认文件类型命令过程的默认文件类型是.
COM.
命名命令过程时,如果指定.
COM文件类型,那么只指定文件名就可以执行这个过程.
SUBMIT和执行过程(@)命令假定文件类型是.
COM,除非指定其他.
13.
1.
2编写命令以下是在命令过程中包括命令的建议:使用命令和限定词的完整名称.
这将有助于确保命令过程与OpenVMS的将来发行版本兼容.
使用续行使过程易于阅读.
注意,续行不能从美元符开始.
例如:$PRINTLAB.
DAT-/AFTER=17:00-/COPIES=20-/NAME="COMGUIDE"13.
1.
3编写命令行编写命令行时:必须使用一个美元符($)开始每一行,包含命令、注释或标号.
如果想要包括一个包含数据的行,那么在该行省略美元符($).
如果需要包括从一个美元符($)开始的数据行,使用DCL命令DECK和EOD.
例如:$!
EverythingbetweenthecommandsDECKandEOD$!
iswrittentothefileWEATHER.
COM$!
$CREATEWEATHER.
COM$DECK$FORTRANSUMMER$LINKSUMMER$RUNSUMMER$EOD$!
$!
NowexecuteWEATHER.
COM$@WEATHER$EXITUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum注意,不从一个美元符开始的命令行可以被DCL正确地解释,但是Compaq强烈建议任何DCL命令行从一个美元符开始.
13.
2在命令行中使用标号在DCL命令过程中,标号用于标记循环、代码段或子例行程序的开始.
使用标号时,注意以下规则:把标号放在单独一行,使循环、子例行程序和条件代码更明显.
使用包含少于255个字符并且没有空白空格的标号名.
把标号放在美元符($)之后并且把若干空格放在命令之前,可把标号与命令区别开来.
用一个冒号结束每个标号.
不能删除标号.
13.
2.
1局部符号表中的标号当命令解释程序遇到标号时,它把标号放入局部符号表的特殊节.
标号可用的空间是有限的.
如果一个命令过程使用许多符号,并且包含许多标号,那么命令解释程序可能用完符号表的空间而发出一条出错消息.
如果发生这种情况,就在您的过程中包括DELETE/SYMBOL命令删除不再需要的符号.
(然而,要注意不能删除标号.
)13.
2.
2重复标号如果命令过程使用同一标号一次以上,新定义就会替换局部符号表中的现有一个.
当重复标号存在时,GOTO命令把控制传递给DCL最近处理的标号.
处理重复标号时,GOTO命令也使用以下规则:如果所有重复标号在GOTO命令之前,就把控制传递给离GOTO命令最近的标号.
如果GOTO命令在重复标号之间,把控制传递给前面的离GOTO命令最近的标号.
如果所有重复标号在GOTO命令之后,把控制传递给离GOTO命令最近的标号.
13.
3在命令过程中使用注释把注释包括在命令过程中是好的编程习惯.
当更新命令过程或解决故障时,注释是有用的.
注释用途如下:在过程的开始描述过程和传递给它的参数.
在每块命令的开始描述这段过程.
使用包含美元符和感叹号($!
)的行分开命令序列.
这使它易于阅读命令过程的大纲.
如果插入空白行,那么命令解释程序就把它们解释为数据行,并且产生一条消息警告您这个数据行已被忽略.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在命令过程中编写注释时应用以下规则:使用感叹号(!
)指出注释的开始;命令过程执行时,命令解释程序忽略感叹号右边的所有文本.
要把文字感叹号包括在命令行中,把感叹号括入引号("")内.
13.
4如何编写命令过程在开始编写命令过程之前,交互地执行命令过程将要执行的任务.
键入必要的命令时,注意使用的任何变量和条件,和出现的任何循环.
以下几节包含编写简单命令过程的步骤.
在这些节中使用的例子是命令过程CLEANUP.
COM.
这个过程可以用来清除目录.
定义变量每次执行任务更改的数据.
条件可以变化的任何一个或一组命令,因此每次执行任务时必须测试.
循环重复执行直到满足条件的任何一个或一组命令.
13.
5编写命令过程的步骤遵循以下步骤编写命令过程:步骤任务1设计命令过程.
2赋值变量和测试条件.
3添加循环.
4结束命令过程.
5测试和调试程序逻辑.
6添加清除任务.
7完成过程.
13.
5.
1第1步:设计命令过程遵循以下步骤设计命令过程:步骤任务1决定过程将执行什么任务.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum2确定命令过程将要使用的任何变量,以及如何装入.
3确定命令过程需要什么条件,以及如何测试.
4决定如何退出命令过程.
某些命令通常是在清除操作期间执行.
下表列出这些命令和它们执行的任务:命令执行的任务DIRECTORY显示当前目录的内容TYPEfilespec显示文件PURGEfilespec清除文件DELETEfilespec删除文件COPYfilespecnew-filespec复制文件变量当执行任务时更改的任何数据是变量.
如果在您的目录中建立或删除文件,那么每次清除目录时,文件名是不同的;因此,在CLEANUP.
COM中的文件名是变量.
条件每次执行命令过程时必须测试的任何命令被认为是条件语句.
因为依赖于需要执行的操作,在CLEANUP.
COM中的任何或所有命令也许执行,因此每个命令是条件语句.
设计决定确定将在CLEANUP.
COM命令过程使用什么变量和条件之后,必须决定如何装入变量、测试条件和退出命令过程.
对于CLEANUP.
COM命令过程,作出以下决定:任务如何完成装入变量命令过程从终端获得文件名.
测试条件命令过程:从终端获得命令名,并基于命令名执行适当的语句.
确保读入每个命令名的前两个字符,以区别DELETE和DIRECTORY命令.
退出循环必须输入EXIT命令退出循环.
要使命令过程易于理解和维护,编写语句时使过程的执行从第一个命令到最后一个命令.
13.
5.
2第2步:变量赋值和条件测试UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum有许多方法赋值给变量.
本节论述如何使用INQUIRE命令.
有关其他方法,请参阅第14章.
遵循以下步骤赋值给变量和测试条件:步骤任务1使用INQUIRE命令赋值给变量.
2确定应该采用哪个动作.
3使用IF和THEN语句测试条件.
4编写程序桩,并把它插入到命令过程作为命令的占位符.
5如果必要,编写出错消息.
13.
5.
2.
1使用INQUIRE命令INQUIRE命令提示一个值、从终端读取这个值并把这个值赋予一个符号.
按照默认,INQUIRE命令:把回答转换为大写字母用单个空格替换多个空白和制表符除去前导和尾随空格如果应答包括符号或词法函数,就执行符号替换在CLEANUP.
COM中使用的以下命令行提示用户输入一个命令名.
INQUIRE命令把输入的值赋予符号COMMAND.
$INQUIRECOMMAND-"Entercommand(DELETE,DIRECTORY,PRINT,PURGE,TYPE)"13.
5.
2.
2保留文字字符当使用INQUIRE命令时要保留小写字母字符、多个空格和制表符,把应答括入引号("")内.
要把引号包括在应答中,就把引用的文本括入引号(""text"")内.
13.
5.
2.
3使用IF和THEN测试条件在INQUIRE命令提示输入变量后,命令过程必须包括一个语句确定要采取什么动作.
例如,要确定执行哪个命令,必须在命令过程中包括一些语句,从每个可能命令中识别用户输入的命令.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum要测试一个条件是否为真,使用IF和THEN命令.
下表展示必须在CLEANUP.
COM中检查的可能性:If.
.
.
Then.
.
.
找到一个匹配,执行这个命令.
没有找到一个匹配,继续下一个命令.
在检查所有有效命令后没有找到一个匹配,输出一条出错消息.
13.
5.
2.
4编写程序桩程序桩是一个在测试设计时过程中使用的临时代码段.
通常,程序桩输出一条消息声明它替换的函数.
在全部设计工作都正确后,用正确的编码替换每个桩.
例子:赋值变量和测试条件以下例子展示如何赋值变量和测试条件:$INQUIRECOMMAND-"Entercommand(DELETE,DIRECTORY,EXIT,PRINT,PURGE,TYPE)"$IFCOMMAND.
EQS.
"EXIT"THENEXIT$!
$!
ExecuteifuserenteredDELETE$DELETE:$IFCOMMAND.
NES"DELETE"THENGOTODIRECTORY(1)(2)$WRITESYS$OUTPUT"ThisistheDELETEsection.
3)$!
ExecuteifuserenteredDIRECTORY$DIRECTORY:4)$IFCOMMAND.
NES"DIRECTORY"THENGOTOPRINT$WRITESYS$OUTPUT"ThisistheDIRECTORYsection.
".
.
.
$!
ExecuteifuserenteredTYPE$TYPE:$IFCOMMAND.
NES"TYPE"THENGOTOERROR(5)$WRITESYS$OUTPUT"ThisistheTYPEsection.
"$!
$ERROR:$WRITESYS$OUTPUT"Youhaveenteredaninvalidcommand.
"(6)$!
$EXITUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum当您检查这个例子时,注意以下各点:1.
这个IF语句测试查看用户输入的命令(COMMAND)是否等于"DELETE".
如果COMMAND等于DELETE,那么这个命令过程执行下一个命令.
2.
这个语句也包括一个GOTO命令.
GOTO命令用来把执行流更改到这个过程的标号.
在这种情况下,如果COMMAND不等于DELETE,那么过程将执行DIRECTORY标号.
3.
这个语句是程序桩.
在命令过程逻辑被测试之后,这行将用DELETE操作需要的实际命令替换.
4.
这是DIRECTORY子例行程序的标号.
注意,标识每个命令块的标号与在任选项列表中的命令一样.
这允许您在GOTO语句中使用符号COMMAND(它等于用户的请求).
5.
这个IF语句测试是否输入了"TYPE"命令.
如果输入了"TYPE",则这个过程将输出"ThisistheTYPEsection".
然而,因为这个是您测试的最后命令,如果输入的命令不是"TYPE",程序将显示一条出错消息.
6.
如果测试了所有命令,并且没有找到有效的命令名,程序将输出"Youhaveenteredaninvalidcommand".
13.
5.
3第3步:添加循环循环是重复执行直到满足条件的一组语句.
循环操作如下所示:1.
从用户输入获得值2.
处理命令3.
重复处理,直到用户退出命令过程要编写循环,遵循这个过程:步骤动作1从标号开始循环.
2测试变量,确定是否需要执行循环中的命令.
3如果不需要执行循环,则前去循环的末端.
4如果需要执行循环,则执行在循环体中的命令,然后返回到循环的开始.
5结束循环.
以下例子展示CLEANUP.
COM命令过程中的循环使用:$GET_COM_LOOP:$INQUIRECOMMAND-$"Entercommand(DELETE,DIRECTORY.
EXIT,PRINT,PURGE,TYPE)"$IFCOMMAND.
EQS.
"EXIT"THENGOTOEND_LOOP$!
$!
ExecuteifuserenteredDELETEUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$DELETE:$IFCOMMAND.
NES.
"DELETE"THENGOTODIRECTORY$WRITESYS$OUTPUT"ThisistheDELETEsection.
"$GOTOGET_COM_LOOP.
.
.
$END_LOOP:$WRITESYS$OUTPUT"Directory''F$DIRECTORY()'hasbeencleaned"$EXIT一旦命令执行,控制就传递回GET_COM_LOOP标号,直到用户输入EXIT命令.
当输入EXIT命令时,这个过程输出一条消息声明目录已被清理.
13.
5.
4第4步:结束命令过程要结束命令过程,遵循这个过程:步骤动作1决定在哪里需要退出或放弃命令过程.
2放置EXIT或STOP命令.
13.
5.
4.
1使用EXIT命令可以把EXIT命令放在命令过程中:确保过程不执行某些行结束有一个以上执行路径的过程结束命令过程以下是一个使用EXIT命令的例子,可避免执行位于过程末端的出错处理例行程序:.
.
.
$EXIT!
Endofnormalexecutionpath$ERROR_ROUTINE.
.
.
以下是一个使用EXIT命令的例子,可结束有一个以上执行路径的过程:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$START:$IFP1.
EQS.
"TAPE".
OR.
P1.
EQS.
"DISK"THENGOTO'P1'$INQUIREP1"Enterdevice(TAPEorDISK)"$GOTOSTART$TAPE:!
Processtapefiles.
.
.
$EXIT$DISK:!
Processdiskfiles.
.
.
$EXIT在每个标号(TAPE和DISK)后面的命令为过程提供不同路径.
在DISK标号之前的EXIT命令确保不执行在DISK标号之后的命令,除非明确到达这个标号的过程分支.
在过程的末端不需要EXIT命令,因为过程的文件结束标记(end-of-file)引起一个潜在的EXIT命令.
然而,Compaq建议您使用EXIT命令.
13.
5.
4.
2使用STOP命令在命令过程中,可以使用STOP命令确保如果发生严重出错则终止过程.
如果STOP命令出现在交互执行的命令过程中,那么控制将返回到DCL级.
如果命令过程以批量模式执行,则批量作业终止.
这个命令行告诉过程如果发生严重出错就停止:$ONSEVERE_ERRORTHENSTOP13.
5.
5第5步:测试和调试程序逻辑一旦使用程序桩编写代码,就应该测试命令过程的全部逻辑.
应该测试所有可能的执行路径.
遵循这个过程测试和调试命令过程:步骤动作1在命令过程中输入每个有效命令以测试程序逻辑.
2输入无效命令以继续测试程序逻辑.
3使用EXIT命令退出命令过程以完成测试程序逻辑.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum4如果必要,就使用SETVERIFY、SETPREFIX或SHOWSYMBOL命令来调试程序.
以下例子展示如何通过输入和执行每个可能命令、无效命令然后退出测试命令过程:$@CLEANUPEntercommand(DELETE,DIRECTORY,EXIT,PRINT,PURGE,TYPE):DELETEThisistheDELETEsection.
Entercommand(DELETE,DIRECTORY,EXIT,PRINT,PURGE,TYPE):DIRECTORYThisistheDIRECTORYsection.
.
.
.
Entercommand(DELETE,DIRECTORY,EXIT,PRINT,PURGE,TYPE):PRINFYouhaveenteredaninvalidcommand.
Entercommand(DELETE,DIRECTORY,EXIT,PRINT,PURGE,TYPE):EXIT$13.
5.
5.
1调试命令过程可以使用以下命令帮助调试命令过程:SETVERIFY显示每行然后执行之.
校验出错时,可查看这个错误和发生这个错误所在的行.
可以使用SETVERIFY命令的关键字指出只校验某些命令行或数据行.
SETVERIFY命令保持有效,直到您注销、输入SETNOVERIFY命令或者使用F$VERIFY词法函数更改校验设置.
(第15章包含更改校验设置的详情.
)SETPREFIX如果校验生效,也可以使用DCL命令SETPREFIX对过程日志文件标记时间戳,方法是在每个命令行前加上它的执行时间.
SHOWSYMBOLSHOWSYMBOL命令可以用来确定符号是如何在过程中定义的.
例子:使用SETVERIFY命令进行调试在以下例子中,标号END_LOP拼写错误.
因为启用校验,故可以精确地查看在哪里出错:$SETVERIFY$@CLEAN$GET_COM_LOOP:$INQUIRECOMMAND-UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum"Entercommand(DELETE,DIRECTORY,EXIT,PRINT,PURGE,TYPE)"Entercommand(DELETE,DIRECTORY,EXIT,PRINT,PURGE,TYPE):EXIT$IFCOMMAND.
EQS.
"EXIT"THENGOTOEND_LOP%DCL-W-USGOTO,targetofGOTOnotfound-checkspellingandpresenceoflabel要纠正这个错误,可把标号更改为END_LOOP.
例子:使用SETPREFIX命令进行调试以下例子说明时间戳的使用:$SETVERIFY$@TEST$SETDEFAULTSYS$LOGIN$SHOWDEFAULTUSER$:[SMYTHE]$SETPREFIX"(!
5%T)"$@TEST(17:52)$SETDEFAULTSYS$LOGIN(17:52)$SHOWDEFAULTUSER$:[SMYTHE]例子:使用SHOWSYMBOL命令进行调试以下例子展示SHOWSYMBOL命令是如何用来确定符号COMMAND是怎样定义的:$SETVERIFY$@CLEAN$GET_COM_LOOP:$INQUIRECOMMAND-"ENTERCOMMAND(DELETE,DIRECTORY,EXIT,PRINT,PURGE,TYPE)"ENTERCOMMAND(DELETE,DIRECTORY,EXIT,PRINT,PURGE,TYPE):EXIT$SHOWSYMBOLCOMMANDCOMMAND="EXIT"$IFCOMMAND.
EQS.
"exit"THENGOTOEND_LOOP.
.
.
SHOWSYMBOL命令展现符号COMMAND的值为"EXIT".
因为INQUIRE命令自动把输入转换为大写字母而测试命令的IF语句使用小写字母字符串"exit",因此DCL确定这些字符串是不同的.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum要纠正这个错误,确定在IF语句中的引用字符串是以大写字母形式写入.
这个字符串的其余部分可以使用大写字母,也可以使用小写字母.
13.
5.
5.
2允许校验执行当命令过程执行允许校验时,也可以中断它.
当命令过程不包含SETVERIFY命令或Ctrl/Y组合键时,通过以下这些步骤可以允许校验:步骤动作1按下Ctrl/Y可中断执行.
2输入SETVERIFY命令.
3输入CONTINUE命令可继续执行命令过程(允许校验).
13.
5.
6第6步:添加清除任务一般而言,命令过程的执行不要更改用户的进程状态.
因此,命令过程应该包括一组把进程返回到它的原始状态的命令.
这组命令通常是标号为"CLEAN_UP"的子例行程序部分.
普通的清除操作包括关闭文件和重新设置默认设备和目录.
遵循这个过程可把清除任务添加到命令过程:步骤任务1从一个标号开始清除子例行程序,例如CLEAN_UP.
2使用F$GETJPI词法函数测试任何打开的文件.
3使用DELETE或PURGE命令删除任何临时或无关的文件.
4如果更改了任何默认(例如设备或目录),则使用SETDEFAULT命令把它们恢复到它们的原始状态.
5包括ONCONTROL_Y语句确保清除操作能执行.
13.
5.
6.
1关闭文件如果打开了任何文件,在退出过程之前确保关闭它们.
可以使用词法函数F$GETJPI检查保持进程的打开文件定额(FILCNT).
如果FILCNT在命令过程的开始和结束是一样的,那么就知道已关闭所有文件.
这些命令是用于警告用户还有打开的文件:$FIL_COUNT=F$GETJPI("","FILCNT").
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum.
.
$IFFILCNT.
NE.
F$GETJPI("","FILCNT")THEN-WRITESYS$OUTPUT"WARNING--fileleftopen)13.
5.
6.
2删除临时或无关文件如果建立了临时文件,就删除它们.
一般而言,如果更新了任何文件,就应该清除它们以删除以前的副本.
在删除您尚未建立的文件之前,确定您要删除它们.
例如,如果您更新了一个包含重要数据的文件,就可以可选地进行清除操作.
如果您更改了默认设备、目录,那么在退出命令过程之前重新设置原始默认.
要保存原始的默认目录名,使用F$ENVIRONMENT词法函数的DEFAULT关键字.
在命令过程的末端,包括一个SETDEFAULT命令恢复保存的设备和目录.
这个例子的命令行展示保存和恢复设备和目录的默认值:$SAV_DEFAULT=F$ENVIRONMENT("DEFAULT").
.
.
$SETDEFAULT'SAV_DEFAULT'13.
5.
6.
3通常更改的进程特征下表列出其他通常更改的进程特征,词法函数用来保存进程特征,而词法函数或命令用来恢复进程特征:特征用于保存的词法函数用于恢复的词法函数DCL提示F$ENVIRONMENTSETPROMPT默认保护F$ENVIRONMENTSETPROTECTION/DEFAULT特权F$SETPRVF$SETPRV或SETPROCESS/PRIVILEGES控制字符F$ENVIRONMENTSETCONTROL校验F$VERIFYF$VERIFY消息格式F$ENVIRONMENTSETMESSAGE键状态F$ENVIRONMENTSETKEYUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum有关这些词法函数的完整描述,请参阅OpenVMSDCLDictionary.
13.
5.
6.
4确保执行清除操作要确保即使命令过程异常结束也要执行清除操作,在命令过程中使用以下语句开始每个命令级:$ONCONTROL_YTHENGOTOCLEANUP有关使用ONCONTROL_Y命令的详情,请参阅第14章.
13.
5.
7第7步:完成命令过程当正确完成一般设计时,做以下几步完成命令过程:步骤任务1在命令过程中替换第一个程序桩的命令.
2测试命令过程,确保新命令恰当地操作.
3如果有必要调试命令过程.
4第一个程序桩完成时,转向下一个,以此类推,直到替换所有程序桩.
例子:用命令替换程序桩以下例子展示CLEANUP.
COM的TYPE段的代码:$!
ExecuteifuserenteredTYPE$!
TYPE:$IFCOMMAND.
NES.
"TYPETHENGOTOERROR$INQUIREFILE"Filetotype"$TYPE'FILE'$GOTOGET_COM_LOOP这将替换现有代码:$WRITESYS$OUTPUT"ThisistheTYPEsection.
"例子:CLEANUP.
COM命令过程以下是已完成的CLEANUP.
COM命令过程的例子:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$GET_COM_LOOP:$INQUIRECOMMAND-"Entercommand(DELETE,DIRECTORY,EXIT,PRINT,PURGE,TYPE)"$IFCOMMAND.
EQS.
"EXIT"THENGOTOEND_LOOP$!
$!
ExecuteifuserenteredDELETE$DELETE:$IFCOMMAND.
NES.
"DELETE"THENGOTODIRECTORY$INQUIREFILE"Filetodelete"$DELETE'FILE'$GOTOGET_COM_LOOP$!
$!
ExecuteifuserenteredDIRECTORY$DIRECTORY:$IFCOMMAND.
NES.
"DIRECTORY"THENGOTOPRINT$DIRECTORY$GOTOGET_COM_LOOP$!
$!
ExecuteifuserenteredPRINT$PRINT:$IFCOMMAND.
NES.
"PRINT"THENGOTOPURGE$INQUIREFILE"Filetoprint"$PRINTSYS$OUTPUT'FILE'$GOTOGET_COM_LOOP$!
$!
ExecuteifuserenteredPURGE$PURGE:$IFCOMMAND.
NES.
"PURGE"THENGOTOTYPE$PURGE$GOTOGET_COM_LOOP$!
$!
ExecuteifuserenteredTYPE$TYPE:$IFCOMMAND.
NES.
"TYPE"THENGOTOERROR$INQUIREFILE"Filetotype"$TYPE'FILE'$GOTOGET_COM_LOOP$!
$ERROR:$WRITESYS$OUTPUT"Youenteredaninvalidcommand.
"$GOTOGET_COM_LOOP$!
$END_LOOP:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$WRITESYS$OUTPUT"Directory''F$DIRECTORY()'hasbeencleaned.
"$$EXIT13.
6执行命令过程要使命令过程运行,必须执行它.
您可以执行命令过程:从另一个命令过程中在远程节点上作为参数或限定词给DCL命令交互地作为批量作业在磁盘和磁带卷上以下几节描述每一种方法.
13.
6.
1在其他命令过程中执行命令过程通过包括执行过程(@)命令,可以从一个命令过程内执行另一个命令过程.
以下命令过程WRITEDATE.
COM调用命令过程GETDATE.
COM:$!
WRITEDATE.
COM$!
$INQUIRETIME"Whatisthecurrenttimeinhh:mmformat"$@GETDATE[JONES.
COM]GETDATE.
COM13.
6.
2执行远程节点上的命令过程您可以使用TYPE命令执行在远程节点上另一个帐户顶级目录的命令过程.
可以执行命令过程:显示不提供簇范围服务的本地OpenVMS簇系统的服务状态列出注册到远程节点的用户输入TYPE命令和后面的存取控制字符串.
使用以下格式:$TYPEnodename"usernamepassword"::"TASK=command_procedure"变量username和password是远程节点帐户的用户名和密码.
这个命令过程显示注册到该命令过程所驻留的远程节点的用户:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
SHOWUSERS.
COM$!
$IFF$MODE().
EQS.
"NETWORK"THENDEFINE/USERSYS$OUTPUTSYS$NET$SHOWUSERS在以下例子中,SHOWUSERS.
COM位于节点ORIOLE上的BIRD帐户的顶级目录中,而密码是BOULDER.
SHOWUSERS.
COM在远程节点ORIOLE执行DCL命令SHOWUSERS.
TYPE命令显示来自本地节点上(即是在您输入type命令的终端)SHOWUSERS.
COM的输出:$TYPEORIOLE"BIRDBOULDER"::"TASK=SHOWUSERS"在11-DEC-199917:20:13.
30时的OpenVMS用户进程用户总数=4,进程数=4用户名节点交互子进程批量FLICKERAUTOMA21ROBINFABLES121DOVEMURMUR1DUCKFABLES1113.
6.
2.
1安全注意事项使用带存取控制字符串的TYPE命令时,您的密码将显现在终端上.
要采取适当的安全预防措施,如第18章所述.
13.
6.
3执行带DCL限定词或参数的命令过程您可以建立一个指定DCL命令参数或限定词的命令过程.
当有一组参数或限定词频繁使用于一个或多个命令时,这类命令过程是有用的.
在将要经常指定限定词或参数的命令行中输入执行过程命令(@).
这个命令过程可以用来为LINK命令输入一组限定词:$!
Thiscommandprocedurecontainscommand$!
qualifiersfortheLINKcommand.
$!
/DEBUG/SYMBOL_TABLE/MAP/FULL/CROSS_REFERENCE使用DEFLINK.
COM指定的限定词,这个命令行链接一个对象SYNAPSE.
OBJ:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$LINKSYNAPSE@DEFLINK这个命令过程可以用来为DCL命令输入参数CHAP1.
TXT、CHAP2.
TXT和CHAP3.
TXT:$!
PARAM.
COM$!
Thiscommandprocedurecontainsalistof$!
parametersthatcanbeusedwithcommands.
$!
CHAP1,CHAP2,CHAP3这个命令行指定命令过程PARAM代替一列参数.
在以下例子中,参数是在PARAM.
COM中列出的文件名:$DIRECTORY/SIZE@PARAM注意使用执行过程命令(@)时,DCL把整个指定文件视为命令输入.
13.
6.
3.
1限制执行命令过程时应用以下限制:命令过程以一个限定词名开始时,不能在执行过程命令(@)之前包括空格.
命令过程以一个参数开始时,必须在执行过程命令(@)之前带一个空格.
13.
6.
4以交互方式执行命令过程要交互地执行命令过程,输入一个执行过程命令(@)后面跟随命令过程的文件说明.
例如,这个命令执行在WORKDISK:磁盘上[MAINT.
PROCEDURES]目录中的过程SETD.
COM:$@WORKDISK:[MAINT.
PROCEDURES]SETD[Return]您可以定义一个表示长命令行的符号名.
然后使用这个符号执行命令过程.
要使用一个符号执行上一个例子展示的命令过程,把这行包括在您的注册命令过程中:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$SETD=="@WORKDISK:[MAINT.
PROCEDURES]SETD"然后,要执行过程SETD.
COM,可输入这个符号名,如同其他命令:$SETD[Return]按照默认,交互地执行命令过程时,操作系统把输出显示在终端上.
然而,执行命令时使用/OUTPUT限定词可以把输出重定向到一个文件.
您把命令过程输出重定向到一个文件时,这个过程把任何出错消息发送到终端和接收输出的文件.
这个命令把SETD.
COM的输出写入文件RESULTS.
TXT,而不是终端:$@SETD/OUTPUT=RESULTS.
TXT总是把/OUTPUT限定词放在命令过程名之后,中间没有空格.
否则,DCL把这个限定词解释为传递给过程的参数.
13.
6.
5以批量作业方式执行命令过程如果使用的命令过程需要很长的处理时间(例如,编译或汇编大的程序),那么把这些过程提交为批量作业,将允许您继续交互地使用终端.
要以批量模式执行命令过程,输入DCL命令SUBMIT可把命令过程提交到批队列(一个等待执行的批量作业列表).
当提交作业时,它被放入默认批队列SYS$BATCH,在此它被添加到等待执行的作业队列末端.
当在您之前的作业完成时,就执行您的作业.
在OpenVMS系统上,可以同时执行的批量作业的数目由系统管理员在建立这个批队列时指定.
以下例子展示如何执行命令过程JOB1.
COM.
SUBMIT命令使用默认文件类型.
COM;如果命令过程有文件类型.
COM时就不必输入文件类型:$SUBMITJOB1JobJOB1(queueSYS$BATCH,entry651,startedonSYS$BATCH))13.
6.
5.
1远程批量作业如果您的系统是网络的一部分,那么可以把命令过程提交为远程节点上的批量作业.
在命令过程中,您可以使用DCL命令打开和关闭远程节点上的文件,并且使用与局部文件一样的命令和限定词,读取和写入那些文件的记录.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum13.
6.
5.
2重新启动批量作业按照默认,如果在作业完成之前系统失败,那么批量作业就从第一行开始重新执行.
然而,可以在命令过程中使用以下符号指定不同的重新启动点:$RESTART一个全局符号,如果在执行之前批量作业至少已启动一次,这个全局符号的值就为真值.
不要为$RESTART指定值;系统将赋予适当的值.
BATCH$RESTART一个全局符号,使用SETRESTART_VALUE命令可指定它的值.
使用$RESTART和BATCH$RESTART以下过程描述如何使用$RESTART和BATCH$RESTART符号:步骤动作1从标号开始过程的每个可能启动点.
2作为每个段的第一步,使用SETRESTART_VALUE命令把BATCH$RESTART的值赋予这个标号.
3在过程的开始,测试$RESTART.
4如果$RESTART为真,则使用BATCH$RESTART作为转移标号发出一个GOTO语句.
以下命令过程从一个库中抽取许多模块、连接那些模块,然后排序作为结果的文件:$!
SORT_MODULES.
COM!
$!
Setdefaulttothedirectorycontaining$!
thelibrarywhosemodulesaretobesorted$SETDEFAULTWORKDISK:[ACCOUNTS.
DATA83]$!
$!
Checkforrestarting$IF$RESTARTTHENGOTO"BATCH$RESTART"$!
$EXTRACT_LIBRARIES:$SETRESTART_VALUE=EXTRACT_LIBRARIES.
.
.
$CONCATENATE_LIBRARIES:$SETRESTART_VALUE=CONCATENATE_LIBRARIESUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum.
.
.
$SORT_FILE:$SETRESTART_VALUE=SORT_FILE.
.
.
$EXIT如果这个命令过程异常结束,它就从文件开始、从标号为CONCATENATE_LIBRARIES的语句或者从标号为SORT_FILE的语句重新执行,视BATCH$RESTART的值而定.
如果抽取了许多独立的模块,就可使每个抽取作为一个独立段.
13.
6.
6执行磁盘和磁带卷上的命令过程以下几节描述如何执行在磁盘和磁带卷上的命令过程.
13.
6.
6.
1在专用磁盘上执行用SUBMIT命令提交命令过程时,不能存取在已分配设备上的文件.
然而,您可以执行位于专用磁盘上的命令过程,并且使用/SHARE限定词装上这个磁盘.
13.
6.
6.
2在磁带卷上执行您可以执行驻留在磁带卷上的命令过程,如果:这个过程不调用任何其他过程.
这个过程不发出任何指向这个GOTO命令之前标号的GOTO命令.
如果出现这些条件之一,完成以下动作可以执行这个命令过程:步骤动作1.
把命令过程复制到共享磁盘卷.
2.
执行这个共享磁盘卷上的命令过程.
13.
7退出和中断命令过程使用本节描述的任何方法退出命令过程时,需要知道命令级.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum命令级是DCL级解释程序的输入流.
在终端输入命令时,是在命令级0输入命令.
简单交互命令过程(如CLEANUP.
COM)在命令级1执行.
当这个过程终止并且DCL提示重新出现在屏幕上,就退回到命令级0.
13.
7.
1退出方法有三种方法退出正在执行的命令过程:把EXIT命令放入命令过程中把STOP命令放入命令过程中在程序执行期间输入Ctrl/Y使用EXIT命令退出如果退出原因是过程结束或者EXIT命令,那么控制返回下一个更高的命令级.
把一个值指定为EXIT命令的参数,可以把这个状态值返回给下一个更高的命令级.
如果在DCL级调用命令过程SUB,而SUB又调用子例行程序SUB1,那么发生以下事情:1.
退出SUB1就返回到SUB在调用SUB1之后的下一个命令行.
2.
退出SUB就返回到DCL命令级.
使用STOP命令退出如果退出原因是STOP命令,那么控制总是返回到DCL命令级,不管执行的STOP命令处于哪一个命令级.
如果在批量作业中执行STOP命令,批量作业就终止.
使用Ctrl/Y退出按下Ctrl/Y可以中断命令过程,然后使用EXIT或STOP命令可终止这个过程.
在这种情况下,EXIT和STOP命令都返回到DCL级.
在以下例子中,按下Ctrl/Y可中断TESTALL过程.
EXIT命令终止这个过程的处理,并返回到DCL级.
(注意,在中断过程后,也可以输入STOP命令.
)$@TESTALL[Return][Ctrl/Y]$EXIT[Return]$13.
7.
2退出处理例行程序中断命令过程时,如果中断的命令(或映象)声明任何退出处理例行程序,那么EXIT命令给出这些例行程序控制.
然而,STOP命令不执行这些例行程序.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum13.
8处理出错按照默认,命令出错或严重出错时,命令解释程序执行一个EXIT命令.
这使过程退到上一个命令级.
对于其他严重级(成功、警告和通知),命令过程继续.
命令解释程序处理出错有一个例外方法.
如果在命令过程中引用一个标号而这个标号不存在(例如,如果包括命令GOTOERR1,而在这个过程中ERR1没有用作一个标号),那么GOTO命令发出一个警告并且退出命令过程.
当系统发出一个EXIT命令作为出错处理例行程序的一部分时,它把$STATUS的值传递给上一个命令级,并且有一个更改.
命令解释程序把$STATUS的高端数字设置为1,以便命令解释程序不会重新显示与这个状态值关联的消息.
在以下例子中,命令过程TEST.
COM在输出文件说明中包含一个错误:$CREATEDUMMY.
DAT\THISISATESTFILE$SHOWTIME执行这个过程时,CREATE命令用$STATUS返回错误,并且显示相应的消息.
然后,命令解释程序检查$STATUS的值,确定已发生错误,发出EXIT命令并返回$STATUS的值.
当这个过程退出时,这个出错消息不会重新显示,因为CREATE命令已经显示了这条消息一次.
在DCL命令级,可以查看包含出错消息的$STATUS,但是其高端数字已设置为1.
例如:$@TEST%CREATE-E-OPENOUT,erroropeningDUMMY.
DAT\asoutput-RMS-F-SYN,filespecificationsyntaxerror%DCL-W-SKPDAT,imagedata(recordsnotbeginningwith"$")ignored$SHOWSYMBOL$STATUS$STATUS="%X109110A2"$WRITESYS$OUTPUTF$MESSAGE(%X109110A2)%CREATE-E-OPENOUT,erroropening!
ASasoutput13.
8.
1默认出错动作以下表格描述当命令过程正在执行而发生出错条件或者Ctrl/Y中断时采取的默认动作.
可以使用ON、SET[NO]ON和SET[NO]CONTROL=Y命令取代这些默认动作.
中断默认动作出错或严重出错过程退出到下一个命令级.
在DCL命令级或命令级1按下中断过程;如果没有其他映象强制它退出,那么这个过程可以UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumCtrl/Y继续.
在命令级1以下按下Ctrl/Y过程退出到下一个更高命令级.
13.
9其他处理出错方法以下几节描述处理出错的其他方法.
13.
9.
1ON命令如果发生一个严重或更严重的出错,那么ON命令指定要执行的动作.
如果发生这样的出错,系统采取以下动作:执行ON命令指定的动作.
设置$STATUS和$SEVERITY指出指定ON动作的结果.
一般而言,$STATUS和$SEVERITY设置为成功.
重新设置默认出错动作(如果出错或严重出错,就退出).
一个ON命令动作只执行一次.
因此,在命令过程执行ON命令指定的动作之后,其默认出错动作被重新设置.
ON命令指定的动作只应用于执行这个命令所在的命令级.
因此,如果在一个调用另一个过程的过程中执行一个ON命令,那么ON命令动作不应用于嵌套的过程.
ON命令的格式如下所示:ONconditionTHEN[$]command在此,"condition"是以下关键字之一:ON关键字采取的动作WARNING如果有警告、出错或严重出错,命令过程就执行指定的动作.
ERROR如果出错或严重出错,命令过程执行指定的动作.
如果有警告,则过程继续.
SEVERE_ERROR如果严重(致命的)出错,命令过程执行指定的动作.
如果有警告或出错,则过程继续.
如果为特定严重级建立ON命令动作,那么当发生同级或更严重的出错时命令解释程序就执行指定的动作.
当发生较轻的出错时,命令解释程序继续处理这个文件.
例子:使用ON命令这个命令可以用来取代默认出错处理,以便当发生警告、出错或严重出错时退出过程:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$ONWARNINGTHENEXIT例子:出错后恢复如果命令过程包括这个命令,那么命令过程正常执行直到出错或严重出错为止:$ONERRORTHENGOTOERR1如果发生这样的出错,那么过程在ERR1恢复执行.
$STATUS和$SEVERITY设置为成功,而默认出错动作被重新设置.
如果在另一个ON或SETNOON命令执行之前发生第二个出错,那么这个过程退到上一个命令级.
ON命令指定的动作只应用于执行这个命令的命令级.
因此,如果在一个调用另一个过程的过程中执行ON命令,那么ON命令动作不应用于嵌套的过程.
图13-1说明ON命令动作.
图13-1ON命令动作UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum1.
这个ON命令取代默认命令动作(对于警告,继续;对于出错或严重出错,退出).
如果编译A.
FOR时发生或严重出错,那么命令过程继续下一个命令.
2.
如果上一个ON命令有效,默认命令动作就被重新设置.
因而,如果编译A.
FOR和B.
FOR时出错或严重出错,那么命令过程就退出.
3.
如果编译C.
FOR时发生警告、出错或严重出错,命令过程就退出.
4.
如果命令过程在一个命令执行之前不退出,这个命令动作就生效.
在附录B中的样例命令过程FORTUSER.
COM和CALC.
COM也说明使用ON命令建立出错处理.
13.
10使用SETNOON命令在命令过程中使用SETNOON命令,把ON命令设置为NO状态,可以阻止命令解释程序检查从命令返回的状态.
使用SETNOON命令时,命令解释程序继续把值放入$STATUS和$SEVERITY,但不执行任何出错检查.
使用SETON命令或ON命令,可以恢复出错检查.
当过程撤消出错检查时,它可以在命令或程序执行之后明确地检查$STATUS的值.
在以下例子中,在RUN命令之前的SETNOON命令确保如果程序TESTA或TESTB返回一个出错条件时,命令过程就继续.
SETON命令恢复命令解释程序的默认出错检查.
$SETNOON$RUNTESTA$RUNTESTB$SETON在以下例子中,第一个IF命令检查$STATUS是否有真值(即,如果它是奇数值).
如果有,FORTRAN命令就成功,而LINK命令就执行.
在LINK命令执行之后,再次测试$STATUS.
如果$STATUS是奇数,RUN命令就执行;否则,RUN命令不执行.
SETON命令恢复当前的ON条件动作;即是说,在SETNOON命令执行之前的条件有效:$SETNOON$FORTRANMYFILE$IF$STATUSTHENLINKMYFILE$IF$STATUSTHENRUNMYFILE$SETONSETON或SETNOON命令只应用于当前命令级;即是这个命令执行的命令级.
如果在调用另一个命令过程的命令过程中使用SETNOON命令,那么默认出错检查机制将在嵌套的过程中有效.
注意,在DCL级交互输入SETNOON没有意义.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum13.
11处理Ctrl/Y中断按照默认,当命令过程正在执行时按下Ctrl/Y,命令解释程序在一个特殊的命令级(称为Ctrl/Y命令级)提示输入命令.
在Ctrl/Y命令级,可以输入在命令解释程序中执行的DCL命令,然后用CONTINUE命令恢复命令过程的执行.
另外,输入一个强制命令过程停止执行的DCL命令,您可以停止这个过程.
本节描述一些取代方法,命令过程使用ON命令处理Ctrl/Y中断.
13.
11.
1停止命令过程按下Ctrl/Y,您可以中断正在交互执行的命令过程.
您按下Ctrl/Y时,命令解释程序建立一个新命令级,称为Ctrl/Y级,并提示输入命令.
当中断发生取决于正在执行的命令或程序时:如果这个命令本身被命令解释程序执行(例如,IF、GOTO或赋值语句),那么命令解释程序在Ctrl/Y级提示输入命令之前,这个命令就完成执行.
如果这个命令或程序是一个独立映象(即,一个不同于命令解释程序的映象),那么这个命令被中断,并且命令解释程序在Ctrl/Y级提示输入命令.
在Ctrl/Y级,命令解释程序存储所有以前建立命令级的状态,使它在任何Ctrl/Y中断之后都可以恢复到正确的状态.
在中断过程之后,您可以做以下事情:输入在命令解释程序中执行的DCL命令.
这些命令是SETVERIFY、SHOWTIME、SHOWTRANSLATION、ASSIGN、EXAMINE、DEPOSIT、SPAWN和ATTACH命令.
在输入一个或多个这些命令之后,可以用CONTINUE命令恢复过程的执行.
有关在命令解释程序中执行的完整命令列表,请参阅14.
7.
2节.
当输入CONTINUE命令时,命令过程恢复执行中断的命令或程序或最近完成的命令行.
输入执行另一个映象的DCL命令.
输入调用新映象的任何命令时,命令解释程序返回到命令级0并执行这个命令.
这会终止命令过程的执行.
在新映象开始之前,允许执行中断映象说明的任何退出处理程序.
输入EXIT或STOP命令终止命令过程的执行.
如果使用EXIT命令,那么允许执行中断映象说明的退出处理程序.
然而,STOP命令不执行这些例行程序.
注意如果在Ctrl/Y之后不退出命令过程(明确地从命令级或者作为ON例行程序的一部分),那么您输入的下一个命令在这个命令过程的上下文中解释.
例如,假设您在交互级定义以下符号:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$MAIL="mail/edit=(send,reply,forward)"如果您输入Ctrl/Y中断一个不包括这个定义的命令过程,然后输入命令MAIL发送一条消息,就不会自动调用您的编辑程序.
13.
11.
2停止特权映象在中断执行特权映象时,如果要保存映象的上下文可以输入CONTINUE、SPAWN或ATTACH命令.
如果输入任何其他命令(除在派生或附加子进程内的命令之外),特权映象就被强制退出.
13.
12设置Ctrl/Y动作例行程序以下几节描述如何设置Ctrl/Y动作例行程序.
13.
12.
1使用ON命令ON命令定义在出错情况下采取的动作,它提供一个方法为在命令过程执行期间发生的Ctrl/Y中断定义一个动作例行程序.
您指定的动作取代默认Ctrl/Y动作(即在Ctrl/Y命令级提示输入命令).
例如:$ONCONTROL_YTHENEXIT如果过程执行这个ON命令,那么在过程执行期间的后续Ctrl/Y中断使这个过程退出.
控制被传递给上一个命令级.
当按下Ctrl/Y中断使用ONCONTROL_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命令或默认出错条件处理动作的结果).
执行另一个ONCONTROL_Y命令.
执行SETNOCONTROL=Y命令的过程(请参阅13.
13节).
Ctrl/Y动作可以在每个活动命令级指定,并且只影响指定此命令级.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum以下例子展示的命令过程执行时,每个Ctrl/Y中断导致执行SHOWTIME命令.
在每个SHOWTIME命令执行之后,过程恢复执行在中断命令之后的命令.
$ONCONTROL_YTHENSHOWTIME图13-2说明Ctrl/Y中断后的执行流.
图13-2Ctrl/Y动作后的执行流UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum1.
在执行TYPE命令期间发生Ctrl/Y中断.
2.
然后,控制传递到标号CLEAN_UP.
3.
在执行这个例行程序之后,命令过程退出并返回到交互命令级.
4.
在TYPE命令执行期间发生Ctrl/Y中断.
5.
执行在ON命令中指定的WRITE命令.
6.
命令过程继续执行在中断命令之后的命令.
图13-3说明在嵌套命令过程执行期间按下Ctrl/Y时会发生什么事情.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum图13-3在嵌套过程中的Ctrl/Y1.
执行SEARCH.
COM时,如果发生Ctrl/Y中断,那么控制被传递到标号CLEAN_UP.
2.
执行SUBSEARCH.
COM时,如果发生Ctrl/Y中断,控制则被传递到SEARCH.
COM中的标号NEXT_STEP.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum3.
因为在SUBSEARCH.
COM中没有指定Ctrl/Y动作,因此发生Ctrl/Y中断时,过程退到上一个命令级.
4.
执行SUBSUB.
COM时,如果发生Ctrl/Y中断,则执行SHOWTIME.
13.
13撤消和允许Ctrl/Y中断以下几节描述如何撤消和允许Ctrl/Y中断.
13.
13.
1使用SETNOCONTROL=YSETNOCONTROL=Y命令撤消Ctrl/Y处理.
即是说,如果命令过程执行SETNOCONTROL=Y命令,按下Ctrl/Y就没有效果.
SETNOCONTROL=Y命令也取消当前用ONCONTROL_Y命令建立的Ctrl/Y动作.
要重新建立默认Ctrl/Y动作,使用以下两个命令:$SETNOCONTROL=Y$SETCONTROL=YSETNOCONTROL=Y命令撤消Ctrl/Y处理,并取消当前ONCONTROL_Y动作.
SETCONTROL=Y命令允许Ctrl/Y处理.
在这一点上,默认动作就被复原.
即是说,如果在过程执行期间按下Ctrl/Y,那么命令解释程序就在Ctrl/Y命令级提示输入命令.
可以在任何命令级使用SETNOCONTROL=Y命令.
它影响所有命令级,直到SETCONTROL=Y命令重新允许Ctrl/Y处理.
13.
13.
2使用SETCONTROL=YONCONTROL_Y命令保持有效,直到执行另一个ONCONTROL_Y或SETNOCONTROL=Y命令,或者命令过程退出.
当Ctrl/Y撤消时,要退出无尽循环必须从另一个终端使用DCL命令STOP删除您的进程.
如果撤消默认Ctrl/Y动作,就尽快重新设置它.
要重新设置默认Ctrl/Y动作,就执行SETNOCONTROL=Y命令,后面跟随SETCONTROL=Y命令.
在这个命令过程中,当文件正在被键入时按下Ctrl/Y就把控制传递给标号END_TYPE:.
.
.
$!
Typeafile$IFCOMMAND.
NES.
"TY"THENGOTOEND_TYPEUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$ONCONTROL_YTHENGOTOEND_TYPE$TYPE'FILESPEC'$END_TYPE:$!
$!
Resetdefault$SETNOCONTROL=Y$SETCONTROL=Y.
.
.
注意ONCONTROL_Y和SETNOCONTROL=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当前的十六进制值.
通过输入SHOWSYMBOL$STATUS命令,可以显示$STATUS的ASCII翻译.
在以下例子中,文件名(%FRED.
LIS)输入错误:$CREATE%FILE.
LISUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum%CREATE-E-OPENOUT,erroropening%FRED.
LIS;asoutput-RMS-F-WLD,invalidwildcardoperation$SHOWSYMBOL$STATUS$STATUS="%X109110A2"$WRITESYS$OUTPUTF$MESSAGE(%X109110A2)%CREATE-E-OPENOUT,erroropening!
ASasoutput13.
14.
2使用EXIT命令返回条件码命令过程退出时,命令解释程序在$STATUS中返回上一个命令的条件代码.
条件代码提供有关最近命令是否成功执行的信息.
在命令过程中使用EXIT命令时,可以指定一个值取代DCL将赋予$STATUS的值.
这个值,被称为状态码,必须指定为一个整型表达式.
命令过程包含建立多个命令级的嵌套过程时,可以使用EXIT命令返回一个明确取代默认条件码的值.
检查以下两个命令过程:$!
ThisisfileA.
COM$!
$@B.
.
.
$!
ThisisfileB.
COM$!
$ONWARNINGTHENGOTOERROR.
.
.
$ERROR:$EXIT1B.
COM中的ON命令意味着,当B.
COM执行时如果有任何警告、出错或严重出错,这个过程就被指引到标号ERROR.
这里,条件代码明确设置为1,指出成功.
因此,当B.
COM终止时,它传递一个成功代码给A.
COM,而不管是否出错.
13.
14.
3决定严重级$STATUS的低端3位表示引起命令终止条件的严重性.
这部分条件代码包含在保留的全局符号$SEVERITY中.
$SEVERITY符号的值可以是0至4,其中每个值表示以下严重级之一:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum值严重性0警告1成功2出错3通知4致命的(严重的)出错注意,成功和通知代码有奇数值,而警告和出错代码有偶数值.
13.
14.
4测试成功完成使用对$SEVERITY或$STATUS执行逻辑测试的IF命令,可以测试命令是否成功完成,如下所示:$IF$SEVERITYTHENGOTOOKAY$IF$STATUSTHENGOTOOKAY如果$SEVERITY和$STATUS有真(奇)值,这些IF命令就把控制流转移到标号OKAY.
当$SEVERITY和$STATUS的当前值是奇数时,命令或程序就成功完成.
如果命令或程序没有成功完成,那么$SEVERITY和$STATUS就是偶数;因此,IF表达式为假.
代替测试条件是否为真,您可以测试它是否是假.
例如:$IF.
NOT.
$STATUSTHEN.
.
.
命令解释程序使用条件代码的严重级确定是否采取ON命令定义的动作,如13.
9节所述.
13.
15使用不设置$STATUS的命令调用系统公用程序的大多数DCL命令完成时会产生状态值和出错消息.
然而,有几个命令成功完成时不更改$STATUS和$SEVERITY的值.
这些命令如下所示:CONTINUEDECKDEPOSITEODEXAMINEGOTOIFRECALLSETSYMBOL/SCOPESHOWSTATUSSHOWSYMBOLSTOPWAITUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果这些命令的任意一个导致不成功状态,那么其条件代码将被放入$STATUS,而其严重级被放入$SEVERITY.
13.
16注册命令过程注册命令过程是一个每次注册时操作系统就会自动执行的命令过程.
在提交的每个批量作业开始时,系统也执行这个过程.
有两类注册命令过程:全系统的(或组定义的)个人的13.
16.
1全系统注册命令过程全系统注册命令过程有以下特征:全系统注册命令过程在您的个人注册命令过程之前执行.
当全系统注册命令过程终止时,该过程把控制传递给您的个人注册命令过程.
全系统注册命令过程允许系统管理员确保某些命令总是在您注册时执行.
要建立全系统注册命令过程,您的系统管理员使逻辑名SYS$SYLOGIN等同于适当的注册命令过程.
系统管理员可以指定这个注册命令过程用于所有系统用户或某些用户组.
13.
16.
2个人注册命令过程您可以建立一个个人注册命令过程使每次注册时执行同样的命令.
系统管理员为注册命令过程分配文件说明.
在大多数安装中,注册命令过程被称为LOGIN.
COM.
因此,应该把注册命令过程命名为LOGIN.
COM,除非系统管理员告诉您其他文件名.
以下是一个LOGIN.
COM过程的例子:$IFF$MODE().
NES.
"INTERACTIVE"THENEXIT$SETTERMINAL/INSERT$DIR:==DIR/DATE/SIZE$EDIT:==EDIT/EDT$EXIT13.
16.
3受约束帐户的注册命令过程把特殊命令过程的名称放入用于您的帐户的LGICMD字段,您的系统管理员可以设置受约束帐户.
如果注册到一个受约束帐户,那么在命令过程中只可以执行为您帐户指定的功能;不能使用全部的DCL命令.
有关受约束帐户的详情,请参阅OpenVMSSystemManager'sManual.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum13.
17扩展文件说明和分析样式需要特定文件名分析样式的命令过程可以在过程中包括转换样式的命令.
以下命令过程保存当前分析样式,设置分析样式为TRADITIONAL,执行(未指定的)命令,然后恢复已保存的分析样式.
$original_style=f$getjpi("","parse_style_perm")$SETPROCESS/PARSE_STYLE=TRADITIONAL.
.
.
$SETPROCESS/PARSE_STYLE='original_style'第一个命令使'original_style'等同于当前分析样式.
第二个命令把分析样式设置为TRADITIONAL.
最后一个命令把分析样式重新设置为其原始样式.
13.
18在DCL命令参数中使用扩展文件名在ODS-5环境下,使用文件名作为参数的命令过程可以产生不同的结果.
您可以从TRADITIONAL转换为EXTENDED分析样式,而如果您选择这么做,可能影响以下区域(本节描述):命令过程文件说明字母大小写保留和$FILE和号替换与省略号替换有关转换分析样式的详情,请参阅5.
3节.
13.
18.
1命令过程文件说明如果使用间接命令过程,可能需要用引号括住一些过程变元.
以下例子展示当使用同一命令文件SS.
COM时,TRADITIONAL和EXTENDED分析样式的输出差别:$createss.
com$ifp1.
nes.
""thenwritesys$output"p1=",p1$ifp2.
nes.
""thenwritesys$output"p2=",p2$ifp3.
nes.
""thenwritesys$output"p3=",p3设置分析样式为TRADITIONAL并运行SS.
COM可产生以下输出:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$setprocess/parse_style=traditional$@ss^parg2parg3p1=^p2=PARG2p3=PARG3注意,音调符号(^)是第一个变元(不是换码符),而且对于p2和p3过程变元,字母大小写是不保持的.
设置分析样式为EXTENDED,则当运行同一命令过程时产生以下输出:$setprocess/parse_style=extended$@ss^parg2parg3p1=^PARG2p2=PARG3注意,命令过程把音调符号(^)识别为换码符,把空格标识为文字字符而不是变元分隔符,并且"^PARG2"是第一个变元.
也不保持字母大小写.
为音调符号(^)添加引号产生以下结果:$@ss"^"parg2parg3p1=^p2=PARG2p3=PARG3因为音调符号(^)是在引用的字符串内,它不被处理为一个换码符.
把引号添加到p3变元,产生以下结果:$@ss"^"parg2"parg3"p1=^p2=PARG2p3=parg3注意,为p3过程变元保持字母大小写.
分析样式设置为TRADITIONAL时,以下命令把音调符号(^)和parg2和parg3字符串处理为过程变元,并且命令过程产生以下结果:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$setprocess/parse_style=traditional$@ss^parg2parg3p1=^p2=PARG2p3=PARG3分析样式设置为EXTENDED时,音调符号(^)被视为换码符,把空格标识为一个文字字符.
在以下展示的例子中,DCL寻找文件"SS^_PARG2.
COM",因而出错:$setprocess/parse_style=extended$@ss^parg2parg3-RMS-E-FNF,filenotfound13.
18.
2字母大小写保留和$FILEDCL尝试保持文件说明的字母大小写.
只有用命令定义公用程序(CDU)定义的命令,才能做到这一点.
DCL保持在命令定义文件(.
CLD)中使用$FILE分析类型定义的任何项目的字母大小写.
有关详情,请参阅OpenVMSCommandDefinition,Librarian,andMessageUtilitiesManual.
13.
18.
3和号替换与省略号替换与省略号替换不同,可以使用和号(&)替换在传统分析中保持字母大小写.
以下传统分析例子展示一串更改字符串字母大小写的命令:$setprocess/parse_style=traditional$x="string"$definey'x'$shology"Y"="STRING"(LNM$PROCESS_TABLE)$definey&x%DCL-I-SUPERSEDE,previousvalueofYhasbeensuperseded$shology"Y"="string"(LNM$PROCESS_TABLE)注意,使用和号(&)保持赋值给x变量的字符串字母大小写.
省略号替换发生在命令行设置为大写字母之前,而和号替换发生在命令行设置为大写字母之后.
以下扩展分析例子展示同样的一列命令:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$setprocess/parse_style=extended$definey'x'%DCL-I-SUPERSEDE,previousvalueofYhasbeensuperseded$shology"Y"="string"(LNM$PROCESS_TABLE)$definey&x%DCL-I-SUPERSEDE,previousvalueofYhasbeensuperseded$shology"Y"="string"(LNM$PROCESS_TABLE)注意,y变量的两个字符串都返回小写字母.
这是因为DEFINE命令使用$FILE,它保持字母大小写.
因此,和号替换可以用来指定扩展文件名,即使分析样式设置为TRADITIONAL,如以下例子所示:$setprocess/parse=extended$crefile^name.
docContentsofanODS5fileExit$setprocess/parse=traditional$a="file^name.
doc"$typefile^name.
doc%DCL-W-PARMDEL,invalidparameterdelimiter-checkuseofspecialcharacters\^NAME\$type'a'%DCL-W-PARMDEL,invalidparameterdelimiter-checkuseofspecialcharacters\^NAME\$type&aContentsofanODS5file注意和号替换不能用于外部命令.
第14章DCL高级编程UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum高级DCL编程包括使用复杂的命令过程和DCL命令PIPE.
如果您已阅读了第13章,并且具备DCL编程的基本知识,然后想要学习更多的高级方法,您就应该阅读本章.
复杂的命令过程可以执行类似程序的功能.
在命令过程中可以使用变量输入、只当某些条件为真时才执行过程段、执行子例行程序或调用其他命令过程.
您也可以使用DCL命令PIPE执行类似程序的功能.
例如,使用PIPE命令,可以在同一DCL命令行中执行一个或多个以下操作:流水线操作(一串命令)输入/输出重定向多个和条件命令执行后台处理本章包括以下信息:执行命令过程输入使用参数传递数据给嵌套的命令过程执行命令过程输出读取和写入文件(文件I/O)处理文件I/O出错控制执行流的技术建立新的命令级编写Case语句使用PIPE命令14.
1执行命令过程输入命令过程频繁地需要用户提供数据.
这个数据,或输入,可以从交互(如第13章所述)或非交互地获得.
本章论述非交互输入方法,以及不同于第13章所述的交互输入方法.
每次命令过程执行时,可以使用同样的数据.
要做到这一点,把数据放置在命令过程中的数据行上,后面跟随需要这些数据的命令.
这个命令过程执行命令过程CENSUS.
EXE.
这个过程每次执行时,CENSUS.
EXE读取数据1993、1994和1995:$!
CENSUS.
COM$!
$RUNCENSUS199319941995UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$EXIT14.
1.
1在命令过程中对包括数据的限制DCL把数据行上的文本直接传递给命令过程.
因此,它不处理必须翻译的数据,例如:符号逻辑名算术表达式14.
1.
2输入数据的其他方法以下几节描述为命令过程获得输入数据的其他方法,包括:使用参数传递数据使用参数传递数据给批量作业使用参数传递数据给嵌套的命令过程使用INQUIRE和READ命令提示输入数据使用SYS$INPUT逻辑名获得数据14.
2使用参数传递数据下表包含把参数作为数据传递给命令过程的指引:把参数放在命令过程文件说明之后.
可以传递最多8个参数给一个命令过程.
如果传递少于8个参数值,那么多余的符号被赋值为空值.
空值是不带字符的字符串,并且用引号("")表示.
用一个或多个空格或制表符分隔参数.
DCL把传递给命令过程的参数放入局部符号P1至P8.
P1赋值为第一个参数值,P2为第二个,P3为第三个,以此类推.
例如,以下命令调用命令过程SUM.
COM,并把8个参数传递给这个过程:$@SUM34526648927287314.
2.
1指定参数为整数指定一个整数作为参数时,它被转换为字符串.
在以下例子中,P1是字符串值24;P2是字符串值25:$@ADDER2425可以在整数和字符串表达式中使用符号P1至P8;DCL自动执行必要的转换.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum14.
2.
2指定参数为字符串要在字符串中保持空格、制表符或小写字母字符,把引号("")放在这个字符串之前和之后.
例如:$@DATA"PaulCramer"在以下例子中,P1是PaulCramer而P2为空.
如果省略引号,那么每个字符串被传递为独立的参数.
例如:$@DATAPaulCramer在这个例子中,字符串Paul和Cramer被转换为大写字母;P1是PAUL而P2是CRAMER.
如另一个例子,如果用以下命令调用DATA.
COM:$@DATA"PaulCramer"24"(555)111-1111")P1至P8在DATA.
COM中定义如下:P1=PaulCramerP2=24P3=(555)111-1111P4--P8=null14.
2.
3指定参数为符号要传递一个符号的值,把省略号放在这个符号之前和之后.
要保持符号值中的空格、制表符和小写字母字符,用三组引号括入这些值.
您也必须使用三组引号包括作为字符串一部分的引号.
另一方法是把文本括入引号内,并且在符号出现处把两个省略号放在这个符号之前并且后面跟随一个省略号.
在以下例子中,由于传递符号给命令过程时DCL除去引号,因此P1是Paul并且P2是Cramer:$NAME="PaulCramer"$@DATA'NAME'在以下例子中,P1是"PaulCramer"而P2为空:$NEW_NAME="""PaulCramer"""UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$@DATA'NEW_NAME'在以下例子中,P1翻译为PaulCramer:$!
DATA.
COM$@NAME"''P1'"14.
2.
4指定参数为空值要传递一个空参数,可在命令字符串中使用一组引号作为一个占位符.
在以下例子中,传递给DATA.
COM的第一个参数是一个空参数:$@DATA"""PaulCramer"在这个例子中,P1为空,而P2是PaulCramer.
14.
3使用参数传递数据给批量作业要把参数传递给以批量模式执行的命令过程,可使用SUBMIT命令限定词/PARAMETERS.
如果要使用单个SUBMIT命令执行一个以上命令过程,那么指定的参数用于在批量作业中的每个命令过程.
在以下例子中,命令传递三个参数给命令过程ASK.
COM和GO.
COM,它们以批量作业方式执行:$SUBMIT/PARAMETERS=(TODAY,TOMORROW,YESTERDAY)ASK.
COM,GO.
COM)在以下例子中,SUBMIT命令传递两个参数给命令过程:LIBRARY.
COM和SORT.
COM:$SUBMIT-_$/PARAMETERS=(DISK:[ACCOUNT.
BILLS]DATA.
DAT,DISK:[ACCOUNT]NAME.
DAT)-_$LIBRARY.
COM,SORT.
COM批量作业的执行就象您已注册并且执行每个命令过程.
这个SUBMIT命令执行一个在您的帐户下注册的批量作业,执行注册命令过程,然后执行以下命令:$@LIBRARYDISK:[ACCOUNT.
BILLS]DATA.
DATDISK:[ACCOUNT]NAME.
DAT)$@SORTDISK:[ACCOUNT.
BILLS]DATA.
DATDISK:[ACCOUNT]NAME.
DAT)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在命令过程中包括数据,或者把SYS$INPUT定义为一个文件,您也可以把数据传递给批量作业.
指定的参数用于在批量作业中的每个命令过程.
14.
4使用参数传递数据给嵌套的命令过程您可以传递多达8个参数给嵌套的命令过程.
在嵌套过程中的局部符号P1至P8与调用过程的局部符号P1至P8是不相关的.
在以下例子中,DATA.
COM调用嵌套的命令过程NAME.
COM:$!
DATA.
COM$@NAME'P1'JoeCooper如果DATA.
COM中的P1是字符串PaulCramer,它不包含引号,那么它作为两个参数传递给NAME.
COM.
在NAME.
COM中,P1至P8定义如下:P1=PAULP2=CRAMERP3=JOEP4=COOPERP5--P8=null如果在DATA.
COM中的P1是"PaulCramer"(包括引号),那么把P1括入3组引号内可以把这个值作为一个参数传递给NAME.
COM,如下所示:$!
DATA.
COM$QUOTE="""$P1=QUOTE+P1+QUOTE$@NAME'P1'"JoeCooper"在这个例子中,在命令过程NAME.
COM中的P1是PaulCramer,而P2是JoeCooper.
14.
5提示输入数据您可以使用INQUIRE命令(如第13章所述)或READ命令交互地获得命令过程数据.
两个命令都提示输入并把应答赋值给一个符号.
READ命令在以下方面不同于INQUIRE命令:INQUIRE命令.
.
.
READ命令.
.
.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum提示输入值提示输入值从终端读取值从第一个参数指定的来源读取值给一个符号赋值给名为第二个参数的符号赋值READ命令响应提示时接受在终端上键入的作为精确字符串值的所有字符(保持字母大小写、空格和制表符).
如果省略/PROMPT限定词,那么READ命令显示Data:作为默认提示.
您也可以编写这样的命令过程,即它们可以接受参数或者如果没有指定需要的参数时就提示用户输入.
在以下例子中,命令发出提示Filename:给终端,从逻辑名SYS$COMMAND(按照默认,终端)指定的来源读取应答,并且把应答赋值给符号FILE:$READ/PROMPT="Filename:"SYS$COMMANDFILE在以下例子中,当过程调用时如果没有指定一个文件名,就提示用户输入一个文件名:$!
Promptforafilenameifname$!
isnotpassedasaparameter$IFP1.
EQS.
""THENINQUIREP1"Filename"$COPY'P1'DISK5:[RESERVED]*.
*$EXIT注意如果您提交一个作为批量作业执行的命令过程,DCL从INQUIRE命令之前的数据行读取在INQUIRE命令中指定的符号值.
如果您不包括数据行,符号被赋予一个空值.
14.
6使用SYS$INPUT逻辑名获得数据命令、公用程序和其他系统映象从逻辑名SYS$INPUT指定的来源获得它们的输入,这是默认输入流.
在命令过程中,SYS$INPUT被定义为命令过程文件;需要数据的命令或映象要在此文件中寻找数据行.
然而,重定义SYS$INPUT,您可以从终端或从独立的输入文件提供数据.
14.
6.
1重定义SYS$INPUT为终端您可以把SYS$INPUT重新定义为终端.
这允许从命令过程调用的映象获得交互输入,而不是从命令过程中的数据行.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum注意,如果想要在命令过程中使用需要交互输入的DCL命令或公用程序,必须把SYS$INPUT重新定义为终端.
在以下例子中,命令过程允许您交互地提供输入给映象CENSUS.
EXE:$!
ExecuteCENSUSgettingdatafromtheterminal$DEFINE/USER_MODESYS$INPUTSYS$COMMAND$RUNCENSUS$EXITCENSUS.
EXE运行时,DEFINE/USER_MODE命令临时重新定义SYS$INPUT,因而CENSUS.
EXE从终端获得它的输入.
在CENSUS.
EXE完成之后,SYS$INPUT回复到它的原始定义(命令过程文件).
在以下例子中,命令过程把EVE用作文本编辑程序:$!
Obtainalistofyourfiles$DIRECTORY$!
$!
GetfilenameandinvoketheEVEeditor$EDIT_LOOP:$INQUIREFILE"Filetoedit(PressReturntoend)"$IFFILE.
EQS.
""THENEXIT$DEFINE/USER_MODESYS$INPUTSYS$COMMAND$EDIT/TPU'FILE'$GOTOEDIT_LOOP命令过程提示输入文件名,直到按下Return键终止这个循环.
输入文件名时,过程自动调用EVE来编辑这个文件.
运行这个编辑程序时,SYS$INPUT被定义为终端,因而可以交互地输入编辑.
14.
6.
2定义SYS$INPUT为一个单独的文件把SYS$INPUT定义为一个文件,命令过程也可以从文件获得输入.
注意,DCL不处理数据行;命令过程直接把数据行上的文本传递给命令或映象.
如果在数据行上包括DCL符号或表达式,DCL不会替换这个符号的值或者求值表达式.
如果在数据行中使用感叹号(!
),那么您传递数据给它的映象会处理这个感叹号.
把数据文件的名称指定为SYS$INPUT,您也可以把程序放入命令过程文件中.
这导致编译程序从命令过程读取程序,而不是从另一个文件.
以下例子展示一个命令过程,它包含一个FORTRAN命令,并且后面跟随程序的语句:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$FORTRAN/OBJECT=TESTER/LIST=TESTERSYS$INPUTCTHISISATESTPROGRAMA=1B=2STOPEND$PRINTTESTER.
LIS$EXITFORTRAN命令使用逻辑名SYS$INPUT标识编译的文件.
由于SYS$INPUT等同于这个命令过程,因此FORTRAN编译程序编译这个FORTRAN命令之后的语句(直至下一个开始于美元符的命令行).
编译完成时,建立两个输出文件:TESTER.
OBJ和TESTER.
LIS.
然后,PRINT命令打印这个文件.
14.
7执行命令过程输出命令过程的输出,如数据、出错消息和命令行校验,可以被指引到终端或其他文件.
本节论述以下指引输出的方法:显示数据重定向命令和映象的输出从命令过程返回数据重定向出错消息14.
7.
1显示数据使用TYPE命令显示有几行长并且不需要符号替换的文本.
TYPE命令把您指定文件的数据写入SYS$OUTPUT.
在以下例子中,SYS$INPUT被指定为数据文件.
TYPE命令从数据行读取数据,并在终端上显示这些行.
$!
UsingTYPEtodisplaylines$TYPESYS$INPUTREPORTBYMARYJONESPREPAREDAPRIL15,2002SUBJECT:AnalysisofTaxDeductionsfor2002.
.
.
$EXITUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum使用WRITE命令写入包含符号或词法函数的数据.
除非把数据括入引号("")内,否则WRITE命令自动执行符号替换.
要使用WRITE命令把字符串显示为文字文本,把字符串括入引号("")内.
例如:$WRITESYS$OUTPUT"Twofilesarewritten.
"Twofilesarewritten.
要在字符串中包括引号,使用两组引号("""").
例如:$WRITESYS$OUTPUT"Summaryof""Q&A""Session"Summaryof"Q&A"Session要在一行以上继续一行文本,用一个加号(+)和连字号(-)连接这两个字符串.
例如:$WRITESYS$OUTPUT"ReportbyMaryJones"+-"PreparedApril15,2002"ReportbyMaryJonesPreparedApril15,2002WRITE命令自动执行符号替换,并显示符号的值.
要在字符串内强制符号替换,把符号括入省略号内.
例如:$AFILE="STAT1.
DAT"$BFILE="STAT2.
DAT"$WRITESYS$OUTPUT"''AFILE'and''BFILE'ready.
"STAT1.
DATandSTAT2.
DATready.
在这个例子中,STAT1.
DAT是符号AFILE的翻译;STAT2.
DAT是符号BFILE的翻译.
14.
7.
2重定向命令和映象的输出命令、公用程序和其他系统映象把它们的输出写入逻辑名SYS$OUTPUT指定的来源.
按照默认,SYS$OUTPUT等同于终端.
然而,可以按以下方法之一重定向输出:调用这个命令时,使用/OUTPUT限定词.
接受/OUTPUT限定词的DCL命令包括:ACCOUNTING、CALL、DIRECTORY、HELP、LIBRARY、RUN(进程)、SPAWN和TYPE.
使用DEFINE/USER_MODE命令,临时把SYS$OUTPUT重新定义为一个文件.
临时把SYS$OUTPUT定义为一个空设备(使用DEFINE/USER_MODE命令),可抑制命令的输出.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在以下例子中,命令过程把SHOWUSERS命令的输出重定向到一个文件.
只在执行SHOWUSERS命令时,SYS$OUTPUT新定义才有效.
$DEFINE/USER_MODESYS$OUTPUTSHOW_USER.
DAT$SHOWUSERS$!
$!
ProcesstheinformationinSHOW_USER.
DAT$OPEN/READINFILESHOW_USER.
DAT$READINFILERECORD.
.
.
$CLOSEINFILE$EXIT在以下例子中,SYS$OUTPUT定义为一个空设备(NL:).
$DEFINE/USER_MODESYS$OUTPUTNL:$APPENDNEW_DATA.
DATSTATS.
DAT.
.
.
/USER_MODE限定词用来建立一个临时逻辑名赋值,它只是在下一个映象完成之前才有效.
在这个命令执行之后,SYS$OUTPUT回复到默认定义(通常是终端).
您不能使用DEFINE/USER_MODE命令重定向在命令解释程序内执行的DCL命令的输出.
作为代替,使用DEFINE命令重新定义SYS$OUTPUT,并且使用DEASSIGN命令删除不再使用的定义.
下表完整列出在命令解释程序内执行的DCL命令:=ALLOCATEASSIGNATTACHCALLCANCELCLOSECONNECTCONTINUECREATE/LOGICAL_NAME_TABLEDEALLOCATEDEASSIGNDEBUGDECKDEFINEDEFINE/KEYDELETE/SYMBOLDISCONNECTELSEENDIFENDSUBROUTINEEODEXAMINEEXITUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumGOSUBGOTOIFINQUIREONOPENREADRECALLRETURNSETCONTROLSETDEFAULTSETKEYSETONSETOUTPUT_RATESETPROMPTSETPROTECTION/DEFAULTSETSYMBOL/SCOPESETUICSETVERIFYSHOWDEFAULTSHOWKEYSHOWPROTECTIONSHOWQUOTASHOWSTATUSSHOWSYMBOLSHOWTIMESHOWTRANSLATIONSPAWNSTOPSUBROUTINETHENWAITWRITE以下例子展示将用来把SHOWTIME命令的输出重定向到文件TIME.
DAT的命令.
在解除赋值SYS$OUTPUT之后,它又回复到默认定义(终端).
$DEFINESYS$OUTPUTTIME.
DAT$SHOWTIME$DEASSIGNSYS$OUTPUT14.
7.
3从命令过程返回数据全局符号和逻辑名把来自命令过程的数据返回给调用过程或给DCL命令级.
您可以在任何命令级读取全局符号或逻辑名.
逻辑名可以把嵌套命令过程的数据返回给调用过程.
以下例子展示命令过程如何使用全局赋值语句建立的全局符号传递值:$@DATA"PaulCramer"$!
DATA.
COM$!
$!
P1isafullname.
$!
NAME.
COMreturnsthelastnameinthe$!
globalsymbolLAST_NAME.
$!
$@NAME'P1'$!
NAME.
COM$!
P1isafirstnameUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
P2isalastname$!
returnP2intheglobalsymbolLAST_NAME$LAST_NAME==P2$EXIT$!
writeLAST_NAMEtotheterminal$WRITESYS$OUTPUT"LAST_NAME=''LAST_NAME'"LAST_NAME=CRAMERDATA.
COM调用命令过程NAME.
COM,为NAME.
COM传递一个全名.
NAME.
COM把它的姓放入全局符号LAST_NAME.
NAME.
COM完成时,DCL继续执行DATA.
COM,指定全局符号LAST_NAME读取它的姓.
命令过程NAME.
COM将放入一个单独文件中.
为清晰起见,这个例子以缩排展示.
在这个命令过程中,REPORT.
COM获得一个报告的文件名,把这个文件名赋予逻辑名REPORT_FILE,并且执行一个把报告写入REPORT_FILE的程序:$!
Obtainthenameofafileandthenrun$!
REPORT.
EXEtowriteareporttothefile$!
$INQUIREFILE"Nameofreportfile"$DEFINE/NOLOGREPORT_FILE'FILE'$RUNREPORT$EXIT在以下例子中,命令过程REPORT.
COM被另一个过程调用.
调用过程使用逻辑名REPORT_FILE查看这个报表文件.
$!
Commandprocedurethatupdatesdatafiles$!
andoptionallypreparesreports$!
$UPDATE:.
.
.
$INQUIREREPORT"Prepareareport[YorN]"$IFREPORTTHENGOTOREPORT_SEC$EXIT$!
$REPORT_SEC:$@REPORTUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$WRITESYS$OUTPUT"Reportwrittento",F$TRNLNM("REPORT_FILE")$EXIT14.
7.
4重定向出错消息以下几节描述如何重定向出错消息.
14.
7.
4.
1重定义SYS$ERROR按照默认,命令过程把系统出错消息发送到SYS$ERROR指出的文件.
您可以重新定义SYS$ERROR把系统出错消息指引到一个指定的文件.
然而,如果SYS$ERROR的重新定义不同于SYS$OUTPUT(或如果重新定义SYS$OUTPUT,但没有重新定义SYS$ERROR),那么使用标准系统出错显示机制的DCL命令和映象将把系统出错级和系统严重级的出错消息发送到SYS$ERROR和SYS$OUTPUT.
因此,您会两次接收到这些消息---一次是在SYS$ERROR定义指出的文件中,而另一次是在SYS$OUTPUT指出的文件中.
成功、通知和警告级的消息只发送到SYS$OUTPUT指出的文件.
如果想要抑制DCL命令的系统出错消息,要确保SYS$ERROR和SYS$OUTPUT都不能等同于终端.
如果从命令过程运行一个自己的映象并且该映象引用SYS$ERROR,那么该映象把系统出错消息只发送到SYS$ERROR指出的文件---即使SYS$ERROR不同于SYS$OUTPUT.
当这些文件不同时,只有使用标准系统出错显示机制的DCL命令和映象才把消息同时发送到SYS$ERROR和SYS$OUTPUT.
这个命令过程接受目录名作为参数,把默认设置到这个目录,然后清除这个目录中的文件.
为了抑制系统出错消息,这个过程临时把SYS$ERROR和SYS$OUTPUT定义为空设备:$!
Purgefilesinadirectoryandsuppressmessages$!
$SETDEFAULT'P1'$!
Suppressmessages$!
$DEFINE/USER_MODESYS$ERRORNL:$DEFINE/USER_MODESYS$OUTPUTNL:$PURGE$EXIT14.
7.
4.
2抑制系统出错消息也可以使用SETMESSAGE命令抑制系统消息.
使用限定词/NOFACILITY、/NOIDENTIFICATION、/NOSEVERITY或/NOTEXT,可以抑制设施名、消息标识、严重级或消息文本.
在以下例子中,设施、标识、严重性和文本消息被临时抑制,直到发出第二个SETMESSAGE命令:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
Purgefilesinadirectoryandsuppresssystemmessages$!
$SETDEFAULT'P1'$!
Suppresssystemmessages$!
$SETMESSAGE/NOFACILITY-/NOIDENTIFICATION-/NOSEVERITY-/NOTEXT$PURGE$SETMESSAGE/FACILITY-/IDENTIFICATION-/SEVERITY/TEXT$EXIT14.
8读取和写入文件(文件I/O)从命令过程读取和写入文件的基本步骤是:步骤动作1使用OPEN命令打开文件.
这将把一个逻辑名赋值给这个文件,并且指定文件是否是读取、写入或读取和写入两者.
后续的READ、WRITE和CLOSE命令使用这个逻辑名来查看文件.
2使用READ或WRITE命令把记录读取或写入到文件.
完成输入和输出文件的方法通常是设计一个循环,在循环内读取记录、处理记录并且把修改的记录写入到同一文件或另一个文件.
3使用CLOSE命令关闭文件.
如果您没有包括CLOSE命令,文件就保持打开,直到注销为止.
注意由于注册时系统打开与进程并存的文件,如SYS$INPUT、SYS$OUTPUT、SYS$COMMAND和SYS$ERROR,因此您不必为读取或写入它们而明确地打开这些文件.
以下几节描述:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum使用OPEN命令写入文件使用WRITE命令使用READ命令使用关闭命令修改文件o更新记录o建立新的输出文件o为文件附加记录14.
9使用OPEN命令OPEN命令打开顺序、相对或索引顺序文件.
被打开的文件是与进程并存的;在您的进程期间,它们保持打开,除非您明确地关闭它们(使用CLOSE命令).
在打开文件时,它们受到OpenVMSRMS对使用与进程并存文件的约束.
打开文件时,OPEN命令把一个逻辑名(指定为第一个参数)分配给这个文件(指定为第二个参数),并把这个名称放入进程逻辑名表.
后续的READ、WRITE和CLOSE命令使用这个逻辑名引用这个文件.
在以下例子中,OPEN命令把逻辑名INFILE分配给文件DISK4:[MURPHY]STATS.
DAT:$OPEN/READINFILEDISK4:[MURPHY]STATS.
DAT注意OPEN命令中的逻辑名必须唯一.
如果OPEN命令不起作用,而您的命令又似乎是正确的,那么更改OPEN命令中的逻辑名.
要显示一列逻辑名定义,可使用SHOWLOGICAL命令.
要确保命令过程可以存取正确的文件,使用完整文件说明(例如,DISK4:[MURPHY]STATS.
DAT)或者在打开文件之前使用SETDEFAULT命令指定适当的设备和目录.
您也可以指定可共享的文件.
/SHARE限定词允许其他已打开的文件.
另外,用户可以用DCL命令TYPE和SEARCH存取可共享的文件.
OPEN/READ命令打开文件,分配逻辑名给这个文件,并把记录指针放置在文件的开始.
打开文件读取时,可以读取但是不能写入记录.
每次您读取一个记录,指针移动到下一个记录.
在这个命令过程中,OPEN/READ命令打开文件STATS.
DAT,并为这个文件分配逻辑名INFILE:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$OPEN/READINFILEDISK4:[MURPHY]STATS.
DAT$READ_FILE:$READ/END_OF_FILE=DONEINFILEDATA$GOTOREAD_FILE$DONE:$CLOSEINFILE$EXIT当您想要写入新文件时,使用OPEN/WRITE命令.
OPEN/WRITE命令按打印文件格式建立顺序文件.
这个文件的记录格式是可变的,带固定的控制(VFC)的2字节记录报头.
/WRITE限定词不能与/APPEND限定词一起使用.
如果指定一个已经存在的文件,那么OPEN/WRITE命令打开一个新文件,其版本号比现有文件大1个数.
在以下例子中的命令过程建立一个可以写入的新文件(NAMES.
DAT):$OPEN/WRITEOUTFILEDISK4:[MURPHY]NAMES.
DAT$UPDATE:$INQUIRENEW_RECORD"Entername"$WRITEOUTFILENEW_RECORD$IFNEW_RECORD.
EQS.
""THENGOTOEXIT_CODE$GOTOUPDATE$EXIT_CODE:$CLOSEOUTFILE$EXITOPEN/APPEND命令把记录附加到现有文件的末端.
如果尝试打开一个不存在的文件,那就产生一个错误,并且不打开这个文件.
/APPEND限定词不能与/WRITE限定词一起使用.
在以下例子中,记录被附加到现有文件NAMES.
DAT的末端:$OPEN/APPENDOUTFILEDISK4:[MURPHY]NAMES.
DAT$INQUIRENEW_RECORD"Entername"$WRITEOUTFILENEW_RECORD.
.
.
$CLOSEOUTFILEUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumOPEN/READ/WRITE命令把记录指针放置在文件的开始,因而可以读取第一个记录.
当使用这个方法打开文件时,只可以替换最近读取的记录;不能写入新的记录到文件尾.
另外,修正的记录必须与替换的记录有同样的大小.
在以下例子中,记录指针放置在文件STATS.
DAT的开始,因而可以读取第一个记录:$OPEN/READ/WRITEFILEDISK4:[MURPHY]STATS.
DAT14.
10写入文件要写入文件,使用以下过程:步骤动作1打开文件以便写入.
2用一个标号开始写入循环.
文件I/O总是在一个循环中完成,除非您写入或读取单个记录.
3读取要写入的数据.
使用INQUIRE命令或READ命令把数据读入一个符号.
4测试数据.
检查包含数据的符号.
如果这个符号为空(例如,如果按下Return并且在这行中没有输入数据),就到达写入文件数据的末端,并且应该结束循环.
否则,继续.
5把数据写入文件.
使用WRITE命令把符号的值(一个记录)写入文件.
6返回到循环的开始.
您保持在循环内,直到没有更多的数据写入文件.
7结束循环并关闭文件.
以下命令过程把数据写入新文件STATS.
DAT.
如果这个名称的文件存在,就建立一个新版本.
$!
Writeafile$ONERRORTHENEXIT!
Exitifthecommandprocedurecannotopenthefile$OPEN/WRITEIN_FILEDISK4:[MURPHY]STATS.
DAT!
OpenthefileUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$ONCONTROL_YTHENGOTOEND_WRITE!
ClosethefileifyouquitexecutionwithCtrl/Y$ONERRORTHENGOTOEND_WRITE!
Closethefileifanerroroccurs$WRITE:Begintheloop$INQUIRESTUFF"Inputdata"Promptforinput$IFSTUFF.
EQS.
""THENGOTOEND_WRITE!
Testfortheendofthefile$WRITEIN_FILESTUFF!
Writetothefile$GOTOWRITE!
Gotothebeginning$END_WRITE:Endtheloop$CLOSEIN_FILE!
Closethefile14.
10.
1使用唯一文件名建立文件要用唯一名建立文件,使用F$SEARCH词法函数可查看这个名称是否已经在目录中.
(有关F$SEARCH的详情,请参阅OpenVMSDCLDictionary对词法函数的描述.
)这个命令过程提示用户输入一个文件名,然后使用F$SEARCH词法函数在默认目录中搜索这个名称.
如果已经存在这个名称的文件,则把控制传递到ERROR_1,这个过程打印消息"Thefilealreadyexists",并把控制返回到标号GET_NAME.
然后这个过程提示输入另一个文件名,如以下例子所示:$!
FILES.
COM$!
$GET_NAME:$INQUIREFILE"File"Prompttheuserforafilename$IFF$SEARCH(FILE).
NES.
Makesurethefilenameisunique$THEN$WRITESYS$OUTPUT"Thefilealreadyexists"$GOTOGET_NAME$ELSE$OPEN/WRITEIN_FILE'FILE'!
OpenthefilewithWRITEaccess$ENDIF.
.
.
$EXIT14.
11使用WRITE命令以下几节描述如何使用WRITE命令.
14.
11.
1指定数据UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum当您为WRITE命令指定数据时,遵循第12章描述的字符串表达式规则.
可以按以下方法指定数据:指定按字符串表达式写入数据.
WRITE命令自动替换符号和词法函数.
作为文字字符串把一个字符串写入输出文件.
WRITE命令对括入引号的字符串不执行符号替换.
结合文字字符串和符号名.
要强制符号替换,把整个字符串放入引号内,并且在这个符号之前使用双省略号标识它,而在它之后放置一个单省略号.
结合文字字符串和符号名的另一个方法是,在这个符号之前和之后插入一个逗号,用引号括住定界的符号,然后把整个字符串括入引号内.
例如:$WRITEOUTFILE"Countis",COUNT,".
"在WRITE命令行中使用省略号强制符号替换.
使用省略号强制在字符串内的符号替换,可结合文字字符串和词法函数.
例子$!
Definesymbols$!
$CREATED="FilecreatedApril15,2002"$COUNT=4$P4="fourthparameter"$!
$!
OpenthefileDATA.
OUTforwriting$!
$OPEN/WRITEOUTFILEDISK4:[MURPHY]DATA.
OUT$!
$WRITEOUTFILECREATED(1)$WRITEOUTFILE"CREATED"2)$!
$WRITEOUTFILE"Countis''COUNT'.
"(3)$WRITEOUTFILEP'COUNT'4)$!
$WRITEOUTFILE"Modeis''f$mode()'"(5)$!
$CLOSEOUTFILE$TYPEDISK4:[MURPHY]DATA.
OUT[Return](6)FilecreatedApril15,2002CREATEDUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumCountis4.
fourthparameterModeisINTERACTIVE$检查这个例子时,注意以下几点:1.
指定数据作为字符串表达式写入.
2.
把字符串CREATED作为文字字符串写入输出文件.
3.
结合文字字符串和符号名.
4.
在WRITE命令行中使用省略号强制符号替换.
在这个例子中,WRITE命令替换符号COUNT的值,并在结果命令串(P4)执行符号替换.
5.
结合文字字符串和词法函数.
6.
显示由以前的WRITE命令写入输出文件DATA.
OUT的数据.
14.
11.
2使用/SYMBOL限定词当WRITE命令写入一个记录时,它把记录指针定位在刚才写入的记录之后.
WRITE命令写入的记录可以多达2,048个字节长.
如果存在以下任意一个条件,则使用/SYMBOL限定词写入记录:记录长度比1,024个字节要长.
在WRITE命令中的表达式比255个字节要长.
有关写入长记录的详情,请参阅OpenVMSDCLDictionary对WRITE命令的描述.
14.
11.
3使用/UPDATE限定词您可以使用带/UPDATE限定词的WRITE命令更改记录,而不是插入新记录.
要使用/UPDATE限定词,必须打开文件供读取和写入.
14.
12使用READ命令使用READ命令读取记录,并把它的内容赋值给一个符号.
您可以使用READ命令读取小于或等于1,024个字符长的记录.
要从一个文件中读取数据,使用以下过程:步骤动作1为读取打开文件.
2用一个标号开始读取循环.
文件I/O总是在循环中完成,除非您读取或写入单个记录.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum3从这个文件读取数据.
使用带/END_OF_FILE限定词的READ命令读取记录,并把它的内容赋值给一个符号.
当到达文件尾时,/END_OF_FILE限定词使DCL把控制传递给/END_OF_FILE限定词指定的标号.
一般,您指定标记读取循环结束的标号.
4处理数据.
顺序地读取文件时,处理当前记录然后读取下一个记录.
5返回到循环的开始.
保持在循环内,直到达到文件尾.
6结束循环并关闭文件.
以下命令过程读取和处理文件STATS.
DAT中的每个记录.
这个过程重复地执行READ命令,直到返回文件结束状态.
然后,这个过程转移到标记为END_READ的行.
$OPEN/READINFILEDISK4:[MURPHY]STATS.
DAT!
Openthefile$!
$READ_DATA:Begintheloop$READ/END_OF_FILE=END_READINFILERECORD!
Readarecord;testforendoffileProcessthedata.
.
.
$GOTOREAD_DATA!
Gotothebeginningoftheloop$END_READ:Endofloop$CLOSEINFILE!
Closethefile$EXIT为READ命令指定一个符号名时,命令解释程序把这个符号名放在当前命令级的局部符号表.
如果为一个以上READ命令使用同一符号名,那么每个READ命令重新定义这个符号名的值.
例如,在上面的例子中,每次循环时,READ命令从输入文件(STATS.
DAT)读取新记录.
然后,它使用这个记录重新定义符号RECORD的值.
14.
12.
1使用/END_OF_FILE限定词您读取文件时,通常您读取并处理每个记录,直到文件尾.
使用READ命令的/END_OF_FILE限定词可以构造一个循环,在循环中从文件读取记录、处理记录并且当完成读取所有记录时退出循环.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum注意,为/END_OF_FILE限定词指定的标号与GOTO命令指定的标号遵循同样的规则.
(有关使用GOTO命令的详情,请参阅第13章.
)在循环中使用READ命令时,您应该总是使用/END_OF_FILE限定词.
否则,当OPENVMS记录管理服务(OpenVMSRMS)返回指出文件结束的出错条件时,命令解释程序就执行当前ON命令指定的出错动作.
例如,OpenVMSRMS返回出错状态%RMS-E-EOF.
这回使命令过程退出,除非这个过程已建立自己的出错处理.
14.
12.
2使用/INDEX和/KEY限定词要随机地从索引顺序文件读取记录,使用READ命令限定词/INDEX和/KEY.
这些限定词指定应该这样从文件读取记录:在索引中查找指定的键并返回与这个键关联的记录.
如果不指定一个索引,则使用主索引(0).
在随机地读取一个记录之后,使用不带/KEY或/INDEX限定词的READ命令可以顺序地读取文件的剩余部分.
14.
12.
3使用/DELETE限定词您可以使用带/DELETE限定词的READ命令从索引顺序文件中删除记录.
/DELETE限定词使一个记录在读取之后从文件删除.
使用带/INDEX和/KEY限定词的/DELETE限定词可删除一个给定键指定的记录.
有关/DELETE、/INDEX和/KEY限定词的详情,请参阅OpenVMSDCLDictionary对READ命令的描述.
14.
13使用关闭命令CLOSE命令关闭文件,并解除由OPEN命令建立的逻辑名的赋值.
确信在命令过程终止之前,关闭在命令过程中打开的所有文件.
如果不能关闭打开的文件,那么当命令过程终止时这个文件仍然保持打开,并且已分配给打开文件的逻辑名不会从进程逻辑名表删除.
在以下例子中,CLOSE命令关闭文件STATS.
DAT并解除逻辑名INFILE赋值:$OPENINFILEDISK4:[MURPHY]STATS.
DAT.
.
.
$CLOSEINFILE14.
14修改文件本节描述修改文件的三种方法:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum更新记录建立新的输出文件附加记录14.
14.
1更新记录使用更新方法修改记录时,您可以对文件的少量记录进行较小更改.
因为这个方法不允许您更改记录的大小或者文件中的记录数,因此只对格式记录的文件才使用它(例如,在数据文件中).
要对文件进行较小更改,使用这个过程:步骤动作1打开有读和写存取权文件.
2使用READ命令通读文件,直至想要修改的记录.
3修改这个记录.
在顺序文件中,这个记录的文本大小必须完全与原始记录一样.
如果修改记录的文本较短,那么用空格记录填充,把空格添加到修改记录的末端,直到它与原始记录长度相同.
如果修改记录的文本较长,则需要建立新文件.
4使用WRITE/UPDATE命令把修改记录写回原来的文件.
5重复步骤2至4,直到更改了打算更改的所有记录.
6使用CLOSE命令关闭这个文件.
您关闭这个文件之后,它包含与开始时同样的版本号,即使个别记录已被更改.
以下命令过程展示如何通过读取和更新个别记录更改顺序文件:$!
OpenSTATS.
DATandassignitthelogicalnameFILE$!
$OPEN/READ/WRITEFILEDISK4:[MURPHY]STATS.
DAT$BEGIN_LOOP:$!
ReadthenextrecordfromFILEintothesymbolRECORD$READ/END_OF_FILE=END_LOOPFILERECORD$!
Displaytherecordandseeiftheuserwantstochangeit$!
Ifyes,getthenewrecord.
Ifno,repeatloop$!
$PROMPT:WRITESYS$OUTPUTRECORDINQUIRE/NOPUNCTUATIONOK"ChangeYorN[Y]"UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumIFOK.
EQS.
"N"THENGOTOBEGIN_LOOPINQUIRENEW_RECORD"Newrecord"$!
Comparetheoldandnewrecords$!
Ifoldrecordisshorterthannewrecord,issuean$!
errormessage.
Ifoldrecordandnewrecordarethe$!
samelength,writetherecord.
Otherwisepadthenew$!
recordwithspacessoitiscorrectlength$!
OLD_LEN=F$LENGTH(RECORD)NEW_LEN=F$LENGTH(NEW_RECORD)IFOLD_LEN.
LT.
NEW_LENTHENGOTOERRORIFOLD_LEN.
EQ.
NEW_LENTHENGOTOWRITE_RECORDSPACESPAD=F$EXTRACT(0,OLD_LEN-NEW_LEN,SPACES)NEW_RECORD=NEW_RECORD+PAD$!
$WRITE_RECORD:WRITE/UPDATEFILENEW_RECORDGOTOBEGIN_LOOP$!
$ERROR:WRITESYS$OUTPUT"Error--Newrecordistoolong"GOTOPROMPT$!
$END_LOOP:CLOSEFILEEXIT系统把记录显示在终端上,并问您记录是否需要修改.
如果您选择修改记录,就从终端读取新记录,并且把它的长度与原始记录长度进行比较.
如果原始记录较长,那么填充额外的空格使新记录有同样的大小.
如果原始记录较短,则系统显示出错消息并且再次提示输入新记录.
14.
14.
2建立新的输出文件要对文件进行大的更改,打开用于读存取的文件并且打开用于写存取的新文件.
因为是建立新的输出文件,因此可以修改记录的大小、添加记录、删除记录或插入记录.
OPEN/WRITE命令打开新文件用于写存取.
新文件可以有与原始文件同样的名称,并且版本号比旧文件的版本号大1.
注意要确保打开正确的文件用于读取,在打开用于写存取的新版本之前,必须打UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum开用于读存取的现有文件.
要建立可以修改的文件,使用以下过程:步骤动作1打开用于读存取的文件.
这是输入文件,也是您修改的文件.
2打开一个用于写存取的新文件.
这是输出文件,也是您建立的文件.
如果给出的输出文件与输入文件同名,那么输出文件的版本号将有比输入文件大1.
3使用READ命令从修改的文件读取每个记录.
当您从原始文件读取每个记录时,决定如何处理这个记录.
4继续读取和处理记录,直到完成.
5使用CLOSE命令关闭输入文件和输出文件.
在以下表格中,符号RECORD包含从原始文件读取的记录:如果记录是那么不更改把同样的符号写入新文件.
更改使用INQUIRE命令把不同的记录读入这个符号,然后把这个修改符号写入新文件.
删除不把这个符号写入新文件.
插入使用一个循环把记录读入这个符号,然后把这个符号写入新文件.
例子:修改记录在以下例子中,符号NEW_FILE被写入新文件:$!
Nochange$WRITENEW_FILERECORD在以下例子中,INQUIRE命令用来把一个已修改的符号写入新文件:$!
ChangeUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$INQUIRENEW_RECORD"Newrecord"$WRITENEW_FILENEW_RECORD在以下例子中,使用一个循环把符号写入新文件:$!
Insertion$LOOP:$!
Getnewrecordstoinsert$INQUIRENEW_RECORD"Newrecord"$IFRECORD.
EQS.
""THENGOTOEND_LOOP$WRITENEW_FILENEW_RECORD$GOTOLOOP$END_LOOP:例子:建立输出文件以下例子展示一个命令过程,它从输入文件读取记录,处理这个记录,然后把这个记录复制到一个输出文件:$!
OpenSTATS.
DATforreadingandassignit$!
thelogicalnameINFILE$!
OpenanewversionofSTATS.
DATforwriting$!
andassignitthelogicalnameOUTFILE$!
$OPEN/READINFILEDISK4:[MURPHY]STATS.
DAT$OPEN/WRITEOUTFILEDISK4:[MURPHY]STATS.
DAT$!
$BEGIN_LOOP:$!
ReadthenextrecordfromINFILEintothesymbolRECORD$!
$READ/END_OF_FILE=END_LOOPINFILERECORD$!
Displaytherecordandseeiftheuserwantstochangeit$!
Ifyes,getthenewrecord$!
Ifno,writerecorddirectlytoOUTFILE$!
$PROMPT:WRITESYS$OUTPUTRECORDINQUIRE/NOPUNCTUATIONOK"ChangeYorN[Y]"IFOK.
EQS.
"N"THENGOTOWRITE_RECORDINQUIRERECORD"Newrecord"$!
$WRITE_RECORD:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumWRITEOUTFILERECORDGOTOBEGIN_LOOP$!
$!
Closeinputandoutputfiles$END_LOOP:CLOSEINFILECLOSEOUTFILEEXIT14.
14.
3为文件附加记录使用以下过程(OPEN/APPEND命令)把记录附加到现有文件的末端:步骤动作1使用带/APPEND限定词的OPEN命令把记录指针定位在文件尾.
/APPEND限定词不建立文件的新版本.
2使用WRITE命令写入新的数据记录.
3继续添加记录,直到完成.
4使用CLOSE命令关闭这个文件.
以下命令过程把记录附加到文件STATS.
DAT的末端:$!
OpenSTATS.
DATtoappendfilesandassign$!
itthelogicalnameFILE$!
$OPEN/APPENDFILEDISK4:[MURPHY]STATS.
DAT$!
$BEGIN_LOOP:$!
Obtainrecordtobeappendedandplacethis$!
recordinthesymbolRECORD$!
$PROMPT:INQUIRERECORD-"Enternewrecord(pressRETtoquit)"IFRECORD.
EQS.
""THENGOTOEND_LOOP$!
WriterecordtoFILE$!
WRITEFILERECORDGOTOBEGIN_LOOP$!
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
CloseFILEandexit$!
$END_LOOP:CLOSEFILEEXIT14.
15处理文件I/O出错对OPEN、READ或WRITE命令使用/ERROR限定词可抑制系统出错消息,并把控制传递到指定的标号.
如果在输入或输出操作期间出错,那么/ERROR限定词取代所有其他出错控制机制(除了在READ命令上的/END_OF_FILE限定词之外).
以下例子对OPEN命令使用/ERROR限定词:$OPEN/READ/ERROR=CHECKFILECONTINGEN.
DOC.
.
.
$CHECK:$WRITESYS$OUTPUT"Erroropeningfile"OPEN命令请求打开文件CONTINGEN.
DOC用于读取.
如果不能打开这个文件(例如,这个文件不存在),那么OPEN命令返回一个出错条件,并把控制传递到CHECK标号.
/ERROR限定词指定的出错路径取代其命令级建立的当前ON条件.
如果出错并且目标标号被成功地给出控制,那么保留的全局符号$STATUS保持出错代码.
可以在出错处理例行程序中使用F$MESSAGE词法函数来显示$STATUS中的消息.
在以下例子中,词法函数F$MESSAGE用来显示F$STATUS词汇的内容:$OPEN/READ/ERROR=CHECKFILE'P1'.
.
.
$CHECK:$ERR_MESSAGE=F$MESSAGE($STATUS)$WRITESYS$OUTPUT"Erroropeningfile:",P1$WRITESYS$OUTPUTERR_MESSAGE.
.
.
14.
15.
1默认出错动作UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum使用OPEN、READ、WRITE或CLOSE命令时,如果出错,并且没有指定出错动作,那么采取当前的ON命令动作.
READ命令接收一条文件结束消息时,其出错动作确定如下:如果使用/END_OF_FILE限定词,控制被传递到指定的标号.
如果没有使用/END_OF_FILE限定词,控制就被传递到/ERROR限定词指定的标号.
如果没有指定任意一个限定词(/END_OF_FILE或/ERROR),那么采取当前的ON命令动作.
14.
16控制执行流的技术命令过程的正常执行流是顺序的:过程中的命令依次执行,直到文件尾.
然而,您也可以控制某些语句是否执行,或者过程在什么条件下应该继续执行.
以下几节论述:可以用来控制或改变执行流的DCL命令:oIF,THEN,ELSEoGOTOoGOSUBoCALL使用命令块编写Case语句编写循环14.
16.
1使用IF命令IF命令测试表达式的值,当表达式的结果为真时执行一个命令或一块命令.
当表达式的结果为假时,发生以下情况之一:当一个命令跟随THEN命令时,就不执行它,而执行后面的命令.
当一块命令跟随THEN命令而没有指定ELSE命令时,这个命令就立即执行后面的ENDIF命令.
指定ELSE命令时,就执行这个命令或跟随ELSE命令的一块命令.
DCL为IF命令提供两个不同格式.
当为这个IF命令指定的表达式为真时,第一个格式执行单个命令,如第13章所述.
DCL也提供一个块结构IF格式.
如果指定的表达式为真,那么块结构IF命令执行一个以上命令,并且接受可选的ELSE语句,如果表达式为假它执行一个或多个命令.
14.
16.
2使用THEN命令UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum当表达式为真时要执行一个以上命令,可指定THEN命令为一个动词(前面加上美元符的DCL命令),并且用ENDIF语句终止作为结果的块结构语句.
在以下例子中,THEN语句用作一个动词:$IFexpression$THEN$command$command.
.
.
$ENDIF14.
16.
3使用ELSE命令当表达式为假时要执行一个或多个命令,可指定ELSE语句为一个动词,并且用ENDIF语句终止作为结果的块结构语句.
在以下例子中,ELSE命令用作一个动词:$IFexpression$THEN$command$command.
.
.
$ELSE$command$command.
.
.
$ENDIF14.
16.
4使用命令块命令块可以按几种方法执行,这取决于您是把这些命令放在同一命令过程,或是把它们放入另一个命令过程并在那里执行.
其指引如下:如果把这些命令放在同一命令过程中,那么把它们放在THEN语句之后.
例如:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$IFcondition$THENcommandcommand.
.
.
$ENDIF如果把这些命令放入一个单独的过程,那么调用这个命令过程以作为THEN语句的一部分.
例如:$IFcondition$THEN@command_procedure$ELSEcommand$command$ENDIF可以继续指定非块结构的IF格式,并且当满足指定的条件时把控制流指引到标号的区域.
例如:$IFnotconditionTHENGOTOEND_LABEL.
.
.
$END_LABEL:当IF表达式的结果为真时,您可以执行在THEN命令之后的一块命令.
使用一块命令时,把THEN命令作为第一个命令放在跟随IF命令的命令行上.
在以下例子中,当F$MODE等于"INTERACTIVE"时,执行两个SETTERMINAL命令并且把这个过程的控制传递给标号PROCEED.
当F$MODE不等于"INTERACTIVE"时,退出这个过程.
$IFF$MODE().
EQS.
"INTERACTIVE"$THEN$SETTERMINAL/DEVICE=VT320$SETTERMINAL/WIDTH=132$GOTOPROCEED$ENDIF$EXIT$PROCEED:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum以下例子说明如何使用IF命令和ELSE命令连在一起的命令块:$INQUIREDEV"Devicetocheck"$IFF$GETDVI(DEV,"EXISTS")$THEN$WRITESYS$OUTPUT"Thedeviceexists.
"$SHOWDEVICE'DEV'$SETDEVICE/ERROR_LOGGING'DEV'$ELSE$WRITESYS$OUTPUT"Thedevicedoesnotexist.
"$WRITESYS$OUTPUT"Errorlogginghasnotbeenenabled.
"$ENDIF$EXIT当条件为真时,这个过程把一条消息写入SYS$OUTPUT并执行SHOWDEVICE和SETDEVICE命令.
当条件不为真时,这个过程把两条消息写入SYS$OUTPUT.
您使用IF-THEN-ELSE语言结构时,遵循以下限制:IF语句的嵌套级不能超过15级.
使用ELSE或ENDIF语句终止THEN语句开始的命令块.
使用ENDIF语句终止ELSE语句开始的命令块.
在IF语句之后使用THEN语句作为第一个可执行语句.
不要在包含THEN或ELSE语句的命令行上指定标号.
然而,您可以在包含ENDIF语句的命令行上指定标号.
程序可以在当前命令块内分支,但是不建议分支到另一个命令块的中间.
真表达式这个跟随IF命令的表达式可以包括一个或多个数字常数、串文字、符号名或词法函数,并且用逻辑、算术或字符串运算符分隔.
如果一个表达式有以下值之一,它就为真:奇数值从字母Y、y、T或t开始的字符串值包含可形成奇数值的数字的字符串值(例如,字符串"27")假表达式如果一个表达式有以下值之一,它就为假:偶数值不是从字母Y、y、T或t开始的字符串值包含可形成偶数值的数字的字符串值(例如,字符串"28")UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum编写表达式为IF命令编写表达式时,坚持以下规则:在IF语句中使用符号时,它们的值被自动替换.
不必使用省略号(')作为替换运算符,除非需要强制迭代翻译.
字符串比较运算符结束于字母S.
例如,运算符.
EQS.
、.
LTS.
和.
GTS.
用于字符串比较.
相反,运算符.
EQ.
、.
LT.
和.
GT.
用于整数比较.
当测试查看两个字符串是否相同时,DCL查找的匹配字符串必须使用同样的字母大小写和次序.
即是说,字符串"COPY"不等于字符串"copy"或字符串"CoPy".
以下例子说明可以与IF命令一起使用的表达式.
对于其他例子,请参阅OpenVMSDCLDictionary对IF命令的描述.
第一个例子使用一个逻辑运算符,并且只执行跟随THEN语句的一个命令.
当符号CONT不为真时,退出这个过程.
$INQUIRECONT"Doyouwanttocontinue[Y/N]"$IF.
NOT.
CONTTHENEXIT.
.
.
以下例子在IF表达式中使用一个符号和一个标号:$INQUIRECHANGE"Doyouwanttochangetherecord[Y/N]"$IFCHANGETHENGOTOGET_CHANGE.
.
.
$GET_CHANGE:.
.
.
当符号CHANGE为真时,过程把控制传递到标号GET_CHANGE.
否则,过程执行跟随IF命令的命令.
下一个例子说明两个不同的IF命令:$COUNT=0UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$LOOP:$COUNT=COUNT+1$IFCOUNT.
EQ.
9THENEXIT$IFP'COUNT'.
EQS.
""THENEXIT.
.
.
$GOTOLOOP第一个IF命令比较两个整数;第二个IF命令比较两个字符串.
注意,.
EQ.
运算符用于整数比较,而.
EQS.
运算符用于字符串比较.
首先,COUNT值与整数9进行比较.
当这两个值相同时,就退出这个过程;当这两个值不相同时,过程继续.
处理八个参数(允许的最大数)后循环终止.
在第二个IF表达式中,符号P'COUNT'的字符串值与空串进行比较查看这个符号是否是未定义的.
注意,必须使用省略号强制对符号COUNT进行迭代替换.
例如,当COUNT是2时,第一个翻译的结果是P2.
然后,P2的值使用在字符串比较中.
当IF表达式的结果为真时,您也可以执行一个单独的命令过程.
以下例子当IF表达式的结果为真时,执行命令过程EXIT_ROUTINE.
COM:$GET_COMMAND_LOOP:$INQUIRECOMMAND-"Entercommand(DELETE,DIRECTORY,EXIT,PRINT,PURGE,TYPE)"$IFCOMMAND.
EQS.
"EXIT"THEN@EXIT_ROUTINE14.
16.
5使用GOTO命令GOTO命令把控制传递到在命令过程中的标号行.
(有关标号使用的详情,请参阅第13章.
)GOTO命令在THEN子句中特别有用,它使过程分支向前或向后.
例如,当使用命令过程的参数时,可以在过程开始测试参数,并转移到适当的标号.
GOTO或GOSUB命令的目标标号不能在IF-THEN-ELSE结构或单独的子例行程序之内.
在以下例子中,IF命令检查P1不是空串:$IFP1.
NES.
""THENGOTOOKAY$INQUIREP1"Enterfilespec"$OKAY:$PRINT/COPIES=10'P1'UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum.
.
.
如果P1是空串,就不执行GOTO命令,而INQUIRE命令提示输入参数值.
否则,GOTO命令使控制流绕过INQUIRE命令.
在任何一种情况下,该过程执行跟随行标号OKAY的PRINT命令.
在以下例子中GOTO命令返回出错消息,因为它的目标(TEST_1)在IF-THEN结构内:$GOTOTEST_1$EXIT$IF1.
EQ.
1$THENWRITESYS$OUTPUTWhatarewedoinghere"$TEST_1:$WRITESYS$OUTPUT"Gottothelabel"$ENDIF$EXIT14.
16.
5.
1避免重新执行您也可以使用GOTO命令避免重新执行已成功完成的部分作业.
要做到这一点,执行以下步骤:步骤动作1在过程中从一个标号开始每个可能的开始点.
2在这个标号之后,使用SETRESTART_VALUE=label-name命令设置到这个标号的重新启动点.
在执行SETRESTART_VALUE=label-name命令之后,如果批量作业被中断,那么当重新启动这个批量作业时,系统把适当的标号名赋值给全局符号BATCH$RESTART.
3在这个过程开始,测试符号$RESTART的值.
如果$RESTART为真,执行一个GOTO语句并且使用符号BATCH$RESTART作为转移标号.
$RESTART全局符号$RESTART是系统为您维护的保留全局符号.
如果一个批量作业中断后重新启动,那么$RESTART为真.
否则,$RESTART为假.
不能删除保留的全局符号$RESTART.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果命令过程有SETRESTART_VALUE命令,而您想要全部重新执行这个作业,可输入SETENTRY/NOCHECKPOINT命令删除这个全局符号BATCH$RESTART.
如果重新启动一个中断的作业,那么这个作业从它中断的位置开始执行.
这个命令过程展示如何使用在批量作业中的重新启动值:$!
Setdefaulttothedirectorycontaining$!
thefiletobeupdatedandsorted$SETDEFAULTDISK1:[ACCOUNTS.
DATA84]$$!
Checkforrestarting$IF$RESTARTTHENGOTO'BATCH$RESTART'$$UPDATE_FILE:$SETRESTART_VALUE=UPDATE_FILE.
.
.
$SORT_FILE:$SETRESTART_VALUE=SORT_FILE.
.
.
EXIT要把这个命令过程提交为一个可以重新启动的批量作业,那么当提交这个作业时,为SUBMIT命令使用/RESTART限定词.
因为中断的作业从中断的位置开始执行,因此在SORT_FILE例行程序期间如果这个作业中断,当重新启动时它就从标号SORT_FILE开始执行.
系统失败时,不会维护大部分进程环境.
经系统失败后被维护的符号只有$RESTART和BATCH$RESTART.
因此您应该在每个SETRESTART_VALUE命令之后或在如果$RESTART为真就会执行的THEN命令块中,重新定义用于您的命令过程的任何符号或进程逻辑名.
如果您在THEN命令块中定义符号和逻辑名,那么命令GOTO'BATCH$RESTART'应该是THEN命令块中的最后一个命令.
14.
16.
6使用GOSUB和RETURN命令在命令过程中GOSUB命令把控制传递到标号的子例行程序.
如果这个标号在命令过程中不存在,这个过程不能继续执行,并且被强制退出.
(有关标号的完整信息,请参阅第13章.
)每个过程级可以嵌套GOSUB命令最多16次.
GOSUB命令是局部子例行程序调用;它不建立新的过程级.
因此,在当前命令级中定义的所有标号和局部符号可用于GOSUB调用的子例行程序.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumRETURN命令终止子例行程序,并把控制返回到在GOSUB命令之后的命令.
您可以指定RETURN命令的$STATUS值,取代DCL在子例行程序结束时分配给$STATUS的值.
这个值必须是一个0至4之间的整数或者一个等价表达式.
如果为$STATUS指定一个值,DCL把这个值解释为一个条件代码.
如果不为$STATUS指定一个值,则就保存$STATUS的当前值.
以下例子展示如何使用GOSUB命令把控制传递到子例行程序:$!
$!
GOSUB.
COM$!
$SHOWTIME$GOSUBTEST1(1)$WRITESYS$OUTPUT"GOSUBlevel1hascompletedsuccessfully.
"$SHOWTIME$EXIT$!
$!
TEST1GOSUBdefinition$!
$TEST1:$WRITESYS$OUTPUT"ThisisGOSUBlevel1.
"$GOSUBTEST2(2)$RETURN%X1(3)$!
$!
TEST2GOSUBdefinition$!
$TEST2:$WRITESYS$OUTPUT"ThisisGOSUBlevel2.
"$WAIT00:00:02$RETURN(4)当您检查这个例子时,注意以下几点:1.
第一个GOSUB命令把控制传递到标号为TEST1的子例行程序.
2.
这个过程执行在子例行程序TEST1中的命令,转移到标号为TEST2的子例行程序.
3.
在子例行程序TEST1中的RETURN命令把控制返回到主命令过程,并且把值1传递给$STATUS,指出成功完成.
4.
在子例行程序TEST2中的RETURN命令把控制返回到子例行程序TEST1.
注意,这个命令在命令3之前执行.
14.
17建立新的命令级有两种方法可建立新的命令级:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在一个命令过程中使用执行过程(@)命令来嵌套命令过程,以调用另一个命令过程(如第13章所述).
使用CALL命令调用存在于命令过程中的子例行程序.
14.
17.
1使用CALL命令在命令过程中,CALL命令把控制传递到标号的子例行程序,并建立新的过程级.
CALL命令允许您在单个文件中保持一个以上的相关命令过程,从而使过程更易于管理.
子例行程序标号必须是唯一的,在命令过程中可以放在CALL命令之前或之后.
第13章包含输入子例行程序标号的规则.
除标号之外,您可以传递多达八个可选参数给子例行程序.
有关参数的完整信息,请参阅14.
2节.
以下是使用CALL命令的规则:把输出发送给SYS$OUTPUT有一个可选的/OUTPUT限定词,允许您把输出从子例行程序指引到一个文件对输出文件使用默认文件类型.
LIS输出文件说明中不接受通配符14.
17.
1.
1CALL命令的默认值以下是与使用CALL命令相关的附加默认:可以嵌套CALL命令调用的子例行程序和执行过程(@)命令调用的过程,最多可达32个命令级.
除非使用SETSYMBOL命令屏蔽,在外部级定义的局部符号可用于任何内部的过程或子例行程序级.
任何命令级都有全局符号.
标号只在定义它们的命令级才有效.
14.
17.
1.
2开始和结束子例行程序SUBROUTINE和ENDSUBROUTINE命令定义CALL子例行程序的开始和结束.
这个标号在SUBROUTINE命令之前定义子例行程序的入口点.
您可以把EXIT命令放置在ENDSUBROUTINE命令之前,但是对于终止子例行程序不是必需的.
ENDSUBROUTINE命令终止子例行程序,并把控制传递到在CALL命令之后的命令行.
只当子例行程序被CALL命令调用时,才执行这个子例行程序中的命令行.
在命令过程的逐行执行期间,命令语言解释程序跳过在SUBROUTINE和ENDSUBROUTINE命令之间的所有命令.
以下限制应用于定义子例行程序入口点的作用域和标号引用的使用:在另一个子例行程序中定义的子例行程序入口点局部于那个子例行程序.
如果一个子例行程序入口点是在一个单独的子例行程序块中,那么就不能调用这个子例行程序.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果一个子例行程序入口点定位在IF-THEN-ELSE块,就不能从IF-THEN-ELSE块的外部调用这个子例行程序.
每个SUBROUTINE命令必须有匹配的ENDSUBROUTINE命令结束子例行程序.
在以下例子中,因为CALLBAR命令在MAIN子例行程序之外,因此这个调用无效:$CALLBAR$$MAIN:SUBROUTINE$$BAR:SUBROUTINE$ENDSUBROUTINE$$ENDSUBROUTINE要使这个CALL命令起作用,必须把它放在SUBROUTINE和ENDSUBROUTINE点之间.
在这个例子中展示的调用不允许,因为它是在IF-THEN-ELSE块之内:$IF1$THEN$BOB:SUBROUTINE$ENDSUBROUTINE$ENDIF$CALLBOB以下例子包括两个子例行程序,称为SUB1和SUB2.
直到使用CALL命令调用它们,才执行这些子例行程序.
$$!
CALL.
COM$$!
DefinesubroutineSUB1.
$!
$SUB1:SUBROUTINE.
.
.
$CALLSUB2!
InvokeSUB2fromwithinSUB1.
.
.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum.
FILE!
Invokeanothercommandprocedurefile.
.
.
.
$EXIT$ENDSUBROUTINE!
EndofSUB1definition.
$!
$!
DefinesubroutineSUB2.
$!
$SUB2:SUBROUTINE$EXIT$ENDSUBROUTINE!
EndofSUB2definition.
$!
$!
Startofmainroutine.
Atthispoint,bothSUB1andSUB2$!
havebeendefinedbutnoneofthepreviouscommandshave$!
beenexecuted.
$!
$START:$CALL/OUTPUT=NAMES.
LOGSUB1"THISISP1".
.
.
$CALLSUB2"THISISP1""THISISP2".
.
.
$EXIT!
Exitthiscommandprocedurefile.
CALL命令调用子例行程序SUB1,并且把输出指引到文件NAMES.
LOG.
子例行程序SUB1调用子例行程序SUB2.
这个过程执行SUB2,使用执行过程(@)命令调用命令过程FILE.
COM.
当SUB1中的所有命令执行后,在主过程中的CALL命令第二次调用SUB2.
SUB2完成执行时,这个过程就退出.
14.
18编写Case语句Case语句是特殊的格式的条件代码,从一组命令块中执行其中一个,这取决于变量或表达式的值,.
通常,Case语句的有效值是每个命令块开始的标号.
使用指定的值作为GOTO语句的目标标号,Case语句把控制传递到适当的代码块.
要编写Case语句,必须:1.
列出标号.
2.
编写Case语句.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum3.
编写命令块.
14.
18.
1列出标号要列出标号,就使符号等同于一个包含一列用斜杠(或您挑选用作定界符的任何字符)定界的标号的字符串.
这个符号定义应该在命令块之前.
以下例子使符号COMMAND_LIST等同于标号PURGE、DELETE和EXIT:$COMMAND_LIST="/PURGE/DELETE/EXIT/"14.
18.
2编写Case语句要编写Case语句,遵循这个过程:步骤动作1使用INQUIRE命令获得Case变量的值.
2使用IF命令与F$LOCATE和F$LENGTH确定Case变量的值是否有效.
3如果Case变量有效,那么执行这个Case语句(与GOTO命令)把控制传递到适当的代码块.
否则,显示一条消息并退出,或者请求不同的Case值.
在以下例子中,标号等于完整的命令名.
因此,F$LOCATE把定界符包括在它的命令名搜索中,以确保这个命令不是缩写的.
$GET_COMMAND:$INQUIRECOMMAND-"Command(EXIT,PURGE,DELETE)"$IFF$LOCATE("/"+COMMAND+"/",COMMAND_LIST).
EQ.
-F$LENGTH(COMMAND_LIST)THENGOTOERROR_1$GOTO'COMMAND'.
.
.
$ERROR_1:$WRITESYS$OUTPUT"Nosuchcommandas''COMMAND'.
"$GOTOGET_COMMAND14.
18.
3编写命令块UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum每块命令可能包含一个或多个命令.
用唯一标号开始每个命令块.
把控制传递到在这列命令块之外的标号而结束每个命令块.
在以下例子中,每块命令开始于唯一标号(PURGE:、DELETE:),并且把控制传递到一个在当前命令块之外的标号(GOTOGET_COMMAND)而结束:$GET_COMMAND:.
.
.
$PURGE:$INQUIREFILE$PURGE'FILE'$GOTOGET_COMMAND$!
$DELETE:$INQUIREFILE$DELETE'FILE'$GOTOGET_COMMAND$!
$EXIT:14.
19编写循环您可以编写在这个命令块的开始测试变量的循环(如第13章所述).
然而,您也可以编写在循环的末端测试终止变量的循环,通过以下这个过程:步骤动作1开始循环.
2执行循环体的命令.
3更改终止变量.
4测试终止变量.
如果条件不满足,则前去循环的开始.
5结束循环.
注意,在循环末端测试终止变量时,在循环体中的命令至少执行一次,而不管终止变量的值.
在这个例子中展示的两个命令块执行一个当COMMAND等于"EX"(EXIT)时就终止的循环.
F$EXTRACT把COMMAND截短为它的前两个字符.
在第一个例子中,在循环的开始测试终止变量COMMAND;在第二个例子中,在循环末端测试.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
EXAMPLE1$!
$GET_COMMAND:$INQUIRECOMMAND-"Command(EXIT,DIRECTORY,TYPE,PURGE,DELETE,COPY)"$COMMAND=F$EXTRACT(0,2,COMMAND)$IFCOMMAND.
EQS.
"EX"THENGOTOEND_LOOP.
.
.
$GOTOGET_COMMAND$END_LOOP:$!
EXAMPLE2$!
$GET_COMMAND:$INQUIRECOMMAND-"Command(EXIT,DIRECTORY,TYPE,PURGE,DELETE,COPY)"$COMMAND=F$EXTRACT(0,2,COMMAND).
.
.
$IFCOMMAND.
NES.
"EX"THENGOTOGET_COMMAND$!
Endofloop要执行特定次数的循环,使用一个计数器作为终止变量.
在以下例子中,用户输入10个文件名并放入局部符号FIL1、FIL2、.
.
.
、FIL10:$NUM=1!
Setcounter$LOOP:Beginloop$INQUIREFIL'NUM'"File"Getfilename$NUM=NUM+1!
Updatecounter$IFNUM.
LT.
11THENGOTOLOOP!
Testfortermination$END_LOOP:Endloop.
.
.
以下例子使用一个计数器控制循环执行的次数.
这个循环执行10次;在循环末端测试终止变量:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
Obtain10filenamesandstoretheminthe$!
symbolsFILE_1toFILE_10$!
$COUNT=0$LOOP:$COUNT=COUNT+1$INQUIREFILE_'COUNT'"File"$IFCOUNT.
LT.
10THENGOTOLOOP$!
$PROCESS_FILES:.
.
.
符号COUNT用来记录在循环内命令的执行次数.
COUNT也用来建立符号名FILE_1、FILE_2,以此类推至FILE_10.
注意,COUNT的值在循环开始递增,而在循环末端测试.
因此,当COUNT从9增至10时,在IF语句发现假值之前执行最后一次循环(获得FILE_10的值).
要为已知顺序的值执行一个循环,使用F$ELEMENT词法函数.
F$ELEMENT词法函数从一列用定界符分隔的项目中获得项目.
您必须提供项目数、项目定界符和这个列表作为F$ELEMENT的变元.
有关如何使用F$ELEMENT词法函数的详情,请参阅OpenVMSDCLDictionary.
在以下例子中,文件CHAP1、CHAP2、CHAP3、CHAPA、CHAPB和CHAPC被依次处理:$FILE_LIST="1,2,3,A,B,C"$INDEX=0$PROCESS:$NUM=F$ELEMENT(INDEX,",",FILE_LIST)$IFNUM.
EQS.
","THENGOTOEND_LOOP$FILE="CHAP''NUM'"$!
processfilenamedbyFILE.
.
.
$INDEX=INDEX+1$GOTOPROCESS$END_LOOP:$EXIT在以下例子中,命令过程使用一个循环把在符号FILE_LIST中列出的文件复制到另一个节点的目录中:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$FILE_LIST="CHAP1/CHAP2/CHAP3/CHAP4/CHAP5"$NUM=0$!
$!
ProcesseachfilelistedinFILE_LIST$PROCESS_LOOP:$FILE=F$ELEMENT(NUM,"/",FILE_LIST)$IFFILE.
EQS.
"/"THENGOTODONE$COPY'FILE'.
MEMMORRIS::DISK3:[DOCSET]*.
*$NUM=NUM+1$GOTOPROCESS_LOOP$!
$DONE:$WRITESYS$OUTPUT"Finishedcopyingfiles.
"$EXITF$ELEMENT词法函数返回的第一个文件是CHAP1,下一个文件是CHAP2,以此类推.
每循环一次,NUM的值就加1,以便获得下一个文件名.
当F$ELEMENT返回一个斜杠时,就处理完FILE_LIST的所有项目,并且终止循环.
14.
20使用PIPE命令PIPE命令在同一命令行中执行一个或多个DCL命令字符串.
允许执行UNIX式样的命令处理,例如命令流水线、输入/输出重定向、条件和后台执行.
这种式样的命令处理支持互连网软件的开发和使用,它经常期望有些格式的流水线命令分析出现在主机和目标系统上.
以下几节描述使用PIPE命令的不同方法来执行DCL命令,如何中断PIPE命令和如何改进子进程性能.
附有例子说明.
有关PIPE命令的完整信息,请参阅OpenVMSDCLDictionary:N--Z.
您可以在单个PIPE命令中指定多个DCL命令,然后顺序执行这些DCL命令.
使用格式以下:PIPEcommand-sequence;command-sequence[;command-sequences].
.
.
14.
20.
1使用PIPE命令执行条件命令一个命令序列的执行有条件地依赖于上一个命令序列的执行结果.
使用格式:PIPEcommand-sequence1&&command-sequence2UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum注意,只有command-sequence1成功,才执行command-sequence2.
如果使用以下格式,则只有command-sequence1失败,才执行command-sequence2.
PIPEcommand-sequence1||command-sequence214.
20.
2使用PIPE命令执行流水线流水线是一串用管道连接的流水线段命令,以垂直条(|)分隔符表示.
流水线段命令是出现在流水线中的DCL命令.
管道把一个流水线段命令的SYS$OUTPUT连接到下一个命令的SYS$INPUT.
流水线的格式如下所示:PIPEpipeline-segment-command|pipeline-segment-command[|.
.
.
]每个流水线段命令在一个单独子进程中运行,它的SYS$OUTPUT连接到下一个流水线段命令的SYS$INPUT.
这些子进程并行执行;然而,它们同步到这种程度:除第一个之外,每个流水线段命令读取上一个的标准输出作为它的标准输入.
当最后一个流水线段命令完成时,流水线就执行完成.
在流水线中使用"筛选应用程序"是很普通的.
筛选应用程序是这样一个程序,它从SYS$INPUT获取数据,按特定方法改变它,然后把它写入SYS$OUTPUT.
DCL函数有些方面会在流水线的上下文中有所不同.
例如:使用SYS$COMMAND子进程的SYS$COMMAND通常与它的SYS$INPUT一样(如果不包括任何命令过程).
然而,在流水线中,子进程的SYS$COMMAND被设置为父进程的SYS$COMMAND,而不是上面的管道(它是流水线段命令的SYS$INPUT).
文件存取方法流水线段命令只可以使用RMS顺序文件存取方法读取和写入管道.
某些OpenVMS公用程序可能不是使用顺序存取的方法存取它们的输入和输出文件.
这些操作在流水线中是不被支持而会失败,如以下例子:$PIPECC/NOOBJ/NOLISTEST.
C|SEARCHSYS$INPUT/WIND=(1,1)"%cc-w-"%SEARCH-F-RFAERR,RMSerrorusingRFAaccess-RMS-F-RAC,invalidrecordaccessmode在这个例子中,SEARCH命令的/WINDOW限定词需要相对文件存取方法.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum符号替换注意DCL翻译符号的次序.
符号替换发生在命令处理的第一阶段.
如果把一个符号定义为PIPE命令的一部分,那么在执行这个符号实际定义的命令之前,DCL尝试翻译这个符号.
使用和号(&)可推迟符号替换.
有关详情,请参阅12.
12.
2节.
使用SYS$PIPE在多数情况下,来自管道的输入可以通过读取SYS$INPUT的数据获得.
然而,当命令过程被调用为流水线段命令时,SYS$INPUT重定向到这个命令过程文件.
要在命令过程内部从管道获得数据,可以使用逻辑名SYS$PIPE.
以下是一个流水线DCL应用程序TEE.
COM的例子:$!
TEE.
COM-commandproceduretodisplay/logdataflowingthroughapipeline$!
Usage:@TEElog-file$$OPEN/WRITEtee_file'P1'$LOOP:$READ/END_OF_FILE=EXITSYS$PIPELINE$WRITESYS$OUTPUTLINE!
Senditouttothenextstageofthepipeline$WRITEtee_fileLINE!
Logoutputtothelogfile$GOTOLOOP$EXIT:$CLOSEtee_file$EXIT要使用TEE.
COM,输入以下PIPE命令:$PIPESHOWSYSTEM|@TEEshowsys.
log|SEARCHSYS$INPUTLEF命令过程TEE.
COM用来记录通过流水线的数据流.
它从SYS$PIPE读入数据,而不是SYS$INPUT.
映象校验按照默认,在流水线中映象校验被停掉,即使在输入PIPE命令之前执行了命令SETVERIFY=IMAGE.
这阻止数据记录的副本通过流水线.
要在流水线中启动映象校验,必须在流水线段命令之前执行显式的SETVERIFY=IMAGE命令.
可以使用一个子外壳做到这一点,如下所示:$PIPE.
.
.
|(SETVERIFY=IMAGE14.
20.
3使用PIPE命令执行子外壳UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum子外壳是一个或多个用分隔符分隔的命令序列,并且括入圆括号中.
子外壳的格式如下所示:PIPE(command-sequence[separatorcommand-sequence]子外壳的命令序列在子进程环境中执行.
在执行下一个命令序列之前,DCL等待子外壳完成.
()分隔符类似于SPAWN/WAIT命令.
按这个格式使用PIPE命令时,要小心地处理符号替换.
在定义符号后,在以后引用这个符号之前使用和号(&)延迟符号替换.
否则符号替换将发生在命令处理的第一阶段期间,而在这个时间符号定义是不可靠的.
14.
20.
4使用PIPE命令执行后台程序使用以下格式,命令序列可以在子进程环境中执行:PIPEcommand-sequence[separatorcommand-sequence].
.
.
&DCL不等待命令序列完成.
一旦建立后台子进程,就把控制传递回DCL.
14.
20.
5使用PIPE命令重定向输入/输出在命令执行期间,命令序列可以把它的SYS$INPUT、SYS$OUTPUT或SYS$ERROR重定向到一个文件,如下所示:要重定向SYS$INPUT:PIPEcommand-sequenceredirected-output-file要重定向SYS$ERROR:PIPEcommand-sequence2>redirected-error-file流水线段命令也可以重定向它的SYS$INPUT、SYS$OUTPUT或SYS$ERROR.
然而,只允许最后一个流水线段命令重定向SYS$OUTPUT,并且只允许第一个流水线段命令重定向SYS$INPUT.
注意,PIPE命令重定向不同于使用DEFINE或ASSIGN命令建立的重定向.
其差别如下:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum重定向是在监督程序模式下建立.
这意味着用户模式应用程序和DCL命令两个都受到这个重定向的影响.
重定向环境只应用于指定重定向语法的命令序列或流水线段命令.
在这个命令序列或流水线段命令执行后,其原始进程输入/输出环境(例如,SYS$INPUT、SYS$OUTPUT和SYS$ERROR)在命令继续执行之前恢复.
当SYS$OUTPUT重定向时,总是建立重定向的输出文件,而不管命令序列是否实际上写入SYS$OUTPUT.
如果已经存在与重定向输出文件同名的文件版本,那么就建立这个文件的新版本.
(这个行为与在监督程序模式下使用DEFINE或ASSIGN命令重新定义SYS$OUTPUT一样.
)注意,重定向的文件在这个命令序列执行之前就已建立.
如果重定向的文件也在这个命令顺序中使用,那么操作可能失败,如以下例子所示:$PIPESEARCHTRANS.
LOG"alpha">TRANS.
LOG%SEARCH-W-OPENIN,erroropeningTRANS.
LOG;2asinput-RMS-E-FLK,filecurrentlylockedbyanotheruser在这个例子中,新版本的TRANS.
LOG已建立,并且打开供写存取;然后,SEARCH命令尝试读取TRANS.
LOG的最新版本,而不是期望的上一个版本.
当SYS$ERROR被重定向时,重定向的出错文件只当命令序列在执行期间实际写入SYS$ERROR时才建立,并且没有现有文件与重定向的出错文件同名.
如果与重定向出错文件同名的文件已经存在,那么这个文件就被打开为重定向的出错文件.
然后,这个命令序列产生的出错输出被附加到重定向出错文件的末端.
(这个行为与在监督程序模式下使用DEFINE或ASSIGN命令重新定义SYS$OUTPUT一样.
)14.
20.
6中断PIPE命令按下Ctrl/Y,可以中断PIPE命令.
如果PIPE命令正在流水线或子外壳命令序列中执行,这个命令序列和PIPE命令就会被删除.
在这种情况下,立即在中断后输入CONTINUE命令将不会恢复PIPE命令的执行.
如果PIPE命令正在执行一个命令序列,而不是子外壳或流水线命令序列,那么DCL这时对这个命令序列的处理就象一个不带PIPE命令动词的DCL命令,并且被Ctrl/Y中断.
有关Ctrl/Y中断的详情,请参阅13.
11节.
14.
20.
7改进子进程的操作性能在执行期间,PIPE命令可以产生许多子进程.
通常,被命令序列调用的应用程序不依赖于进程逻辑名和符号名.
在这种情况下,使用/NOLOGICAL_NAMES和/NOSYMBOLS限定词可以加速子进程的派生,它们抑制把进程逻辑名和符号传递给PIPE命令建立的子进程.
以下例子使用PIPE命令:下例展示两个使用多个命令的简单方法,在命令过程中通过符号定义建立有用工具:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$CD_WORK:==PIPESAVE_DIR=F$DIRECTORY();SETDEFAULTFOO:[WORK]$BACK:==SETDEF'SAVE_DIR'$$CD_WORK!
Switchtoworkingdirectory$:$:$BACK!
Switchbacktohomedirectory$GET_RECORD:==PIPEREAD/END_OF_FILE=CLEANUPINRECORD;-F$EDIT(RECORD,"COMPRESS,TRIM")$$OPENINEMPLOYEE.
DAT$LOOP:$GET_RECORD$:$:$GOTOLOOP$$CLEAN_UP:$:下例展示编译和链接操作.
注意,如果编译没有任何出错,目标文件被链接产生一个可执行映象.
如果程序编译出错,那么跳过链接步.
$PIPEccfoo.
c&&linkfoo,sys$library:vaxcrtl.
olb/lib下例展示如何使用执行条件命令在命令过程中设置简单出错处理控制流.
注意,如果映象COLLECT_DATA失败,控制指引到CLEAN_UP.
$PIPERUNCOLLECT_DATA.
EXE||GOTOCLEAN_UP$:$:$EXIT$$CLEAN_UP:$:$:在这个例子中,PIPE命令建立后台进程处理复制大文件.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$PIPECOPYLARGE_FILE.
DATREMOTE"userpassword"::[DESTINATION]*.
*&下例展示如何设置在子进程中完成的子外壳命令序列.
结果,对进程特定特征(例如,默认目录)的更改在子外壳完成后将不影响当前进程.
注意,保存集恢复到一个子目录中,为运行程序FOO提供必要的数据.
$PIPE(SETDEF[.
DATA_DIR];BACKUPDATA.
SAV/SAVRUNFOO下例在一个命令中使用流水线功能标识系统上的所有睡眠进程:$PIPESHOWSYSTEM|SEARCHSYS$INPUTHIB下例在单个命令中使用流水线功能运行一个测试、排序结果,并且把结果与基准文件进行比较,而不必产生中间文件:$PIPERUNTEST|SORT/SPECIFICATION=TEST.
SRTSYS$INPUTSYS$OUTPUT-|DIFFSYS$INPUTTEST.
BENCHMARK下例展示一个在流水线中把子外壳指定为管道段命令的方法:$PIPE(SETDEFWRK$:[WORK];RUNREPORT)|MAILSYS$INPUTSMITH下例展示在流水线中使用/PAGE限定词.
/PAGE功能也存在于许多其他DCL命令中,并且同样可以与PIPE命令一起使用,以形成其他有用的工具.
$more:==TYPE/PAGE=SAVESYS$INPUT$PIPEANA/RMSPAGE.
TXT|moreCheckRMSFileIntegrity26-JAN-200216:12:00.
06Page1SYS$SYSDEVICE:[TEST]PAGE.
TXT;2FILEHEADERFileSpec:SYS$SYSDEVICE:[TEST]PAGE.
TXT;2FileID:(4135,58220,0)OwnerUIC:[PIPE]UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumProtection:System:RWED,Owner:RWED,Group:RE,World:CreationDate:26-NOV-200216:08:50.
05RevisionDate:26-NOV-200216:09:09.
06,Number:1ExpirationDate:nonespecifiedBackupDate:nonepostedContiguityOptions:nonePerformanceOptions:noneReliabilityOptions:noneJournalingEnabled:noneRMSFILEATTRIBUTESRETURN/SPACE=More,PREV/NEXT=Scroll,INS/REM=Pan,SELECT=80/132,Q=Quit第15章使用词法函数获得并处理信息词法函数返回信息给命令行或命令过程.
返回的信息可以涉及进程、系统、文件和设备、逻辑名、字符串或数据类型.
词法函数用前缀F$标识.
通常可以在应用符号或表达式的上下文中使用词法函数.
在命令过程中,您可以使用词法函数翻译逻辑名、执行字符串处理以及确定过程的当前处理模式.
许多词法函数返回的信息也可以从DCL命令获得.
本章包括的信息涉及:词法函数如何起作用获得有关进程的信息获得有关系统的信息获得有关文件和设备的信息翻译逻辑名处理字符串处理数据类型有关词法函数的详情,请参阅联机求助.
有关本章论述的命令详情,请参阅OpenVMSDCLDictionary.
15.
1为什么要使用词法函数UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果是从词法函数而不是从命令获得信息,那么在命令过程中更容易处理.
例如,您可以使用F$ENVIRONMENT函数或SHOWDEFAULT命令获得当前默认目录的名称.
其差别如下:如果使用F$ENVIRONMENT函数,可以把结果赋值给一个符号,以后在这个过程中可以使用这个符号.
例如:$DIR_NAME=F$ENVIRONMENT("DEFAULT")$SETDEFAULTDISK4:[TEST].
.
.
$SETDEFAULT'DIR_NAME'F$ENVIRONMENT函数返回当前默认磁盘和目录,并且把这个值存储到符号DIR_NAME.
在过程的末端,SETDEFAULT命令使用符号DIR_NAME恢复其默认值.
如果使用SHOWDEFAULT命令代替F$ENVIRONMENT词法函数获得当前默认目录的值,就不能把这个输出直接赋值给一个符号.
作为代替,该过程如下:$!
RedirecttheoutputoftheSHOWDEFAULTcommandtoafile.
$DEFINE/SUPERVISOR_MODESYS$OUTPUTDISK4:[TEST]TEMPFILE.
DAT$SHOWDEFAULT$DEASSIGNSYS$OUTPUT$!
$OPEN/READDIR_FILEDISK4:[TEST]TEMPFILE.
DAT!
Openthefile.
$READDIR_FILEDIR_NAME,Readthefile.
$SETDEFAULT'DIR_NAME'Resetthedirectory.
$CLOSEDIR_FILE!
Closethefile.
$DELETEDISK4:[TEST]TEMPFILE.
DAT;Deletethefile.
15.
2获得有关进程的信息在命令过程中经常需要更改进程特征,然后使之恢复.
您可以使用以下词法函数获得进程信息:F$DIRECTORY返回当前默认目录字符串.
F$ENVIRONMENT返回进程的命令环境的信息.
F$GETJPI返回有关您的进程或系统上的其他进程的计帐、状态和标识信息.
F$MODE展示进程执行的模式.
F$PRIVILEGE指出进程是否有指定特权.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumF$PROCESS返回进程的名称.
F$SETPRV设置指定特权.
这个函数也指出指定特权是否在使用这个F$SETPRV函数之前允许.
F$USER返回用户标识码(UIC).
F$VERIFY指出是否校验.
下表展示经常在命令过程中更改的进程特征.
表中也给出保存这些特征的词法函数和恢复其原始设置的DCL命令.
特征操作命令或词法函数控制字符保存F$ENVIRONMENT("CONTROL")恢复SETCONTROLDCL提示保存F$ENVIRONMENT("PROMPT")恢复SETPROMPT默认保护保存F$ENVIRONMENT("PROTECTION")恢复SETPROTECTION/DEFAULT键状态保存F$ENVIRONMENT("KEY_STATE")恢复SETKEY消息格式保存F$ENVIRONMENT("MESSAGE")恢复SETMESSAGE特权保存F$PRIVILEGE或F$SETPRV恢复F$SETPRV或SETPROCESS/PRIVILEGES校验保存F$VERIFY或F$ENVIRONMENT恢复F$VERIFY或SETVERIFY如果要保存进程特征,必须确保一个出错或Ctrl/Y中断不会引起过程在恢复其原始特征之前退出.
(有关出错处理和Ctrl/Y中断的详情,请参阅第13章.
)15.
2.
1更改校验设置UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum您可以使用F$VERIFY词法函数撤消在命令过程期间的校验.
这阻止用户在执行过程期间显示过程的内容.
有两类校验:过程校验执行时显示每个命令行映象校验处理时显示每个数据行按照默认,SET[NO]VERIFY命令和F$VERIFY函数启用或停掉这个两类校验.
一般而言,在过程中过程和映象校验设置是一样的(两个都启用,或两个都停掉).
然而,如果决定更改这个设置,那么分别保存每个校验设置.
在以下例子中,符号TEMP用于允许和撤消校验:$!
Enableverification$!
$TEMP=F$VERIFY(1)$LOOP:$INQUIREFILE"Filename"$IFFILE.
EQS.
""THENEXIT$PRINT'FILE'$GOTOLOOP$!
Disableverification$!
$TEMP=F$VERIFY(0)$EXIT在以下例子中,保存校验设置:$!
Saveeachverificationstate$!
Turnbothstatesoff$SAVE_VERIFY_IMAGE=F$ENVIRONMENT("VERIFY_IMAGE")$SAVE_VERIFY_PROCEDURE=F$VERIFY(0).
.
.
$!
Restoreoriginalverificationstates$SAVE_VERIFY_IMAGE=F$VERIFY(SAVE_VERIFY_PROCEDURE,-SAVE_VERIFY_IMAGE)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumF$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指定.
)注意如果使用时间戳,要记住只当允许校验时才应用它.
有关时间戳和SETPREFIX命令的详情,请参阅OpenVMSDCLDictionary或DCL求助.
15.
2.
2更改默认文件保护您可能想要在命令过程中更改默认文件保护.
以下命令过程在过程执行时更改建立文件的默认保护.
该过程在终止之前恢复其原始的默认文件保护.
$SAVE_PROT=F$ENVIRONMENT("PROTECTION")$SETPROTECTION=(SYSTEM:RWED,OWNER:RWED,GROUP,WORLD)/DEFAULT.
.
.
$SETPROTECTION=('SAVE_PROT')/DEFAULT$EXIT注意,F$ENVIRONMENT函数使用SETPROTECTION命令要求的语法返回默认保护代码.
这让您对SETPROTECTION命令使用符号SAVE_PROT可恢复其原始的默认文件保护.
15.
3获得有关系统的信息您可以使用以下词法函数获得有关系统的信息:F$CONTEXT指定使用F$PID函数的选择准则.
F$CONTEXT函数允许F$PID函数获得有关任何OpenVMS簇系统节点上的进程信息.
F$CSID返回一个OpenVMSCluster标识号,并且更新指向系统的OpenVMSCluster节点列表中当前位置的上下文符号.
F$GETQUI返回以下有关信息:队列、当前在那些队列上的批量和打印作业、格式定义、和保持UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在系统作业队列文件中的特征定义.
F$GETSYI返回有关您的本地系统或有关您的OpenVMS簇系统上的节点(如果您的系统是OpenVMSCluster的一部分)的信息.
F$IDENTIFIER把命名格式的标识符转换为数字格式,或者从数字格式转换为命名格式.
F$MESSAGE返回与状态码关联的消息文本.
F$PID返回允许您检查的进程的进程标识(PID)号.
F$TIME返回当前日期和时间.
15.
3.
1确定您的OpenVMS簇节点名如果您的系统是OpenVMS簇环境的一部分,在此您可以注册到许多不同的节点,那么可以设置指出当前使用哪个节点的DCL提示.
要做到这一点,把F$GETSYI函数包括在注册命令过程中以确定这个节点名.
然后使用SETPROMPT命令设置对这个节点的唯一提示.
如果想要在提示字符串中只使用一部分节点名,那么使用F$EXTRACT函数抽取适当的字符.
有关抽取字符的详情,请参阅15.
6.
2节.
在以下例子中,符号NODE定义为FF$GETSYI("NODENAME"),然后把这个节点名用作提示:$NODE=F$GETSYI("NODENAME")$SETPROMPT="''NODE'$".
.
.
15.
3.
2获得队列信息您可以使用F$GETQUI函数获得有关批量和打印队列的许多类型的信息.
要获得有关作业和队列中文件的信息,必须对这个作业有读存取、SYSPRV特权或OPER特权.
以下例子展示如何确定批队列VAX1_BATCH是否处于停止状态.
返回的值或是真或是假.
如果这个队列不是处于停止状态,命令过程就可把作业提交给这个队列.
$QSTOPPED=F$GETQUI("DISPLAY_QUEUE","QUEUE_STOPPED","VAX1_BATCH")$IFQSTOPPEDTHENGOTONOBATCH$SUBMIT/QUEUE=VAX1_BATCHTEST.
COM$NOBATCH:.
.
.
15.
3.
3获得进程信息UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum您可以使用F$PID函数获得允许您检查的所有进程的进程标识(PID)号.
您可以这样获得PID号:如果有WORLD特权,可以检查系统上的所有进程如果有GROUP特权,可以检查组上的所有进程如果既没有GROUP也没有WORLD特权,只可以检查自己的进程在获得PID号之后,您可以使用F$GETJPI函数获得进程的特定信息.
以下例子展示如何获得和显示允许您检查的进程的PID号:$!
Displaythetimewhenthisprocedure$!
beginsexecuting$WRITESYS$OUTPUTF$TIME()$!
$CONTEXT=""$START:$!
ObtainanddisplayPIDnumbersuntil$!
F$PIDreturnsanullstring$!
$PID=F$PID(CONTEXT)$IFPID.
EQS.
""THENEXIT$WRITESYS$OUTPUT"Pid---''PID'"$GOTOSTART系统使用符号CONTEXT保留指向的系统PID号列表的指针.
每次循环时,系统更改指针找出该列表的下一个PID号.
在显示所有PID号之后,就退出这个过程.
在以下例子中,过程显示每个进程的PID号和UIC:$CONTEXT=""$START:$!
ObtainanddisplayPIDnumbersandUICs$!
$PID=F$PID(CONTEXT)$IFPID.
EQS.
""THENEXIT$UIC=F$GETJPI(PID,"UIC")$WRITESYS$OUTPUT"Pid---''PID'Uic---''UIC'"$GOTOSTART注意,把F$GETJPI函数包括在WRITE命令中,可以缩短这个命令过程,如下所示:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$CONTEXT=""$START:$PID=F$PID(CONTEXT)$IFPID.
EQS.
""THENEXIT$WRITESYS$OUTPUT"Pid---''PID'Uic---''F$GETJPI(PID,"UIC")'"$GOTOSTART15.
3.
4F$CONTEXT词法函数要获得OpenVMS簇系统任何节点上的进程信息,使用F$CONTEXT函数.
在以下例子中,调用F$CONTEXT三次来设置选择准则:$!
EstablishanerrorandCtrl/Yhandler$!
$ONERRORTHENGOTOerror$ONCONTROL_YTHENGOTOerror$!
$ctx=""$temp=F$CONTEXT("PROCESS",ctx,"NODENAME","*","EQL")(1)$temp=F$CONTEXT("PROCESS",ctx,"USERNAME","M*,SYSTEM","EQL")(2)$temp=F$CONTEXT("PROCESS",ctx,"CURPRIV","SYSPRV,OPER","ALL")(3)$!
$!
Loopoverallprocessesthatmeettheselectioncriteria.
$!
PrintthePIDnumberandthenameoftheimageforeachprocess.
$!
$loop:(4)$pid=F$PID(ctx)$IFpid.
EQS.
""$THEN$GOTOendloop$ELSE$image=F$GETJPI(pid,"IMAGNAME")(5)$SHOWSYMBOLpid$WRITESYS$OUTPUTimage(6)$GOTOloop$ENDIF$!
Theloopovertheprocesseshasended.
$!
$endloop:$!
$EXIT$!
$!
Errorhandler.
Cleanupthecontext'smemorywithUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
theCANCELselectionitemkeyword.
$!
$error:$IFF$TYPE(ctx).
eqs.
"PROCESS_CONTEXT"THEN-(7)-$temp=F$CONTEXT("PROCESS",ctx,"CANCEL")(8)$!
$EXIT检查这个例子时,注意以下几点:1.
第一次调用请求搜索OpenVMS簇系统中的所有节点.
2.
第二次调用请求只处理其用户名开始于M或者是SYSTEM的进程.
3.
第三次调用只选择那些其当前特权包括SYSPRV(系统特权)和OPER(操作员)并且可以有其他特权集的进程.
4.
在标号"loop"和"endloop"之间的命令行不断地调用F$PID来获得满足F$CONTEXT调用设置的准则的进程.
5.
在检索每个PID号之后,调用F$GETJPI返回在进程中运行的映象名.
6.
最后,这个过程显示映象的名称.
7.
在出错或Ctrl/Y操作的情况下,把控制传递给error,并且如果有必要就关闭上下文.
8.
注意,检查符号类型PROCESS_CONTEXT.
如果这个符号有这个类型,必须调用F$CONTEXT来取消选择准则.
如果这个符号不是类型PROCESS_CONTEXT,就没有在F$CONTEXT中设置选择准则,或者这个符号与F$PID一起使用,直到出错或者直至到达进程列表的末端.
15.
4获得有关文件和设备的信息您可以使用以下词法函数获得文件和设备的信息:F$DEVICE返回系统上符合指定选择准则的所有设备的设备名F$FILE_ATTRIBUTES返回文件属性的信息F$GETDVI返回指定设备的信息F$PARSE分析文件说明,并且返回请求的一个字段或多个字段F$SEARCH为查找文件搜索目录15.
4.
1搜索设备要使用系统服务$GETDVI获得特定设备的信息,您必须提供设备名给这个服务.
如果不知道设备名,可以使用词法函数F$DEVICE查找.
F$DEVICE函数允许基于设备名、设备种类或设备类型的通配符搜索.
要基于设备类型搜索,您也必须指定设备种类.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum您可以在命令过程的循环中使用F$DEVICE函数返回匹配指定选择准则的设备名.
每次执行F$DEVICE函数时,它返回系统上匹配选择准则的下一个设备.
注意,不是按特定次序返回设备.
在返回最后一个设备名之后,下一个F$DEVICE函数调用返回空串.
这个命令过程显示在单元0上所有RA60设备的设备名:$START:$DEVICE_NAME=F$DEVICE("*0:","DISK","RA60")$IFDEVICE_NAME.
EQS.
""THENEXIT$SHOWSYMBOLDEVICE_NAME$GOTOSTART15.
4.
2搜索目录中的文件在处理文件之前,命令过程应该使用F$SEARCH函数测试文件是否存在.
例如,以下命令过程使用F$PARSE把一个设备和目录字符串应用于文件STATS.
DAT.
然后,该过程使用F$SEARCH函数确定STATS.
DAT是否出现在DISK3:[JONES.
WORK]中.
如果是,那么该命令过程处理这个文件.
否则,该命令过程提示输入另一个文件.
$FILE=F$PARSE("STATS.
DAT","DISK3:[JONES.
WORK]",,,"SYNTAX_ONLY")$IFF$SEARCH(FILE).
EQS.
""THENGOTOGET_FILE$PROCESS_FILE:.
.
.
$GET_FILE:$INQUIREFILE"Filename"$GOTOPROCESS_FILE在确定文件存在之后,该过程可以使用F$PARSE或F$FILE_ATTRIBUTES函数获得这个文件的附加信息.
例如:$IFF$SEARCH("STATS.
DAT").
EQS.
""THENGOTOGET_FILE$PROCESS_FILE:$NAME=F$PARSE("STATS.
DAT",,"NAME").
.
.
$GET_FILE:$INQUIREFILE"Filename"$GOTOPROCESS_FILE15.
4.
3删除文件的旧版本UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum如果命令过程建立了一个在过程终止后不再需要的文件,那么在退出过程之前删除或清除这些文件.
使用PURGE命令可删除文件的除最新一个之外所有版本.
使用带版本号的DELETE命令可删除文件的特定版本,或者在版本字段使用通配符可删除文件的所有版本.
在命令过程中使用DELETE命令时如要避免出错消息,可使用F$SEARCH函数先验证文件存在然后删除之.
例如,您可以编写一个命令过程,只当某些模块执行时才建立文件TEMP.
DAT.
以下命令行只当TEMP.
DAT存在时才发出DELETE命令:$IFF$SEARCH("TEMP.
DAT").
NES.
""THENDELETETEMP.
DAT;*15.
5翻译逻辑名您可以使用以下词法函数翻译逻辑名:F$LOGICAL返回逻辑名的等价串.
F$TRNLNM返回逻辑名的等价串或请求的属性.
注意F$TRNLNM函数取代OpenVMS操作系统初期版本使用的F$LOGICAL函数.
您应该使用F$TRNLNM(代替F$LOGICAL)来确保命令过程使用当前系统技术来处理逻辑名.
有些情形下,您可能想要在命令过程中使用逻辑名而不是符号作为变量.
程序存取逻辑名比存取DCL符号更容易.
因此,要把信息传递给从命令过程运行的程序,可使用符号获得信息.
然后使用DEFINE或ASSIGN命令使符号的值等同于一个逻辑名.
您也可以使用F$TRNLNM函数确定逻辑名的值,然后把这个值赋予一个符号.
以下例子测试逻辑名NAMES是否已被定义.
如果已定义,那么过程运行PAYROLL.
EXE.
否则,过程获得符号FILE的值,并且使用这个值来建立逻辑名NAMES.
PAYROLL.
EXE使用逻辑名NAMES引用雇员名的文件.
$!
MakesurethatNAMESisdefined$IFF$TRNLNM("NAMES").
NES.
""THENGOTOALL_SET$INQUIREFILE"Filewithemployeenames"$DEFINENAMES'FILE'$!
$!
RunPAYROLL,usingthefileindicatedbyNAMES$ALL_SET:$RUNPAYROLLUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum.
.
.
这个命令过程定义在程序PAYROLL中使用的逻辑名:$DEFINENAMESDISK4:[JONES]EMPLOYEE_NAMES.
DAT$RUNPAYROLL.
.
.
$WRITESYS$OUTPUT"Finishedprocessing",F$TRNLNM("NAMES")在这个过程的末端,WRITE命令显示一条消息指出文件已被处理.
15.
6处理字符串您可以使用以下词法函数处理字符串:F$CVTIME返回时间字符串的信息F$EDIT编辑字符串F$ELEMENT从其元素被定界符分隔的字符串中抽取元素F$EXTRACT抽取一段字符串F$FAO格式化输出字符串F$LENGTH确定字符串的长度F$LOCATE在字符串中找出一个字符或子串,并返回其偏移15.
6.
1确定字符串或字符是否出现检查字符串的一个普通原因是确定一个字符(或子串)是否出现在字符串中.
要做到这一点,使用F$LENGTH和F$LOCATE函数.
如果F$LOCATE函数返回的值等于F$LENGTH函数返回的值,那么要寻找的字符不出现.
以下过程需要一个包括版本号的文件名.
要确定是否出现一个版本号,该过程测试在文件名的版本号之前分号(;)是否包括在用户输入的文件名中.
$INQUIREFILE"Enterfile(includeversionnumber)"$IFF$LOCATE(";",FILE).
EQ.
F$LENGTH(FILE)THEN-GOTONO_VERSION.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum.
.
F$LOCATE函数返回分号的偏移.
偏移开始于0;因而,如果分号是字符串中的首位字符,F$LOCATE函数将返回整数0.
如果分号不出现在字符串中,那么F$LOCATE函数返回一个偏移,它等于字符串中的最后一个字符的偏移加1.
这个值与F$LENGTH返回的长度一样,它度量从数1开始的字符串长度.
15.
6.
2抽取部分字符串要抽取一部分字符串,使用F$EXTRACT函数或F$ELEMENT函数.
使用F$EXTRACT函数抽取开始于已定义偏移的子串.
使用F$ELEMENT函数抽取在两个定界符之间的部分字符串.
要使用这些函数中的任意一个,必须知道要分析字符串的一般格式.
注意,不需要使用F$EXTRACT或F$ELEMENT分析文件说明或时间字符串.
作为代替,使用F$PARSE或F$CVTIME抽取文件说明或时间字符串的要求部分.
您也可以在抽取的同时确定组名的长度.
如果一个字符串包含分隔该字符串不同部分的定界符,可使用F$ELEMENT函数抽取您想要的部分.
从字符串中抽取在逗号之间的部分,可以使用F$ELEMENT获得不同类型的存取权.
要确定系统存取权,获得第一个元素;要确定拥有者存取权,获得第二个元素;以此类推.
注意,使用F$ELEMENT函数时,元素号码开始于零.
基于这个原因,使用整数3指定第4个元素.
以下命令过程使用F$EXTRACT函数抽取UIC的组部分.
这允许过程执行不同集合的命令,视用户的UIC组定.
$UIC=F$USER()$GROUP_LEN=F$LOCATE(",",UIC)-1$GROUP=F$EXTRACT(1,GROUP_LEN,UIC)$GOTO'GROUP'_SECTION.
.
.
$WRITERS_SECTION:.
.
.
$MANAGERS_SECTION:.
.
.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum首先,过程使用F$USER函数确定UIC.
然后,该过程使用F$LOCATE找出逗号的偏移确定组名长度.
逗号把组从UIC用户部分分隔开来.
在左中括号和逗号之间的任何字符是组名部分.
例如,来自UIC[WRITERS,SMITH]的组名是WRITERS.
在确定长度之后,该过程使用F$EXTRACT函数抽取组名.
组名开始于偏移1并结束于在逗号之前的字符.
最后,该过程直接执行到适当的标号.
以下例子展示如何在抽取的同时确定组名的长度:$UIC=F$USER()$GROUP=F$EXTRACT(1,F$LOCATE(",",UIC)-1,UIC)$GOTO'GROUP'_SECTION以下例子展示如何用逗号分隔保护码中的每个存取类型:$PROT=F$ENVIRONMENT("PROTECTION")$SHOWSYMBOLPROTPROT="SYSTEM=RWED,OWNER=RWED,GROUP=RE,WORLD"在这个例子中的命令从默认保护码中抽取全体用户存取部分(第4个元素):$PROT=F$ENVIRONMENT("PROTECTION")$WORLD_PROT=F$ELEMENT(3,",",PROT).
.
.
F$ELEMENT函数返回在第三逗号和字符串末端之间的每个字符.
因而,如果您的默认保护允许全体用户的读存取,那么将返回字符串"WORLD=R".
在获得全体用户存取字符串之后,可能需要进一步检查它.
例如:$PROT=F$ENVIRONMENT("PROTECTION")$WORLD_PROT=F$ELEMENT(3,",",PROT)$IFF$LOCATE("=",WORLD_PROT).
EQ.
F$LENGTH(WORLD_PROT)-THENGOTONO_WORLD_ACCESS.
.
.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum15.
6.
3格式化输出字符串您可以使用WRITE命令把字符串写入记录中.
要排列记录中的各列,可以使用F$FAO函数定义记录字段,并把进程名和用户名放入这些字段中.
您用F$FAO函数时,使用控制字符串定义记录的各字段;然后指定放入这些字段的值.
格式化记录字段的另一种方法使用字符串覆盖.
然而,要注意F$FAO函数比字符串覆盖的能力更强.
使用F$FAO函数可以执行更广泛的输出操作.
在以下例子中展示的命令过程使用WRITE命令显示系统上各进程的进程名和PID号:$!
InitializecontextsymboltogetPIDnumbers$CONTEXT=""$!
Writeheadings$WRITESYS$OUTPUT"ProcessNamePID"$!
$GET_PID:$PID=F$PID(CONTEXT)$IFPID.
EQS.
""THENEXIT$WRITESYS$OUTPUTF$GETJPI(PID,"PRCNAM"F$GETJPI(PID,"PID")$GOTOGET_PID注意,来自WRITE命令的输出把五个空格插入进程名和用户名之间,但是各列未对齐:ProcessNamePIDMARCHESAND2CA0049CTRACTMEN2CA0043AFALLON2CA0043CODONNELL2CA00453PERRIN2CA004DECHAMPIONS2CA004E3在这个例子中的命令过程使用F$FAO函数定义一个16字符的字段和一个12字符的字段.
F$FAO函数把进程名放入第一个字段,跳过一个空格,然后把PID号放入第二个字段:$!
InitializecontextsymboltogetPIDnumbers$CONTEXT=""$!
Writeheadings$WRITESYS$OUTPUT"ProcessNamePID"$!
$GET_PID:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$PID=F$PID(CONTEXT)$IFPID.
EQS.
""THENEXIT$LINE=F$FAO("!
16AS!
12AS",F$GETJPI(PID,"PRCNAM"),F$GETJPI(PID,"PID"))$WRITESYS$OUTPUTLINE$GOTOGET_PID现在,执行这个过程时,这些列将对齐:ProcessNamePIDMARCHESAND2CA0049CTRACTMEN2CA0043AFALLON2CA0043CODONNELL2CA00453PERRIN2CA004DECHAMPIONS2CA004E3以下例子使用覆盖把进程名放入符号RECORD的前16个字符(在偏移0开始)中.
然后把PID号放入后12个字符(在偏移17开始)中.
$!
InitializecontextsymboltogetPIDnumbers$CONTEXT=""$!
Writeheadings$WRITESYS$OUTPUT"ProcessNamePID"$!
$GET_PID:$PID=F$PID(CONTEXT)$IFPID.
EQS.
""THENEXIT$RECORD[0,16]:='F$GETJPI(PID,"PRCNAM")'$RECORD[17,12]:='F$GETJPI(PID,"PID")'$WRITESYS$OUTPUTRECORD$GOTOGET_PID这个过程产生与用F$FAO函数建立的同样类型格式的列:ProcessNamePIDMARCHESAND2CA0049CTRACTMEN2CA0043AFALLON2CA0043CODONNELL2CA00453PERRIN2CA004DEUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumCHAMPIONS2CA004E315.
7处理数据类型您可以使用以下词法函数把数据从字符串转换为整数,或者从整数转换为字符串:F$CVSI从字符串抽取位字段,并把结果作为有符号值转换为一个整数F$CVUI从字符串抽取位字段,并把结果作为无符号值转换为一个整数F$INTEGER把字符串表达式转换为整数F$STRING把整型表达式转换为字符串F$TYPE确定符号的数据类型15.
7.
1转换数据类型使用F$INTEGER和F$STRING函数在整数和字符串之间进行转换.
例如,以下命令过程转换数据类型.
如果输入一个字符串,该命令过程展示等价的整数.
如果输入一个整数,则命令过程展示其等价串.
注意F$TYPE函数是如何用来形成一个GOTO语句中的标号名;F$TYPE返回"STRING"或"INTEGER",视这个符号的数据类型而定.
$IFP1.
EQS.
""THENINQUIREP1"Valuetobeconverted"$GOTOCONVERT_'F$TYPE(P1)'$$CONVERT_STRING:$WRITESYS$OUTPUT"Thestring''P1'isconvertedto''F$INTEGER(P1)'"$EXIT$$CONVERT_INTEGER:$WRITESYS$OUTPUT"Theinteger''P1'isconvertedto''F$STRING(P1)'"$EXIT15.
7.
2求表达式的值有些命令,例如INQUIRE和READ,只接受字符串数据.
如果使用这些命令获得想要作为整型表达式求值的数据,那么使用F$INTEGER函数转换并求这个数据的值.
注意,当要把符号EXP使用为F$INTEGER函数的一个变元时,必须用省略号('')括住它.
这使得DCL在符号替换的第一个阶段替换EXP值.
在以下例子中,F$INTEGER函数用来求一个整型表达式的值:$INQUIREEXP"Enterintegerexpression"$RES=F$INTEGER('EXP')UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$WRITESYS$OUTPUT"Resultis",RES这个命令过程的输出将是如下所示:Enterintegerexpression:9+7Resultis16值"9+7"被替换.
当F$INTEGER函数处理变元"9+7"时,它求这个表达式的值并返回正确的结果.
15.
7.
3确定符号是否存在使用F$TYPE函数来确定一个符号是否存在.
如果符号未定义,那么F$TYPE函数返回空串.
例如:.
.
.
$IFF$TYPE(TEMP).
EQS.
""THENTEMP="YES"$IFTEMP.
EQS.
"YES"THENGOTOTEMP_SEC.
.
.
这个过程测试符号TEMP是否已在以前定义.
如果它已定义,就保留TEMP的当前值.
如果TEMP没有定义,IF语句则把值"YES"赋予TEMP.
第16章理解进程和批量作业进程是OpenVMS操作系统建立的环境,使您与系统进行交互.
进程可以是一个分离进程(独立于其他进程的进程)或一个子进程(其存在和资源依赖于另一个进程的进程).
主进程,也称为父进程,是一个分离进程.
本章描述:解释进程环境使用子进程连接虚拟终端上的断开进程处理批量作业如何建立进程UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum执行以下任务之一时,系统就建立一个进程:注册系统为每个交互用户建立一个进程.
提交批量作业系统为每个批量作业建立一个进程.
当批量作业完成时,系统就删除这个进程.
派生子进程使用SPAWN命令时,系统就建立一个进程.
运行程序使用/DETACHED限定词或/UIC=uic限定词运行程序时,系统就建立一个进程.
16.
1解释进程环境进程使用的特征,例如特权、符号和逻辑,形成一个进程环境.
系统从用户授权文件(UAF)获得进程唯一的特征.
UAF列出那些准许存取系统的用户,并定义每个用户进程的特征.
系统管理员通常维护UAF.
在进程中,系统每次只能执行一个程序(也称为映象或可执行映象).
要显示当前进程的进程环境,输入SHOWPROCESS/ALL命令.
以下例子展示一个进程环境:11-DEC-200213:30:37.
12(1)用户:CLEAVER(2)进程ID:24E003DC(3)节点:ZEUS进程名:"CLEAVER"(4)终端:VTA2195:TNA2170:(主机:16.
32.
123.
45端口:6789)(5)用户标识:DOC,CLEAVER](6)基本优先级:4(7)默认文件说明:DISK1:[CLEAVER](8)Kthreads数:1分配设备:ALPHAI$VTA2195:进程定额:9)帐户名:DOCCPU极限:无限直接I/O极限:1024缓冲I/O字节定额:119616缓冲I/O极限:1024定时器队列条目定额:400打开文件定额:299分页文件定额:100080子进程定额:30默认页故障簇:64AST定额:798入队定额:5000共享文件极限:0分离进程最大数量:0活动作业最大数量:0会计资料:10)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum缓冲I/O计数:16424峰值工作区大小:13920直接I/O计数:12014峰值虚拟大小:185392页故障数:11113装上卷数:0映象启动数:68花费的CPU时间:000:04:18.
55连接时间:000:08:22.
76授予特权:NETMBXTMPMBX进程特权:11)GROUP可能影响同组的其他进程TMPMBX可能建立临时邮箱OPER操作员特权NETMBX可能建立网络设备进程权:12)CLEAVER资源INTERACTIVELOCAL系统权:SYS$NODE_ZEUS自动不搁置架上:开映象转储:关SoftCPU亲合:关分析式样:传统的起点RAD:0调度种类名:没有进程动态内存区域(13)当前大小(Kb)128.
00当前总大小(页)256未用空间(Kb)111.
18在用空间(Kb)16.
81最大块大小(Kb)109.
69最小可变块(字节)8未用块数10未用块少于或等于64字节4在这个作业中有1个进程:(14)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumCLEAVER(*)检查这个例子时,注意以下几点:1.
当前日期和时间SHOWPROCESS/ALL命令执行时的日期和时间.
2.
用户名赋予与进程关联帐户的用户名.
3.
进程标识(PID)号系统为进程分配的唯一编号.
SHOWPROCESS命令以十六进制数形式显示PID号.
4.
进程名赋予进程的名称.
因为进程名是唯一的(在特定的UIC组内),因此用一个帐户注册的第一个进程被赋予其用户名.
用同样帐户注册的后续进程赋予终端名.
您可以使用DCL命令SETPROCESS/NAME更改进程名.
5.
用户标识码(UIC)赋予与进程关联的帐户的组和成员号(或字母)(例如,[DOC,CLEAVER]).
UIC的一部分标识您所属的工作组.
允许组中用户比组间用户更自由地共享文件或系统资源.
6.
优先级进程的当前优先级.
7.
默认文件说明当前设备和目录.
使用DCL命令SETDEFAULT更改当前默认.
8.
进程定额与进程关联的定额(限制).
使用带/QUOTAS或/ALL限定词的SHOWPROCESS命令检查这些定额.
9.
会计资料连续更新计算进程的内存使用和CPU时间.
使用带/ACCOUNTING或/ALL限定词的SHOWPROCESS命令检查这个资料.
10.
进程特权准予进程的特权.
特权对某些用户限制某些系统活动的性能.
使用带/PRIVILEGES或/ALL限定词的SHOWPROCESS命令检查您的特权.
11.
进程权与存取控制列表(ACL)保护一起使用的系统定义标识符.
标识符提供在ACL中指定用户的方法.
ACL是一个定义准予或拒绝用户存取对象(如文件、设备或邮箱)的安全工具.
12.
进程动态内存区域进程当前对动态内存的使用.
执行映象时,系统把动态内存分配给映象.
当进程不再需要这个内存时,系统就把它分配给另一个进程.
使用/MEMORY或/ALL限定词的SHOWPROCESS命令检查这个信息.
13.
树中进程一列属于父进程的子进程.
一个星号(*)出现在当前进程之后.
使用SHOWPROCESS/SUBPROCESSES或/ALL命令检查这个列表.
16.
2使用分离进程UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum分离进程或是交互的,或是非交互的,视父进程而定.
您或者操作系统执行注册,这取决于提供给DCL命令RUN或建立进程系统服务($CREPRC)的变元.
(RUN和$CREPRC两者都执行SYS$SYSTEM的LOGINOUT.
EXE映象.
)16.
3使用子进程SPAWN命令允许您建立当前进程的子进程.
在这个子进程中,您可以与系统进行交互,并且从这个子进程注销而返回到父进程,或者在父进程和子进程之间转换.
任何时候只有一个进程在执行.
系统的每个用户用一个作业树表示.
作业树是所有进程和子进程的分层结构,而主进程处于顶端.
子进程依赖于父进程,并且当父进程退出时被删除.
按照默认,子进程名采用后面跟随下划线和唯一编号的父进程名.
例如,如果父进程的名称是DOUGLASS,那么子进程命名为DOUGLASS_1、DOUGLASS_2,以此类推.
16.
3.
1使用子进程派生任务要中断一个任务,就执行第二个任务,然后返回到原始任务,可以使用Ctrl/Y中断第一个任务,派生执行第二个任务的子进程,退出子进程,然后输入CONTINUE命令返回到第一个任务.
按照默认,当您建立一个子进程时,父进程睡眠并且控制转换到子进程的DCL级.
您的默认目录是父进程的当前目录.
例如,如果按下Ctrl/Y中断EVE编辑对话期,那么输入CONTINUE命令并且按下Ctrl/W来刷新屏幕.
16.
3.
2使用子进程执行多项任务在继续处理原始任务的同时要执行第二个任务,您可以使用SPAWN/NOWAIT命令建立子进程.
SPAWN/NOWAIT生成一个非交互的、类似批量作业的子进程,并且只用于执行不需要输入的命令.
因为父和子进程两者是并行执行,因此两个都尝试控制终端.
要避免冲突,也要指定以下几点:/OUTPUT限定词指出子进程应该把输出写入指定文件,而不是终端SPAWN命令参数或/INPUT限定词指出子进程应该执行指定的命令,而不是从终端读取输入指定SPAWN命令的/INPUT限定词时,子进程建立为一个非交互进程,并且当遇到严重出错或文件结束指示符时就退出.
在DCL级,Ctrl/Z被视为文件结束指示符.
16.
3.
3建立子进程由于建立的每个进程是唯一的,因此在一个进程中执行的命令通常不影响其他任何进程.
然而,因为终端控制在进程之间传递,故影响终端特征的命令(例如,SETTERMINAL)会影响控制终端的任何进程.
例如,如果一个进程禁止屏幕显示并且退出时没有恢复它,那么对下一个获得终端控制的进程保持禁止屏幕显示.
使用SETTERMINAL命令重新设置任何改变的终端特征.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在以下例子中,用户按下Ctrl/Y中断命令映象(TYPE命令),派生一个子进程,从子进程退出,然后返回到原始进程:$TYPEMICE.
TXTOncetheweatherturnscold,micemayfindacrackinthefoundationandenteryourhouse.
Theyarelookingforfoodandshelterfromtheharshweatherahead.
.
.
.
[Ctrl/Y]$SPAWN%DCL-S-SPAWNED,processDOUGLASS_1spawned%DCL-S-ATTACHED,terminalnowattachedtoprocessDOUGLASS_1$MAILMAIL>.
.
.
MAIL>EXIT$LOGOUTProcessDOUGLASS_1loggedoutat31-DEC-199912:42:12.
46%DCL-S-RETURNED,controlreturnedtoprocessDOUGLASS$CONTINUEOnceinside,theymaygnawthroughelectricalwiresandraidyourfood.
Becausemicereproducesoquickly,whatstartedasoneortwomicecanquicklybecomeaninvasion.
Ifyousealthecracksandholesontheexteriorofyourfoundation,youcanpreventtheserodentsfromevergettingin.
16.
3.
4退出子进程要退出SPAWN命令建立的子进程,使用以下命令之一:LOGOUT使用LOGOUT命令退出子进程时,这个子进程被删除(以及它建立的任何子进程),并且返回父进程.
ATTACH使用ATTACH命令退出子进程时,子进程睡眠,并且终端控制被传递到指定进程.
必须指定一个进程名作为ATTACH命令的一个参数,或者指定一个进程标识(PID)号作为ATTACH命令的/IDENTIFIER限定词的值.
以下例子展示如何退出子进程DOUGLASS_1,并且连接到进程DOUGLASS:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$ATTACHDOUGLASS%DCL-S-RETURNED,控制返回到进程DOUGLASS$SHOWPROCESS11-DEC-200210:34:58.
50用户:DOUGLASS进程ID:2061C478节点:ALPHAI进程名:"DOUGLASS"终端:VTA2195:TNA2170:(主机:16.
32.
123.
45端口:6789)用户标识:[DOC,DOUGLASS]基本优先级:4默认文件说明:DISK1:[DOUGLASS]Kthreads的数目:1分配的设备:ALPHAI$VTA2195:SoftCPU亲合:关16.
3.
5子进程环境子进程环境是子进程从父进程继承的环境.
按照默认,子进程继承以下项目:默认、特权、符号、逻辑名、控制字符、消息格式、校验状态和键定义.
这些项目共同为子进程建立一个环境.
以下项目不从父进程继承:进程标识(PID)号系统为每个建立子进程分配一个唯一PID号.
进程名按照默认,子进程名包括父进程名,后面跟随一个下划线和一个整数.
使用SPAWN命令的/PROCESS限定词指定与默认不同的进程名.
进程名必须唯一.
建立的命令父进程使用SETCOMMAND命令定义的命令不复制到子进程.
要在子进程中使用已建立的命令,必须使用SETCOMMAND建立用于子进程的命令.
授予特权当派生子进程时,其进程环境包含父进程的特权,而不是您授权允许的特权.
例如,如果您计划派生一个子进程的同时,在Mail中并且执行一个特权操作,那么您必须在父进程中在调用Mail之前首先设置适当的特权.
您可以使用以下SPAWN命令限定词阻止子进程继承许多项目:SPAWN命令限定词抑制或更改的项目/CARRIAGE_CONTROL,/PROMPTDCL提示/NOCLICLI(命令语言解释程序;按照默认是DCL)/NOKEYPAD小键盘定义/NOLOGICAL_NAMES逻辑名UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum/NOSYMBOL符号/SYMBOL和/LOGICAL_NAMES限定词不影响系统定义的符号(例如$SEVERITY和$STATUS)或者系统定义的逻辑名(例如SYS$COMMAND和SYS$OUTPUT).
因为把逻辑名和符号复制到子进程可能是耗时的(几秒),所以您可能想要把/NOLOGICAL_NAMES和/NOSYMBOL限定词用于SPAWN命令,除非您计划在子进程中使用这些逻辑名或符号.
如果频繁地使用子进程,那么ATTACH命令可提供更有效的方法进入和退出子进程.
这个方法允许您把控制快速地在父进程和子进程之间传递,而不是重复等待系统建立新的子进程.
16.
4连接虚拟终端上的断开进程如果允许虚拟终端但已失去调制解调器线路连接,那么一个进程作为断开虚拟终端的进程在系统上保持活动.
必须在系统管理员指定的时段内(默认值是900秒或15分钟)重新连接这个进程.
如果在这个时间满期之前不能重新连接到这个进程,那么系统就删除这个进程.
注意您只可以连接到与您的用户标识码(UIC)关联的虚拟终端进程.
16.
4.
1终端断开终端可以在以下环境中断开:失去在主机和终端之间的调制解调器信号.
在支持TT2$M_SECURE特征集的终端上按下Break键.
输入DCL命令DISCONNECT.
输入DCL命令CONNECT/CONTINUE.
如果进程已断开,您有机会重新连接这个旧进程,并且返回到它在断开之前的状态.
注册时,系统提示如下:Youhavethefollowingdisconnectedprocess:TerminalProcessnameImagenameVTA52:RWOODS(none)Connecttoabovelistedprocess[YES]:如果按下Return键或者输入Yes,您就从当前进程注销,就好象自动执行DCL命令CONNECT/CONTINUE.
如果输入No或者如果在回答时延迟太久(以致发生应答期超时),那么保持注册新进程.
就不能连接到旧的进程.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum当您有多个断开对话期时,系统就会提示您输入想要重新连接的虚拟终端名.
如果不想连接任何显示的对话期,输入No.
16.
4.
2除去断开进程在一定的间歇时间之后,系统自动除去断开的进程.
然而,如果直接注销任何断开的进程,就可以保存系统资源,如下所示:步骤任务1输入DCL命令SHOWUSERS确定是否有其他断开的作业.
2输入DCL命令CONNECT/LOGOUT注销当前进程.
接回每个关联的虚拟终端(注有终端前缀VTA)直到达到最后一个现有进程.
3输入DCL命令LOGOUT.
16.
4.
3管理断开进程虚拟终端允许您每次维护一个以上断开的进程.
然而,必须紧记,当注册到虚拟终端时,物理终端是断开的.
任何指引到不是当前虚拟终端进程关联的物理终端的设备的I/O请求将进入等待状态.
当超时满期时,暂挂进程将终止.
然而,如果您重新连接到接收该I/O请求的物理终端,那么这个进程将从进入等待状态的位置继续.
用与其上下文相关的名称命名每个进程,可以更容易重新连接要求的进程.
例如,一个运行编辑文件进程的用户SMITH可以使用SETPROCESS/NAME命令命名该进程为SMITH_EDIT.
以后,要继续编辑,SMITH可以容易地确定哪个进程是适当的.
系统管理员可以全系统地或基于每个终端地限制虚拟终端的使用.
16.
5处理批量作业批量作业是非交互进程.
因为批量作业在自己的进程中执行,您可以有两个或更多的进程同时做不同的事情.
例如,可以使用批量作业来:在系统以批量模式执行程序或命令过程的同时,交互地执行任务.
运行需要长时间执行的命令过程.
在几小时后执行命令过程或程序.
在降低的优先级运行某些程序(例如,如果程序使用不成比例数量的系统资源).
16.
5.
1提交批量作业提交批量作业时,系统使用您的帐户和进程特征建立一个分离进程.
系统从该进程运行此作业,并且当作业完成时删除这个进程.
系统也执行系统注册命令过程(SYLOGIN.
COM)和您的注册命令过程(LOGIN.
COM),然后执行在批量作业中的命令过程.
当这些过程执行时,输出将写入日志文件.
当批量作业完成时,可以打印这个日志文件,或者把它保存在您的一个目录中.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum要按批量模式运行作业,就可输入DCL命令SUBMIT把作业提交到一个批队列(一个等待执行的批量作业列表).
当提交作业时,它被指引到默认批队列SYS$BATCH,把它附加到等待执行的作业队列的末端.
当前面的作业完成时,就执行您的作业.
在OpenVMS系统中,可以同时执行批量作业的数目由系统管理员在建立这个批队列时指定.
按照默认,SUBMIT命令使用文件类型.
COM.
在以下例子中,命令把JOB1.
COM放入SYS$BATCH:$SUBMITJOB1JobJOB1(queueSYS$BATCH,entry651,startedonSYS$BATCH)系统显示作业名、包含该作业的队列和为该作业分配的项号.
在把作业提交到批队列之后,您接收到这个DCL提示.
如果需要在任何DCL命令(如DELETE/ENTRY)引用您的批量作业,就使用作业的项号.
(使用SHOWENTRY命令,可以获得作业项号.
)注意,如果在批量作业中提交多个过程,那么当任何过程带出错或致命的(严重的)系统消息退出时,该批量作业将终止.
批量作业不必在把它提交到批队列时开始运行.
要指定不同时间,输入SUBMIT/AFTER命令.
在以下例子中,作业在11:30P.
M.
之后提交:$SUBMIT/AFTER=23:30JOB1.
COM把命令过程提交为批量执行时,系统保存这个命令过程的完整文件说明,包括版本号.
如果把命令过程提交之后要更新它,那么批量作业执行提交命令过程的原有版本,而不是新版本.
因为注册的默认目录通常不是在命令过程中存取文件所需要的默认目录,因此使用以下方法之一确保存取正确的文件:使用完整文件说明---在命令过程中引用一个文件时或者把一个文件传递给一个命令过程时,包括设备和目录名作为文件说明的一部分.
使用SETDEFAULT命令---在命令过程中在引用一个文件之前,在命令过程的开始使用SETDEFAULT命令指定适当的设备和目录.
批量作业执行时,它把输出写入日志文件.
按照默认,日志文件与提交的命令过程同名,但文件类型为.
LOG.
作业完成时,系统打印日志文件并从您的目录删除它.
有关保存日志文件的详情,请参阅16.
5.
3节.
在注册命令过程中检查批量作业每次提交批量作业时,系统执行您的注册命令过程.
执行批量作业时使用F$MODE词法函数测试批量作业,可以包括或省略部分注册命令过程.
在以下例子中,注册命令过程包括互相排斥地用于批量作业的命令、逻辑名和符号.
这段标号为BATCH_COMMANDS,并且以下命令包括在注册命令过程的开始:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumIFF$MODE().
EQS.
"BATCH"THENGOTOBATCH_COMMANDS.
.
.
提交批量作业时,要阻止系统执行注册命令过程的任何命令,把以下命令放在过程的开始:IFF$MODE().
NES.
"INTERACTIVE"THENEXIT可以把这个命令放在注册命令过程的任何位置.
提交批量作业时,系统只执行注册命令过程中的上述命令.
提交多个命令过程输入SUBMIT命令时,在一个作业中可以指定要执行的几个命令过程.
除非使用/NAME限定词指定名称,否则SUBMIT命令使用第一个命令过程的名称作为作业名.
注意,如果一个出错引起作业中的任何命令过程退出,那么整个作业终止.
批量作业执行时,第一个过程(UPDATE.
COM)的操作上下文不保留给第二个过程(SORT.
COM).
在SORT.
COM执行之前,系统删除UPDATE.
COM建立的局部符号.
然而,保留全局符号.
不能在单个作业中为个别命令过程指定不同参数.
在以下例子中,SUBMIT命令建立一个先执行UPDATE.
COM然后执行SORT.
COM的批量作业:$SUBMITUPDATE,SORTJobUPDATE(queueSYS$BATCH,entry207)startedonSYS$BATCH以下例子把同样的两个参数传递给UPDATE.
COM和SORT.
COM:$SUBMITUPDATE,SORT/PARAMETERS=-_$(DISK1:[ACCOUNT.
BILLS]DATA.
DAT,DISK2:[ACCOUNT]NAME.
DAT)$JobUPDATE(queueSYS$BATCH,ENTRY208)startedonSYS$BATCH16.
5.
2传递数据给批量作业批量作业的默认输入流(SYS$INPUT)是正在执行的命令过程.
因为分离进程正在执行批量作业,因此不能把SYS$INPUT重新定义到终端(而当您交互执行命令过程时则可以.
).
要把输入传递给批量作业,使用以下技术之一:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum把数据包括在命令过程本身.
要将数据包括在命令过程中,把数据放置在命令或映象之后的代码行中.
临时把SYS$INPUT定义为一个文件.
要临时把SYS$INPUT定义为一个文件,使用DEFINE/USER_MODE命令.
当提交命令过程执行时,把参数传递给这个命令过程.
要把参数传递给命令过程,当提交这个批量作业时使用/PARAMETERS限定词.
注意,不能在单个作业中为个别命令过程指定不同参数.
如果需要传递不同参数,那么使用单独的SUBMIT命令.
在以下例子中,数据行被传递到映象AVERAGE.
EXE:$!
ExecuteAVERAGE.
EXE$RUNAVERAGE647899532401$EXIT在以下例子中,SYS$INPUT被临时定义为一个文件:$DEFINE/USER_MODESYS$INPUTSTATS.
DAT$RUNAVERAGE$EXIT在以下例子中,把文件EMPLOYEES.
DAT中的参数传递给命令过程CHECKS.
DAT:$SUBMIT/PARAMETERS=(DISK1:[PAYROLL]EMPLOYEES.
DAT)CHECKSJobCHECKS(queueSYS$BATCH,entry209)startedonSYS$BATCH注意SHOWQUEUE/FULL命令显示批队列中所有作业的全部信息.
这个显示包括传递给过程的任何参数.
因此,不要把机密信息(例如密码)传递给批量作业.
16.
5.
3控制批量作业输出UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum按照默认,日志文件与在批量作业中的第一个命令过程同名,并且文件类型为.
LOG.
系统每分钟一次把批量作业的输出写入日志文件.
要指定不同的时间间隔,把SETOUTPUT_RATE命令包括在命令过程中.
如果在系统写入日志文件的同时尝试使用EDT编辑程序读取它,那么会接收到一条消息,指出这个文件已被另一个用户加锁.
等待几秒,然后再试.
然而,EVE编辑程序允许您阅读批量作业的日志文件.
指定EDIT/TPU/READ_ONLY和日志文件名,可以使用EVE命令来回移动日志文件,并且确保不保存对文件的任何更改.
如果省略/READ_ONLY限定词,并且以任何方法修改了日志文件,那么批量作业终止.
因为批量作业是一个用您的用户名注册的进程,并且执行您的注册命令过程,因此批量作业的输出包括注册命令过程的内容.
其输出也包括写入批量作业日志文件的任何东西(命令过程输出、出错消息,等等)以及完整的注销消息.
要阻止把您的注册命令过程写入批量日志文件,可把以下命令添加到注册命令过程的开始:$IFF$MODE().
EQS.
"BATCH"THENSETNOVERIFY按照默认,日志文件名是您提交作业的名称.
同样按照默认,这个日志文件也有文件类型.
LOG,并且假定您的注册默认指定的设备和目录.
要在提交作业时指定不同的日志文件名,对SUBMIT命令使用/LOG_NAME限定词.
批量作业日志文件包括SYS$OUTPUT和SYS$ERROR的所有输出.
按照默认,它也包括在命令过程中执行的所有命令行.
要阻止打印命令行,在命令过程中使用SETNOVERIFY命令或F$VERIFY词法函数.
作业完成时,系统把作业终止信息(使用长格式的系统注销消息)写入日志文件.
如果SETVERIFY命令有效,那么使用SETPREFIX命令为每个命令行加上时间戳,您也可以知道每个命令执行的精确时间.
批量作业不能成功完成时,可以检查日志文件确定命令过程失败的位置和引起失败的出错状态.
保存日志文件要保存日志文件,使用/KEEP或/NOPRINTER限定词.
/KEEP限定词在打印日志文件之后保存它.
/NOPRINTER限定词保存记录,但不打印.
如果没有指定这些限定词,那么发生默认动作;日志文件被排队到默认打印队列SYS$PRINT,并且在打印之后删除.
/KEEP和/NOPRINTER限定词把日志文件保存在默认注册目录中.
日志文件与在批量作业中的第一个命令过程同名,并且文件类型是.
LOG.
要指定其他文件名或目录名,使用/LOG_FILE限定词.
要重新命名和保存日志文件,必须使用/LOG_FILE和任意一个/KEEP或/NOPRINTER.
在以下例子中,把日志文件保存到文件DISK2:[JONES.
RESULTS]UPDATE.
LOG:$SUBMIT/LOG_FILE=DISK2:[JONES.
RESULTS]/NOPRINTER-UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum_$DISK2:[JONES.
RESULTS]UPDATE读取日志文件可以使用TYPE命令读取日志文件来确定已完成多少批量作业.
然而,如果在系统写入日志文件的同时尝试显示它,那么会接收到一条消息,指出这个文件已被另一个用户加锁.
如果发生这种情况,等待几秒,然后再试.
把命令输出包括在批量作业记录中通常,编译、链接和执行程序的批量作业命令过程建立附加的打印输出,例如编译程序列表或链接程序映象.
要产生这些文件的打印副本,批量作业命令过程可以包含PRINT命令用于打印.
如果想要批量作业记录包含命令过程的所有输出,包括编译程序的打印列表或链接程序的输出文件,那么可以做以下任意一个:在命令过程中使用TYPE命令代替PRINT命令.
TYPE命令写入SYS$OUTPUT.
在批量作业中,SYS$OUTPUT等同于批量作业日志文件.
使用适当命令的限定词把输出指引到SYS$OUTPUT.
注意,如果使用这个技术,那么输出文件不再保存在磁盘上,除非您保存日志文件.
在以下例子中展示的命令过程完成处理时,有三个单独的输出列表:批量作业记录、编译程序列表和链接程序映象:$FORTRAN/LISTBIGCOMP$PRINTBIGCOMP.
LIS$LINK/MAP/FULLBIGCOMP$PRINTBIGCOMP.
MAP以下例子展示如何使用限定词把输出指引到SYS$OUTPUT:$FORTRAN/LIST=SYS$OUTPUTBIGCOMP$LINK/MAP=SYS$OUTPUT/FULLBIGCOMP这些命令在批量作业中执行时,来自编译程序和链接程序的输出文件直接写入日志文件.
16.
5.
4更改批量作业的特征在作业提交到队列之后但在作业开始执行之前,可以使用带适当限定词的SETENTRY或SETQUEUE/ENTRY命令更改与作业相关的特征.
以下例子展示当批量作业暂挂在批队列中时可以用来更改批量作业名的两个方法:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$SETQUEUE/ENTRY=209/NAME=NEW_NAMESYS$BATCH$SETENTRY209/NAME=NEW_NAME这些命令把作业编号209的名称更改为NEW_NAME.
下表包含一些可以用SETENTRY或SETQUEUE/ENTRY命令进行的更改.
有关这些限定词的完整列表,请参阅OpenVMSDCLDictionary.
注意,SUBMIT命令允许的多数限定词也可以用于SETENTRY和SETQUEUE/ENTRY命令.
您可以进行以下更改:延迟处理作业.
使用/AFTER限定词指定一个时间,在这个时间之后作业才可以执行.
使用/HOLD限定词保持作业,直到明确释放它.
释放作业.
使用/NOHOLD或/RELEASE限定词释放用/HOLD或/AFTER限定词提交的作业.
把作业发送给不同队列.
使用/REQUEUE限定词更改将执行作业的队列.
更改执行特征.
更改执行特征,例如工作区默认、工作区范围、工作区大小、作业调度优先级和CPU时间限制.
更改传递给作业的参数.
使用/PARAMETERS限定词更改参数.
16.
5.
5SUBMIT命令限定词以下是可以用SUBMIT命令指定控制批量作业特征的限定词.
注意,您也可以指定执行特征,例如工作区默认、工作区范围、工作区大小、作业调度优先级和CPU时间限制.
/AFTER指定一个时间,在这个时间之后批量作业才可以执行.
作业保持在批队列中,直到指定时间.
要在队列中拥有作业直到明确释放它,使用/HOLD限定词.
(要释放拥有的作业,使用SETENTRY/RELEASE命令.
)/NAME指定批量作业名.
否则,作业名默认为在作业中的第一个(或只有)命令过程的文件名.
/NOTE指定作为SHOWQUEUE/FULL命令显示部分的消息字符串.
允许您把作业信息传达给操作员或系统管理员.
/NOTIFY请求通知作业完成.
当批量作业完成执行时,系统发送一条消息到您的终端.
/PARAMETERS传递参数给批量作业.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum/NOPRINTER或/KEEP保存批量作业日志文件.
/QUEUE把批量作业发送到不是SYS$BATCH的队列.
要执行在远程节点上的命令过程,使用/REMOTE限定词.
它把作业发送到远程节点的SYS$BATCH.
/RESTART在执行作业时如果系统失败允许重新启动作业.
/RETAIN在完成之后仍然把批量作业保持在队列中.
可以使用SHOWQUEUE或SHOWENTRY命令查看作业的完成状态.
16.
5.
6显示批队列中的作业作业一旦输入到批量作业队列,就可以使用SHOWENTRY命令或SHOWQUEUE命令监视它的状态.
如果在队列中没有作业,那么系统显示以下消息:$SHOWQUEUEBOSTON_BATCH批队列BOSTON_BATCH,在BOSTON::要查看作业的完整信息,对SHOWENTRY或SHOWQUEUE命令使用/FULL限定词.
要查看队列中其他作业的状态,使用SHOWQUEUE/ALL命令.
在以下例子中,显示项号为999的作业:$SUBMITEXCHAN.
DAT作业EXCHAN(队列SYS$BATCH项号999)开始于SYS$BATCH$SHOWENTRY999项号作业名用户名块数状况999EXCHANBLASS3执行中在批队列SYS$BATCH$SUBMIT/NOPRINTER/PARAMETER=STATS.
DATUPDATE作业UPDATE(队列SYS$BATCH项号1080)开始于BOSTON_BATCH$SHOWQUEUEBOSTON_BATCH批队列BOSTON_BATCH在BOSTON::项号作业名用户名块数状况1080UPDATEODONNELL36执行中UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum在下一个例子中,/FULL限定词显示BOSTON_BATCH的统计信息和与项号999相关的特征:$SHOWENTRY/FULL999项号作业名用户名块数状况999EXCHANBLASS3执行中在批队列BOSTON_BATCH提交于11-DEC-199913:12/PRIORITY=100WRKD:[BLASS]EXCHAN.
DAT;3$SHOWQUEUE/FULLBOSTON_BATCH批队列BOSTON_BATCH,在BOSTON::/BASE_PRIORITY=3/JOB_LIMIT=5/OWNER=[EXEC]/PROTECTION=(S:E,O:D,G:R,W:W)项号作业名用户名块数状况1080UPDATEODONNELL36执行中提交于11-DEC-199910:46/KEEP/PARAM=("STATS.
DAT")/NOPRINTER/PRIO=4_BOSTON$DQA2:[ODONNELL]TEMP.
COM;1(执行中)在以下例子中,SHOWQUEUE/ALL命令用来显示BOSTON_BATCH队列中的所有作业:$SHOWQUEUE/ALLBOSTON_BATCH批队列BOSTON_BATCH在BOSTON::项号作业名用户名状况923没有特权执行中939没有特权搁置至11-DEC-199919:001080UPDATEODONNELL目执行中注意,除非您是特权用户,您获得的信息只限制用您的帐户提交的作业.
16.
5.
7删除和停止批量作业您可以在执行之前或期间删除批量作业.
要删除批队列中暂挂或已经执行的项目,使用DELETE/ENTRY命令.
您需要有特殊的特权才能删除不是您提交的作业.
当作业因DELETE/ENTRY命令而终止时,其日志文件既不打印,也不从您的目录删除.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum使用DELETE/ENTRY命令终止作业时,它被处理为一个异常终止,因为操作系统的正常作业终止活动是优先的.
结果,批量作业记录不包含概述作业时间和会计信息的标准注销消息.
然而,因显式的EXIT命令或STOP命令,或者潜在执行这些命令(作为当前ON条件的结果)而导致的终止,被认为是正常终止.
正常终止后操作系统执行适当的停止和会计过程.
以下命令删除SYS$BATCH的作业项目210:$DELETE/ENTRY=210SYS$BATCH16.
5.
8重新启动批量作业批量作业执行时如果系统失败,作业就不能完成.
系统恢复并且队列重新启动时,您的作业异常结束并且执行在队列中的下一个作业.
然而,提交批量作业时指定/RESTART限定词,可以指出如果系统在作业完成之前失败,系统应该重新执行您的作业.
按照默认,批量作业从第一行开始重新执行.
有关把符号添加到命令过程来指定不同重新启动点的详情,请参阅第13章和第14章.
除在系统失败之后重新启动作业之外,也可以在明确停止作业之后重新启动作业.
要停止作业然后在同一或不同队列中重新启动它,使用STOP/QUEUE/REQUEUE/ENTRY命令.
在这个例子中展示的命令停止在SYS$BATCH之上的作业212,并且把它重新排队到SYS$BATCH.
$STOP/QUEUE/REQUEUE/ENTRY=212SYS$BATCH要输入这个命令,必须已使用SUBMIT命令的限定词/RESTART提交了作业212.
当批量作业第二次执行时,系统使用全局符号BATCH$RESTART确定从哪里开始执行这个作业.
16.
5.
9同步批量作业执行您可以在命令过程中使用SYNCHRONIZE和WAIT命令把这个过程放置在等待状态.
SYNCHRONIZE命令使这个过程等待指定作业的完成.
WAIT命令使这个过程等待指定的时间.
如果用SYNCHRONIZE命令指定作业名,注意要同步的作业必须与您的用户名关联.
(作业与提交作业的进程的用户名关联.
)要为不同用户同步作业,必须使用带/ENTRY限定词的SYNCHRONIZE命令指定作业项号.
在以下例子中,如果提交的两个作业并行执行合作的功能,那么一个作业可以包含以下命令:$SYNCHRONIZEBATCH25在执行这个命令之后,命令过程不能继续执行,直到用作业名BATCH25标识的作业完成执行.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum这个SYNCHRONIZE命令把当前命令过程放置在等待状态,直到作业454完成:$SYNCHRONIZE/ENTRY=454图16-1是命令过程的一个例子,提交命令过程用于并行执行,但是必须同步适当执行.
每个过程编译一个大的源程序.
图16-1同步批量作业执行检查这个例子时,注意以下几点:1.
个别SUBMIT命令需要提交两个单独的作业.
第一个进程被建立.
2.
在执行FORTRAN命令之后,执行SYNCHRONIZE命令.
如果作业315是当前或暂挂作业,作业314将不执行下一个命令.
3.
如果作业315完成执行,那么作业314继续下一个命令.
16.
5.
10使用WAIT命令对于必须存取共享系统资源(例如,磁盘或磁带驱动器)的命令过程,WAIT命令是有用的.
以下例子展示一个过程请求分配磁带驱动器:$TRY:$ALLOCATEDM:RK:$IF$STATUSTHENGOTOOKAY$WAIT00:05$GOTOTRYUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$OKAY:$REQUEST/REPLY/TO=DISKS-"PleasemountBACK_UP_GMBon''F$TRNLNM("RK")'".
.
.
如果WAIT命令没有成功完成,过程就把本身放置在等待状态.
在5分钟之后,它再试这个请求.
后面跟随ALLOCATE请求的IF命令检查$STATUS的值.
如果$STATUS的值指出成功完成,命令过程继续.
否则,过程执行WAIT命令;WAIT命令指定5分钟的时间间隔.
在等待5分钟之后,就执行下一个命令GOTO并且重复这个请求.
这个过程继续循环,并且尝试分配设备,直到成功或者直到批量作业被删除或停止.
附录A字符集DEC多国字符集(MCS)包括由十六进制值00至FF标识的字符定义,是过去数字设备公司(DigitalEquipmentCorporation)建立和使用的.
DECMCS划分为两个部分,即ASCII7位字符集(通过十六进制值00至7F标识)和8位字符集(通过十六进制值80至FF标识).
对于使用DIGITAL建立和销售的大多数软件的用户来说,他们对DECMCS是熟悉的.
Unicode标准字符集(UCS-2)是由Unicode协会定义的16位字符集,可以通过十六进制值0000至FFFF标识.
ISOLatin-1字符集是通过十六进制值00至FF标识的8位字符的UCS-2定义.
ISOLatin-1字符集定义稍微不同于十六进制值80至FF的DECMCS定义.
表A-1包含DEC多国字符集(MCS).
表A-1指出在两个字符集中的不同字符,并且图A-1展示这些不同字符.
表A-2列出DCL字符集的字符.
有关Unicode(UCS-2)字符集的详情,请参阅UnicodeConsortium的TheUnicodeStandard.
表A-1DEC多国字符集十六进制代码MCS字符或缩写DEC多国字符名ASCII控制字符100NUL空字符01SOH标题起始(Ctrl/A)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum02STX文本起始(Ctrl/B)03ETX文本结束(Ctrl/C)04EOT传输结束(Ctrl/D)05ENQ询问(Ctrl/E)06ACK认可(Ctrl/F)07BEL铃(Ctrl/G)08BS退格(Ctrl/H)09HT水平制表栏(Ctrl/I)0ALF换行(Ctrl/J)0BVT垂直制表栏(Ctrl/K)0CFF换页(Ctrl/L)0DCR回车(Ctrl/M)0ESO移出(Ctrl/N)0FSI移入(Ctrl/O)10DLE数据链接丢失(Ctrl/P)11DC1设备控制1(Ctrl/Q)12DC2设备控制2(Ctrl/R)13DC3设备控制3(Ctrl/S)14DC4设备控制4(Ctrl/T)15NAK否定接受(Ctrl/U)16SYN同步闲置符(Ctrl/V)17ETB传输块结束(Ctrl/W)18CAN取消(Ctrl/X)19EM媒体结束(Ctrl/Y)1ASUB替换(Ctrl/Z)1BESC换码符1CFS文件分隔符1DGS组分隔符1ERS记录分隔符1FUS单位分隔符ASCII特殊和数字字符20SP空格21!
感叹号22"引号(双引号)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum23#数字符号24$美元符25%百分号26&和号27'省略号(单引号)28(左圆括号29)右圆括号2A*星号2B+加号2C,逗号2D--连字号或减号2E.
句点或小数点2F/斜杠300零3111322233333444355536663777388839993A:冒号3B;分号3C大于3F问号ASCII字母字符40@商业at符号41A大写字母A42B大写字母B43C大写字母CUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum44D大写字母D45E大写字母E46F大写字母F47G大写字母G48H大写字母H49I大写字母I4AJ大写字母J4BK大写字母K4CL大写字母L4DM大写字母M4EN大写字母N4FO大写字母O50P大写字母P51Q大写字母Q52R大写字母R53S大写字母S54T大写字母T55U大写字母U56V大写字母V57W大写字母W58X大写字母X59Y大写字母Y5AZ大写字母Z5B[左中括号5C\反斜杠5D]右中括号5E^音调符号5F_下划线60`重音符61a小写字母a62b小写字母b63c小写字母c64d小写字母d65e小写字母eUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum66f小写字母f67g小写字母g68h小写字母h69i小写字母i6Aj小写字母j6Bk小写字母k6Cl小写字母l6Dm小写字母m6En小写字母n6Fo小写字母o70p小写字母p71q小写字母q72r小写字母r73s小写字母s74t小写字母t75u小写字母u76v小写字母v77w小写字母w78x小写字母x79y小写字母y7Az小写字母z7B{左大括号7C|垂直线7D}右大括号(ALTMODE)7E~代字号(ALTMODE)7FDEL擦掉(DELETE)控制字符80[保留]81[保留]82[保留]83[保留]84IND索引85NEL下一行86SSA被选区域起始UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum87ESA被选区域结束88HTS水平制表符集89HTJ对齐的水平制表符集8AVTS垂直制表符集8BPLD部分行向下8CPLU部分行向上8DRI反向索引8ESS2单移28FSS3单移390DCS设备控制字符串91PU1专用192PU2专用293STS设置传输状态94CCH取消字符95MW消息等待96SPA保护区起始97EPA保护区结束98[保留]99[保留]9A[保留]9BCSI控制序列引导符9CST字符串终止符9DOSC操作系统命令9EPM秘密消息9FAPC应用程序其他字符A0[保留]2A1反向感叹号A2分币符A3英磅符A4[保留]2A5人民币符A6[保留]2A7§章节符UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumA8¤通用货币符号2A9版权符号AA阴性顺序指示符AB左角引号AC[保留]2AD[保留]2AE[保留]2AF[保留]2B0°温度符B1±加/减号B2上标2B3上标3B4[保留]2B5微符B6段落符,pilcrowB7·中点B8[保留]2B9上标1BA阳性顺序指示符BB右角引号BC分数四分之一BD分数二分之一BE[保留]2BF反向问号C0带重音符的大写字母AC1带尖锐重音的大写字母AC2带音调符号的大写字母AC3带代字号的大写字母AC4带元音变音(分音符号)的大写字母AC5带铃声的大写字母AC6大写字母AE双重元音C7带变音符号的大写字母CC8带重音符的大写字母EC9带尖锐重音的大写字母EUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumCA带音调符号的大写字母ECB带元音变音(分音符号)的大写字母ECC带重音符的大写字母ICD带尖锐重音的大写字母ICE带音调符号的大写字母ICF带元音变音(分音符号)的大写字母ID0[保留]2D1带代字号的大写字母ND2带重音符的大写字母OD3带尖锐重音的大写字母OD4带音调符号的大写字母OD5带代字号的大写字母OD6带元音变音(分音符号)的大写字母OD7OE大写字母OE连字2D8带斜杠的大写字母OD9带重音符的大写字母UDA带尖锐重音的大写字母UDB带音调符号的大写字母UDC带元音变音(分音符号)的大写字母UDDY带元音变音(分音符号)的大写字母YDE[保留]2DF德语高调小写字母sE0à带重音符的小写字母aE1á带尖锐重音的小写字母aE2带音调符号的小写字母aE3带代字号的小写字母aE4带元音变音(分音符号)的小写字母aE5带铃声的小写字母aE6小写字母ae双重元音E7带变音符号的小写字母cE8è带重音符的小写字母eE9é带尖锐重音的小写字母eEAê带音调符号的小写字母eEB带元音变音(分音符号)的小写字母eUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumECì带重音符的小写字母iEDí带尖锐重音的小写字母iEE带音调符号的小写字母iEF带元音变音(分音符号)的小写字母iF0[保留]2F1带代字号的小写字母nF2ò带重音符的小写字母oF3ó带尖锐重音的小写字母oF4带音调符号的小写字母oF5带代字号的小写字母oF6带元音变音(分音符号)的小写字母oF7oe小写字母oe连字2F8带斜杠的小写字母oF9ù带重音符的小写字母uFAú带尖锐重音的小写字母uFB带音调符号的小写字母uFCü带元音变音(分音符号)的小写字母uFD带元音变音(分音符号)的小写字母y2FE[保留]2FF[保留]21ALTMODE和DELETE字符(十进制125、126和127)也是控制字符.
2在ISOLatin-1中的不同字符.
请参阅图A-1.
图A-1DEC多国字符集和ISOLatin-1字符集的差别UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum表A-2DCL字符集符号名称含义@At符号把命令过程文件的内容放入在命令输入流中.
:冒号在文件说明中的设备名定界符.
双冒号(::)是节点名定界符.
冒号也用作限定词定界符.
它分隔限定词名和它的值.
/斜杠限定词前缀.
+加号参数分隔符.
在有些命令中,它用作参数连接符.
加号也识别为字符串串联运算符、单目加号和数字表达式中的加法运算符.
,逗号用于参数或变元列表的列表元素分隔符.
-连字号续行字符.
连字号也识别为字符串缩减运算符、单目减号、在数字表达式中的减法运算符和目录搜索通配符.
()圆括号用于变元列表的列表定界符.
圆括号也用来指出在数字表达式中的操作次序.
[]方括号在文件说明中的目录名定界符.
等价于尖括号.
尖括号在文件说明中的目录名定界符.
等价于方括号.
问号求助字符.
&和号执行时替换运算符.
否则,就是保留的特殊字符.
\反斜杠保留的特殊字符.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum=等号限定词值定界符.
它分隔限定词名和它的变元.
当定义符号时,等号(=)也可以用于赋值语句.
^音调符号保留的特殊字符.
#数字符号保留的特殊字符.
*星号在文件说明中的通配符.
星号也使用为数字表达式中的乘法运算符,并且在符号定义中用作缩写定界符.
'省略号替换运算符.
.
句点在文件说明中的文件类型和版本号定界符.
也用作子目录定界符.
;分号在文件说明中的版本号定界符.
%百分号在文件说明中的通配符.
也用作基数运算符.
!
感叹号指出注释.
"引号文字字符串定界符.
附录B详解命令过程本附录包含使用第13章、第14章和第15章论述的概念和技术建立完整命令过程.
本附录的每一节论述一个命令过程,并提供以下信息:过程名一列过程注解解释过程使用的概念或技术样例过程的执行结果B.
1CONVERT.
COM命令过程这个命令过程把一个绝对时间(将来的某个时间)转换为一个相对时间,并且确定在当前时间和指定时间之间的时间长短.
这个过程说明如何使用F$TIME和F$CVTIME词法函数,以及使用赋值语句来执行算术计算和连接符号值.
例子:CONVERT.
COMUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
Proceduretoconvertanabsolutetimetoadeltatime.
$!
ThedeltatimeisreturnedastheglobalsymbolWAIT_TIME.
$!
P1isthetimetobeconverted.
$!
P2isanoptionalparameter-SHOW-thatcausesthe$!
proceduretodisplayWAIT_TIMEbeforeexiting$!
$!
Checkforinquiry$!
$IFP1.
EQS.
"".
OR.
P1.
EQS.
""THENGOTOTELL(1)$!
$!
Verifytheparameter:hoursmustbelessthan24minutesmustbelessthan60timestringmustcontainonlyhoursandminutes$!
$!
Changeerrorandmessagehandlingto$!
usemessageatBADTIME$!
$ONWARNINGTHENGOTOBADTIME(2)$SAVE_MESSAGE=F$ENVIRONMENT("MESSAGE")$SETMESSAGE/NOFACILITY/NOIDENTIFICATION/NOSEVERITY/NOTEXT$TEMP=F$CVTIME(P1)$!
$!
Restoredefaulterrorhandlingandmessageformat$ONERRORTHENEXIT$SETMESSAGE'SAVE_MESSAGE'$!
$IFF$LENGTH(P1).
NE.
5.
OR.
3)F$LOCATE(":",P1).
NE.
2-THENGOTOBADTIME$!
$!
Getthecurrenttime$!
$TIME=F$TIME(4)$!
$!
Extractthehourandminutefieldsfromboththecurrenttime$!
value(TIME)andthefuturetime(P1)$!
$MINUTES=F$CVTIME(TIME,"ABSOLUTE","MINUTE"Currentminutes(5)$HOURS=F$CVTIME(TIME,"ABSOLUTE","HOUR"Currenthours$FUTURE_MINUTES=F$CVTIME(P1,"ABSOLUTE","MINUTE")!
Minutesinfuturetime$FUTURE_HOURS=F$CVTIME(P1,"ABSOLUTE","HOUR"HoursinfutureUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumtime$!
$!
$!
Convertbothtimevaluestominutes$!
Notetheimplicitstringtointegerconversionbeingperformed$!
$CURRENT_TIME=HOURS*60+MINUTES(6)$FUTURE_TIME=FUTURE_HOURS*60+FUTURE_MINUTES$!
$!
Computedifferencebetweenthefuturetimeandthecurrenttime$!
(inminutes)$!
$!
$MINUTES_TO_WAIT=FUTURE_TIME-CURRENT_TIME(7)$!
$!
Iftheresultislessthan0thespecifiedtimeisassumedtobe$!
forthenextday;morecalculationisrequired.
$!
$IFMINUTES_TO_WAIT.
LT.
0THEN8)MINUTES_TO_WAIT=24*60+FUTURE_TIME-CURRENT_TIME$!
$!
Startloopingtodeterminethevalueinhoursandminutesfrom$!
thevalueexpressedallinminutes$!
$HOURS_TO_WAIT=0$HOURS_TO_WAIT_LOOP:9)$IFMINUTES_TO_WAIT.
LT.
60THENGOTOFINISH_COMPUTE$MINUTES_TO_WAIT=MINUTES_TO_WAIT-60$HOURS_TO_WAIT=HOURS_TO_WAIT+1$GOTOHOURS_TO_WAIT_LOOP$FINISH_COMPUTE:$!
$!
Constructthedeltatimestringintheproperformat$!
$WAIT_TIME==F$STRING(HOURS_TO_WAIT)F$STRING(MINUTES_TO_WAIT)-(10)+":00.
00"$!
$!
Examinethesecondparameter$!
$IFP2.
EQS.
"SHOW"THENSHOWSYMBOLWAIT_TIME(11)$!
$!
Normalexit$!
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$EXIT$!
$BADTIME:12)$!
Exittakeniffirstparameterisnotformattedcorrectly$!
EXITcommandreturnsbutdoesnotdisplayerrorstatus$!
$SETMESSAGE'SAVE_MESSAGE'$WRITESYS$OUTPUT"Invalidtimevalue:",P1,",formatmustbehh:mm"$WRITESYS$OUTPUT"Hoursmustbelessthan24;minutesmustbelessthan60"$EXIT%X10000000$!
$!
$TELL:13)$!
Displaymessageandexitifuserentersinquiryorenters$!
anillegalparameter$!
$TYPESYS$INPUTThisprocedureconvertsanabsolutetimevaluetoadeltatimevalue.
Theabsolutetimemustbeintheformhh:mmandmustindicateatimeinthefuture.
Onreturn,theglobalsymbolWAIT_TIMEcontainstheconvertedtimevalue.
IfyouenterthekeywordSHOWasthesecondparameter,theproceduredisplaystheresultingvalueintheoutputstream.
Toinvokethisprocedure,usethefollowingsyntax:@CONVERThh:mm[SHOW]$EXITCONVERT.
COM命令过程的注解1.
过程检查参数是否被省略,或者为参数输入的值是否是问号()字符.
在任何一种情况下,过程分支到标号TELL.
2.
过程使用F$CVTIME函数验证时间值是一个有效24小时时钟时间;如果输入时间无效,F$CVTIME返回一条警告消息.
如果F$CVTIME函数返回出错,那么过程更改默认ON动作把控制指引到标号BADTIME.
过程使用F$ENVIRONMENT函数保存当前消息设置.
然后它设置消息格式,以便不显示警告或出错消息.
在检查这个时间值之后,过程恢复默认ON条件和消息格式.
3.
过程检查参数的格式.
它必须是按以下格式的时间值:hh:mmUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum4.
IF命令检查:(1)输入值的长度是5个字符,和(2)第三个字符(偏移2)是冒号.
IF命令包含逻辑OR运算符:如果任意一个表达式为真(即,如果长度不是5或者如果在第三个字符位置没有冒号),那么过程分支到标号BADTIME.
5.
F$TIME词法函数把当前时间值放入符号TIME.
6.
F$CVTIME函数从当前时间(已保存在符号TIME中)抽取"分钟"和"小时"字段.
然后F$CVTIME函数从想要转换的时间抽取其"分钟"和"小时"字段.
7.
这些赋值语句把当前和将来时间转换为分钟.
在赋值语句中使用符号MINUTES、HOURS、FUTURE_HOURS和FUTURE_MINUTES时,系统自动把这些值转换为整数.
8.
然后,过程从将来时间(以分钟为单位)减去当前时间(以分钟为单位).
9.
如果结果小于0,那么将来时间解释为下一日.
在这种情况下,过程添加24小时给将来时间,然后减去当前时间.
10.
过程进入循环,在此它根据MINUTES_TO_WAIT的值计算小时数.
每次通过循环,它检查MINUTES_TO_WAIT是否大于60.
如果它是,过程从MINUTES_TO_WAIT减去60并且添加1给小时数的累加器(HOURS_TO_WAIT).
11.
当过程退出循环时,它把小时和分钟值连接到一个时间字符串.
符号HOURS_TO_WAIT和MINUTES_TO_WAIT被替换为它们的等价字符串,并且用冒号分隔.
其结果字符串被赋值给符号WAIT_TIME,它拥有将来时间的相对时间值.
WAIT_TIME定义为全局符号,以便当过程CONVERT.
COM退出时它不会被删除.
12.
如果输入第二个参数SHOW,那么过程显示作为结果的时间值.
否则,它退出.
13.
在标号BADTIME位置,过程显示一条出错消息,展示错误的输入值以及它需要的格式.
在发出出错消息之后,CONVERT.
COM就退出.
EXIT命令返回一个出错状态,其高端数字设置为1.
这样可取消显示出错消息.
过程用EXIT命令明确地指定出错状态,因而可以从另一个过程执行CONVERT.
COM.
当CONVERT.
COM完成时,调用过程可以确定时间是否成功翻译.
14.
在标号TELL位置,过程显示过程做什么的信息.
TYPE命令显示在输入数据流SYS$INPUT中列出的行.
执行CONVERT.
COM命令过程的样例$SHOWTIME10-JUN-199910:38:26$@CONVERT12:00SHOWWAIT_TIME="1:22:00.
00"SHOWTIME命令显示当前日期和时间.
CONVERT.
COM以参数12:00和SHOW执行.
过程把绝对时间12:00转换为相对时间值,并显示在终端上.
B.
2REMINDER.
COM命令过程这个命令过程于指定时间在终端上显示提示消息.
过程提示想要显示消息的时间和消息文本.
过程使用CONVERT.
COM把时间转换为相对时间.
然后,过程派生一个子进程等待指定时间后显示提示消息.
过程说明如何使用F$ENVIRONMENT、F$VERIFY和F$GETDVI函数.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum例子:REMINDER.
COM$!
Proceduretoobtainaremindermessageanddisplaythis$!
messageonyourterminalatthetimeyouspecify.
$!
$!
Savecurrentstatesforprocedureandimageverification$!
Turnverificationofffordurationofprocedure$$SAVE_VERIFY_IMAGE=F$ENVIRONMENT("VERIFY_IMAGE"1)$SAVE_VERIFY_PROC=F$VERIFY(0)$!
$!
Placesthecurrentprocessinawaitstateuntilaspecified$!
absolutetime.
Then,itringsthebellontheterminaland$!
displaysamessage.
$!
$!
Promptforabsolutetime$!
$$GET_TIME:$INQUIREREMINDER_TIME"Entertimetosendreminder(hh:mm)"(2)$INQUIREMESSAGE_TEXT"Entermessage"$!
$!
CalltheCONVERT.
COMproceduretoconverttheabsolutetime$!
toadeltatime$!
$@DISK2:[JONES.
TOOLS]CONVERT'REMINDER_TIME'3)$IF.
NOT.
$STATUSTHENGOTOBADTIME$!
$!
$!
Createacommandfilethatwillbeexecuted$!
inasubprocess.
Thesubprocesswillwaituntil$!
thespecifiedtimeandthendisplayyourmessage$!
attheterminal.
IfyouareworkingataDEC_CRT$!
terminal,themessagehasdoublesizeblinking$!
characters.
Otherwise,themessagehasnormalletters.
$!
Ineithercase,theterminalbellringswhenthe$!
messageisdisplayed.
$$CREATEWAKEUP.
COM(4)$DECK!
Linesstartingwith$aredatalines$WAIT'WAIT_TIME'5)$BELL[0,7]=%X07!
Createsymboltoringthebell$IFF$GETDVI("SYS$OUTPUT","TT_DECCRT").
NES.
"TRUE"THENGOTOUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumOTHER_TERM$!
$DEC_CRT_ONLY:$!
Createsymbolstosetspecialgraphics(forDEC_CRTterminalsonly)$!
$SET_FLASH="[1;5m"!
Turnonblinkingcharacters$SET_NOFLASH="[0m"!
Turnoffblinkingcharacters$TOP="#3"Doublesizecharacters(topportion)$BOT="#4"Doublesizecharacters(bottomportion)$!
$!
Writedoublesize,blinkingmessagetotheterminalandringthebell$!
$WRITESYS$OUTPUTBELL,SET_FLASH,TOP,MESSAGE_TEXT$WRITESYS$OUTPUTBELL,BOT,MESSAGE_TEXT$WRITESYS$OUTPUTF$TIME(),SET_NOFLASH$GOTOCLEAN_UP$!
$OTHER_TERM:$WRITESYS$OUTPUTBELL,MESSAGE_TEXT$WRITESYS$OUTPUTF$TIME()$!
$CLEAN_UP:$DELETEWAKEUP.
COM;*$EOD$!
$!
Nowcontinueexecutingcommands.
$!
$SPAWN/NOWAIT/INPUT=WAKEUP.
COM(6)$END:7)$!
Restoreverification$SAVE_VERIFY_PROC=F$VERIFY(SAVE_VERIFY_PROC,SAVE_VERIFY_IMAGE)$EXIT$!
$BADTIME:$WRITESYS$OUTPUT"Timemustbeenteredashh:mm"$GOTOGET_TIMEREMINDER.
COM命令过程的注解1.
过程使用F$ENVIRONMENT函数把映象校验设置保存在符号SAVE_VERIFY_IMAGE中.
然后,过程使用F$VERIFY函数把过程校验设置保存在符号SAVE_VERIFY_PROC中.
F$VERIFY函数也停掉这两类校验.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum2.
过程使用INQUIRE命令提示输入应该发送提示消息的时间.
这个值用作过程CONVERT.
COM的输入.
过程也提示输入消息的文本.
3.
过程执行嵌套过程CONVERT.
COM.
确信已指定磁盘和目录作为文件说明的一部分;这确保系统可以找出CONVERT.
COM,而不管您是从哪个目录执行REMINDER.
COM.
CONVERT.
COM把提示转换为相对时间,并把这个时间返回到全局符号WAIT_TIME.
这个相对时间指出从当前时间直到应该发送消息的时间之间的时间间隔.
如果CONVERT.
COM返回出错,过程就分支到标号BADTIME.
4.
过程使用CREATE命令建立新过程WAKEUP.
COM.
这个过程是从一个子进程执行.
要允许CREATE命令读取开始于美元符的行,使用DECK和EOD命令包围CREATE命令的输入.
因此,在DECK和EOD命令之间的所有行被写入WAKEUP.
COM.
5.
WAKEUP.
COM执行以下任务:o它等待,直到符号WAIT_TIME指出的时间.
o它建立符号BELL使终端响铃.
o它确定终端是否是DEC_CRT终端并且可以接受换码序列显示双大小、闪烁字符.
(要查看是否有DEC_CRT终端,可输入SHOWTERMINAL命令并查看是否列出这个特征.
)o如果终端是DEC_CRT终端,那么过程定义符号SET_FLASH、TOP和BOT.
这些符号使终端使用闪烁、双大小字符.
过程也定义符号SET_NOFLASH把终端返回到正常状态.
当使用EDT编辑程序建立这些定义时要输入换码符(),可按下ESC键两次.
在定义这些符号之后,过程把三行写入终端.
第一行响铃,启动闪烁字符,并显示(使用双大小字符)消息的上半部.
第二行再次响铃并显示消息的下半部.
第三行写入当前时间,然后停掉闪烁特征,并把终端返回到正常状态.
如果没有DEC_CRT终端,过程就响起终端铃,并显示消息和时间.
oDELETE命令使过程WAKEUP.
COM在执行之后删除本身.
6.
在建立WAKEUP.
COM之后,过程派生一个子进程并指示这个子进程使用WAKEUP.
COM作为输入命令文件.
/NOWAIT限定词允许您在子进程执行WAKEUP.
COM命令的同时继续在您的终端上工作.
在指定的时间,WAKEUP.
COM在终端上显示您的消息.
注意,按照默认,SPAWN命令把全局和局部符号传递给子进程.
因此,虽然您是在REMINDER.
COM中为符号WAIT_TIME和MESSAGE_TEXT提供值,但是,WAKEUP.
COM也可以存取这些符号.
7.
过程在退出之前恢复原始的校验设置.
执行REMINDER.
COM命令过程的样例$@REMINDEREntertimetosendreminder(hh:mm):12:00Entermessage:TIMEFORLUNCH%DCL-S-SPAWNED,processBLUTO_1spawned$.
.
.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumTIMEFORLUNCH11-DEC-199912:00:56.
99过程提示输入时间值和消息.
然后,过程派生一个显示消息的子进程.
可以继续在您的终端上工作;在指定的时间,子进程响起终端的铃声,显示消息和时间.
B.
3DIR.
COM命令过程这个命令过程模仿DCL命令DIRECTORY/SIZE=ALL/DATE,显示指定文件的块大小(已使用和已分配)和建立日期.
它说明如何使用F$PARSE、F$SEARCH、F$FILE_ATTRIBUTES和F$FAO词法函数.
例子:DIR.
COM$!
$!
CommandprocedureimplementationofDIRECTORY/SIZE=ALL/DATE$!
command$!
$SAVE_VERIFY_IMAGE=F$ENVIRONMENT("VERIFY_IMAGE")$SAVE_VERIFY_PROCEDURE=F$VERIFY(0)$!
$!
ReplaceanyblankfieldoftheP1filespecificationwith$!
awildcardcharacter$!
$P1=F$PARSE(P1,1)$!
$!
Defineinitialvaluesforsymbols$!
$FIRST_TIME="TRUE"$FILE_COUNT=0$TOTAL_ALLOC=0$TOTAL_USED=0$$LOOP:2)$FILESPEC=F$SEARCH(P1)$!
Findnextfileindirectory$IFFILESPEC.
EQS.
""THENGOTODONE$!
Ifnomorefiles,thendone$IF.
NOT.
FIRST_TIMETHENGOTOSHOW_FILE$!
Printheaderonlyonce$!
$!
ConstructandoutputtheheaderlineUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
$FIRST_TIME="FALSE"3)$DIRSPEC=F$PARSE(FILESPEC,,,"DEVICE")-+F$PARSE(FILESPEC,,,"DIRECTORY")$WRITESYS$OUTPUT""$WRITESYS$OUTPUT"Directory",DIRSPEC$WRITESYS$OUTPUT""$LASTDIR=DIRSPEC$$!
$!
Putthefilenametogether,getsomeofthefileattributes,and$!
typetheinformationout$!
$SHOW_FILE:$FILE_COUNT=FILE_COUNT+1$FILENAME=F$PARSE(FILESPEC,,,"NAME"4)+F$PARSE(FILESPEC,,,"TYPE")-+F$PARSE(FILESPEC,,,"VERSION")$ALLOC=F$FILE_ATTRIBUTES(FILESPEC,"ALQ")$USED=F$FILE_ATTRIBUTES(FILESPEC,"EOF")$TOTAL_ALLOC=TOTAL_ALLOC+ALLOC$TOTAL_USED=TOTAL_USED+USED$REVISED=F$FILE_ATTRIBUTES(FILESPEC,"RDT")$LINE=F$FAO("!
19AS!
5UL/!
5!
17AS",FILENAME,-USED,ALLOC,REVISED)$WRITESYS$OUTPUTLINE$GOTOLOOP$$!
$!
Outputsummaryinformation,resetverification,andexit$!
$DONE:5)$WRITESYS$OUTPUT""$WRITESYS$OUTPUT"Totalof''FILE_COUNT'files,"+-"''TOTAL_USED'/''TOTAL_ALLOC'blocks.
"$SAVE_VERIFY_PROCEDURE=F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)$EXITDIR.
COM命令过程的注解1.
这个过程使用F$PARSE函数把星号放在用户提供的文件说明P1的空白字段中.
执行DIR.
COM时,如果没有指定参数,那么F$PARSE函数把值"*.
*;*"赋予P1.
这使DIR.
COM显示当前默认目录的所有文件.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum2.
F$SEARCH词法函数搜索目录查找P1指出的文件.
如果P1包含任何通配符(星号),那么F$SEARCH函数返回所有匹配的文件说明.
在返回最后一个文件说明之后,过程分支到标号DONE.
3.
第一次通过循环时,过程为目录显示写入标题.
这个标题包括设备和目录名.
要获得这些名称,过程使用F$PARSE函数.
4.
过程使用F$PARSE词法函数从目录中的每个文件说明抽取文件名.
然后,F$FILE_ATTRIBUTES词法函数获得每个文件的使用块、分配块和建立日期的信息.
最后,F$FAO函数为目录的每个文件格式化单个显示行.
F$FAO函数使用文件名和文件属性信息作为变元.
5.
当F$SEARCH返回空串时,过程分支到标号DONE并显示概要信息,展示在目录中的文件总数、使用块总数和分配块总数.
执行DIR.
COM命令过程的样例$@DIR[VERN]*.
COM目录DISK4:[VERN]BATCH.
COM;11/311-DEC-199911:43CALC.
COM;31/311-DEC-199911:30CONVERT.
COM;15/611-DEC-199915:23.
.
.
LOGIN.
COM;342/311-DEC-199913:17PID.
COM;71/311-DEC-199909:49SCRATCH.
COM;61/311-DEC-199911:29)共15文件,22/48块.
过程返回在目录[VERN]中的所有.
COM文件的信息.
B.
4SYS.
COM命令过程这个命令过程返回有关当前进程、组中所有进程(如果当前进程有组特权)和系统中所有进程(如果当前进程有全体用户特权)的统计信息.
这个过程说明如何使用F$PID、F$EXTRACT和F$GETJPI词法函数.
例子:SYS.
COM$!
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
Displaysinformationaboutowner,group,orsystemprocesses.
$!
$!
Turnoffverificationandsavecurrentsettings$SAVE_VERIFY_IMAGE=F$ENVIRONMENT("VERIFY_IMAGE")$SAVE_VERIFY_PROCEDURE=F$VERIFY(0)$CONTEXTInitializePIDsearchcontext(1)$!
$!
Outputheaderline.
$!
$WRITESYS$OUTPUT"PIDUsernameTermProcess2)"nameStatePriImage"$!
$!
Outputprocessinformation.
$!
$LOOP:$!
$!
GetnextPID.
Ifnull,thendone.
$!
$PID=F$PID(CONTEXT)3)$IFPID.
EQS.
""THENGOTODONE$!
$!
Getimagefilespecificationandextractthefilename.
$!
$IMAGNAME=F$GETJPI(PID,"IMAGNAME"4)$IMAGNAME=F$PARSE(IMAGNAME,,,"NAME","SYNTAX_ONLY")$!
$!
Getterminalname.
Ifnone,thendescribetypeofprocess.
$!
$TERMINAL=F$GETJPI(PID,"TERMINAL"5)$IFTERMINAL.
EQS.
""THEN-TERMINAL="-"+F$EXTRACT(0,3,F$GETJPI(PID,"MODE"))+"-"$IFTERMINAL.
EQS.
"-INT-"THENTERMINAL="-DET-"$IFF$GETJPI(PID,"OWNER").
NE.
0THENTERMINAL="-SUB-"$!
$!
Getmoreinformation,putprocesslinetogether,$!
andoutputit.
$!
$LINE=F$FAO("!
AS!
12AS!
7AS!
15AS!
5AS!
2UL/!
UL!
10AS",-(6)PID,F$GETJPI(PID,"USERNAME"),TERMINAL,-F$GETJPI(PID,"PRCNAM"),-F$GETJPI(PID,"STATE"),F$GETJPI(PID,"PRI"),-F$GETJPI(PID,"PRIB"),IMAGNAME)$WRITESYS$OUTPUTLINE$GOTOLOOPUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
$!
Restoreverificationandexit.
$!
$DONE:$SAVE_VERIFY_PROCEDURE=F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)$EXITSYS.
COM命令过程的注解1.
符号CONTEXT初始化为一个空值.
这个符号将用于F$PID函数获得一个进程标识数的列表.
2.
过程写入显示的标题.
3.
过程取得第一个进程标识(PID)数.
如果当前进程缺乏组或全体用户特权,那么就返回当前进程的PID数.
如果当前进程有组特权,那么就返回组列表中的第一个PID数.
如果当前进程有全体用户特权,就返回系统列表中的第一个PID数.
这个函数按顺序继续返回下一个PID数,直到返回最后一个PID数.
在这一点上,返回一个空串,然后过程分支到末端.
4.
过程使用F$GETJPI词法函数获得每个PID数的映象文件说明.
F$PARSE函数从F$GETJPI函数返回的说明中抽取文件名.
5.
过程使用F$GETJPI函数获得每个PID数的终端名.
F$EXTRACT函数抽取F$GETJPI(PID,"MODE")返回的MODE说明的前3个字符确定进程的类型.
再次使用F$GETJPI函数确定进程是否是子进程.
6.
过程为返回的每个PID数使用F$GETJPI词法函数获得用户名、进程名、进程状态、进程优先级和进程基优先级.
F$FAO词法函数格式化这个信息用于屏幕显示.
执行SYS.
COM命令过程的样例$@SYSPIDUsernameTermProcessnameStatePriImage00050011NETNONPRIV-NET-MAIL_14411LEF9/4MAIL00040013STOVERTA6:STOVELEF9/400140015MAROT-DET-DMFB0ACPHIB9/8F11BAC00080016THOMPSON-DET-MTA0ACPHIB12/8MTAAACP00070017JUHLESTTF1:JUHLESLEF9/4.
.
.
00040018MARCOTTA2:MARCOHIB9/4RTPAD0018001AVERNRTA3:VERNLEF9/40033001BYISHARTA7:YISHACUR4/4UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum0002004ASYSTEM-DET-ERRFMTHIB12/7ERRFMT这个过程返回系统上所有进程的信息.
当前进程有全体用户特权.
B.
5GETPARMS.
COM命令过程这个命令过程返回传递给过程的参数数目.
可以从另一个过程调用GETPARMS.
COM确定有多少参数传递给调用过程.
例子:GETPARMS.
COM$!
Proceduretocountthenumberofparameterspassedtoacommand$!
procedure.
ThisnumberisreturnedastheglobalsymbolPARMCOUNT.
$!
$SAVE_VERIFY_IMAGE=F$ENVIRONMENT("VERIFY_IMAGE"1)$SAVE_VERIFY_PROCEDURE=F$VERIFY(0)$!
$IFP1.
EQS.
""THENGOTOTELL(2)$!
$!
Looptocountthenumberofparameterspassed.
Nullparametersare$!
counteduntilthelastnon-nullparameterispassed.
$!
$COUNT=0(3)$LASTNONNULL=0$LOOP:$IFCOUNT.
EQ.
8THENGOTOEND_COUNT$COUNT=COUNT+1$IFP'COUNT'.
NES.
""THENLASTNONNULL=COUNT$GOTOLOOP$!
$END_COUNT:4)$!
$!
Placethenumberofnon-nullparameterspassedintoPARMCOUNT.
$!
$PARMCOUNT==LASTNONNULL$!
$!
Restoreverificationsetting,ifitwason,beforeexiting5)$SAVE_VERIFY_PROCEDURE=F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)$EXIT$!
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$TELL:6)$TYPESYS$INPUTThisprocedurecountsthenumberofparameterspassedtoanotherprocedure.
Thisprocedurecanbecalledbyenteringthefollowingstringinanyprocedure:@GETPARMS'P1'P2'P3'P4'P5'P6'P7'P8Onreturn,theglobalsymbolPARMCOUNTcontainsthenumberofparameterspassedtotheprocedure.
$!
$EXITGETPARMS.
COM命令过程的注解1.
在停掉校验之前,过程保存当前的映象和过程校验设置.
2.
如果一个问号字符作为参数传递到过程,那么过程分支到标号TELL(注释6).
3.
建立循环,计数传递给过程的参数数目.
在进入循环之前,计数器COUNT和LASTNONNULL初始化为0.
在循环内,COUNT递增并且与值8进行比较测试.
如果COUNT等于8,那么已输入参数的最大数目.
每次传递非空参数时,LASTNONNULL等于参数的数目.
IF命令每次执行时,符号COUNT有不同的值.
第一次,COUNT值是1而IF命令检查P1.
第二次,它检查P2,以此类推.
4.
当参数计数达到8,过程分支到END_COUNT.
符号LASTNONNULL包含最后传递的非空参数的计数.
这个值放置在全局符号PARMCOUNT.
PARMCOUNT必须已定义为一个全局符号,以便它的值可以在调用命令级测试.
5.
恢复原始的校验设置.
6.
在标号TELL,TYPE命令显示输入流包括的数据.
(在这个命令过程中,输入流就是这个命令过程文件.
)TYPE命令显示如何使用GETPARMS.
COM的指令.
执行GETPARMS.
COM命令过程的样例过程SORTFILES.
COM需要用户传递三个非空参数.
SORTFILES.
COM过程可以包含以下行:$@GETPARMS'P1''P2''P3''P4''P5''P6''P7''P8'$IFPARMCOUNT.
NE.
3THENGOTONOT_ENOUGH.
.
.
$NOT_ENOUGH:$WRITESYS$OUTPUT-"Threenon-nullparametersrequired.
TypeSORTFILESHELPforinfo.
"$EXITTUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum过程SORTFILES.
COM可以调用如下:$@SORTFILESDEF4Threenon-nullparametersrequired.
TypeSORTFILEHELPforinfo.
要恰当地调用这个过程---即传递给SORTFILES的参数要原样传递给GETPARMS处理---符号P1至P8必须括入单引号内.
如果GETPARMS的返回值不是3,那么SORTFILES输出一个出错消息并退出.
B.
6EDITALL.
COM命令过程这个命令过程调用EDT编辑程序重复地编辑一组带同样文件类型的文件.
这个过程说明如何使用词法函数从按列输出中抽取文件名.
它也说明在命令过程中为被调用的程序重新定义输入流的方法.
例子:EDITALL.
COM$!
Proceduretoeditallfilesinadirectorywitha$!
specifiedfiletype.
UseP1toindicatethefiletype.
$!
$ONCONTROL_YTHENGOTODONE!
Ctrl/Yaction(1)$ONERRORTHENGOTODONE$!
$!
Checkforfiletypeparameter.
Ifonewasentered,continue;$!
otherwise,promptforaparameter.
$!
$IFP1.
NES.
""THENGOTOOKAY(2)$INQUIREP1"Enterfiletypeoffilestoedit"$!
$!
ListallfileswiththespecifiedfiletypeandwritetheDIRECTORY$!
outputtoafilenamedDIRECT.
OUT$!
$OKAY:$DIRECTORY/VERSIONS=1/COLUMNS=13)/NODATE/NOSIZE-/NOHEADING/NOTRAILING-/OUTPUT=DIRECT.
OUT*.
'P1'$IF.
NOT.
$STATUSTHENGOTOERROR_SEC(4)$!
$OPEN/READ/ERROR=ERROR_SECDIRFILEDIRECT.
OUT(5)$!
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
Looptoreaddirectoryfile$!
$NEWLINE:6)READ/END=DONEDIRFILENAMEDEFINE/USER_MODESYS$INPUTSYS$COMMAND:!
RedefineSYS$INPUTEDIT'NAME'EditthefileGOTONEWLINE$!
$DONE:7)CLOSEDIRFILE/ERROR=NOTOPEN!
Closethefile$NOTOPEN:DELETEDIRECT.
OUT;Deletetempfile$EXIT$!
$ERROR_SEC:WRITESYS$OUTPUT"Error:",F$MESSAGE($STATUS)DELETEDIRECT.
OUT;*$EXITEDITALL.
COM命令过程的注解1.
ON命令建立处理这个过程的条件.
如果在执行这个过程期间的任何时候按下Ctrl/Y,过程就分支到标号DONE.
同样,如果发生任何出错或严重出错,那么过程就分支到标号DONE.
2.
过程检查参数是否被输入.
如果没有,过程就提示输入文件类型.
3.
DIRECTORY命令列出带P1指定的文件类型的所有文件.
命令输出写入到文件DIRECT.
OUT.
/VERSIONS=1限定词请求只列出每个文件的最高版本.
/NOHEADING和/NOTRAILING限定词请求输出不包括标题行或目录概要.
/COLUMNS=1限定词确保每个记录给出一个文件名.
4.
通过测试$STATUS的值,IF命令检查DIRECTORY命令的返回值.
如果DIRECTORY命令没有成功完成,那么$STATUS有偶数值,并且过程分支到标号ERROR_SEC.
5.
OPEN命令打开目录输出文件,并为它分配逻辑名DIRFILE.
6.
READ命令从DIRECTORY命令输出读取一行,并写入符号NAME.
在它读取每行之后,过程使用DEFINE命令把编辑对话期的输入流(SYS$INPUT)重新定义到终端.
然后,它调用编辑程序,指定符号名为文件说明.
当编辑对话期完成时,命令解释程序读取命令过程的下一行,并且分支到标号NEWLINE.
当过程编辑了目录中指定文件类型的所有文件之后,它分支到标号DONE.
7.
标号DONE是READ命令的/END限定词的目标标号,并且ONCONTROL_Y和ONERROR条件的目标标号在过程的开始设置.
在这个标号上,过程执行必要的清除操作.
CLOSE命令关闭DIRECTORY命令的输出文件;/ERROR限定词把标号指定在文件的下一行.
/ERROR的这个使用将取消如果目录文件没有打开而显示的任何出错消息.
例如,如果在目录文件打开之前按下Ctrl/Y,那么将发生这种情形.
清除的第二步是删除临时目录文件.
执行EDITALL.
COM命令过程的样例UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$@EDITALLDAT*.
.
.
%DELETE-I-FILDEL,device:[directory]DIRECT.
OUT;1deleted(xblocks)过程EDITALL调用时,P1指定为.
DAT.
过程建立一个目录,列出在默认目录中其文件类型是.
DAT的所有文件,并且调用编辑程序编辑每一个.
在完成编辑最后一个带文件类型.
DAT的文件之后,过程删除临时文件DIRECT.
OUT,并在终端上显示通知消息.
B.
7MAILEDIT.
COM命令过程这个命令过程在Mail公用程序中调用文本编辑程序.
例子:MAILEDIT.
COM$!
CommandproceduretoinvokeaneditorforMail.
$!
$!
Inputs:$!
$!
P1=Inputfilename.
$!
P2=Outputfilename.
$!
$!
IfMAIL$EDITisundefined,Mailwillinvoketheuser'sselected$!
callableeditorsetbythemailSETEDITORcommand.
$!
$!
IfMAIL$EDITisdefinedtobeacommandprocedure,Mailwillcreate$!
asubprocesstoeditthemail,butanySETEDITORcommandinMail$!
willoverridethedefinitionofMAIL$EDITfortheremainderofthat$!
Mailsession.
$!
$!
Notethatthisprocedureisruninthecontextofasubprocess.
$!
LOGIN.
COMisnotexecuted.
However,allprocesslogicalnames$!
andDCLglobalsymbolsarecopied.
Inparticular,notethatthe$!
user'sindividualdefinitionofthesymbolEDITisusedifthere$!
isone.
Otherwise,thesystemdefaulteditorisused.
$!
$!
Thedefaultdirectoryisthesameastheparentprocess$!
$DEFINE/USERSYS$INPUT'F$TRNLNM("SYS$OUTPUT"1)$IFP1.
EQS.
""THENGOTONOINPUT(2)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$EDIT/OUTPUT='P2''P1'3)$EXIT$NOINPUT:$EDIT'P2'4)$EXITMAILEDIT.
COM命令过程的注解1.
DEFINE命令允许编辑程序的输入来自终端,代替命令文件.
2.
IF语句区别编辑不同名文件和编辑同名文件.
3.
这个EDIT命令带输入和输出文件名调用编辑程序.
您可以编辑这行以调用您自己的编辑程序.
例如:$RUNXYZ_EDITOR.
EXE/INPUT='P1'/OUTPUT='P2'4.
这个EDIT命令带单个文件名调用编辑程序.
您可以编辑这行以调用您自己的编辑程序.
例如:$RUNXYZ_EDITOR.
EXE/INPUT='P2'/OUTPUT='P2'执行MAILEDIT.
COM命令过程的样例$DEFINEMAIL$EDITMAILEDIT.
COM$MAILMAIL>SHOWEDITORYoureditorisdefinedbythefileMAILEDIT.
COM.
B.
8FORTUSER.
COM命令过程提供一个系统定义的注册命令过程的样例,它为建立、编译和执行FORTRAN程序的交互用户控制终端环境.
如果用户注册到一个受约束帐户,在此FORTUSER.
COM被列为注册命令过程,那么这个用户只可以执行FORTUSER.
COM接受的命令.
这个过程也说明如何使用词法函数遍历选项表,用一列有效命令比较用户输入的命令.
例子:FORTUSER.
COM$!
Proceduretocreate,compile,link,execute,anddebug$!
FORTRANprograms.
Userscanenteronlythecommandslisted$!
inthesymbolOPTION_TABLE.
$SETNOCONTROL=Y(1)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$SAVE_VERIFY_IMAGE=F$ENVIRONMENT("VERIFY_IMAGE")$SAVE_VERIFY_PROCEDURE=F$VERIFY(0)$OPTION_TABLE="EDIT/COMPILE/LINK/RUN/EXECUTE/DEBUG/PRINT/HELP/FILE/DONE/"(2)$TYPESYS$INPUT(3)VMSFORTRANCommandInterpreterEnternameoffilewithwhichyouwouldliketowork.
$!
$!
Setupforinitialprompt$!
$PROMPT="INIT"4)$GOTOHELP!
Printtheinitialhelpmessage$!
$!
afterthefirstpromptingmessage,usetheprompt:Command$!
$INIT:$PROMPT="GET_COMMAND"$GOTOFILE!
Getinitialfilename$!
$!
Maincommandparsingroutine.
Theroutinecomparesthecurrent$!
commandagainsttheoptionsintheoptiontable.
Whenitfinds$!
amatch,itbranchestotheappropriatelabel.
$!
$GET_COMMAND:$ONCONTROL_YTHENGOTOGET_COMMAND!
Ctrl/Yresetsprompt(5)$SETCONTROL=Y$ONWARNINGTHENGOTOGET_COMMAND!
Ifany,resetprompt$INQUIRECOMMAND"Command"$IFCOMMAND.
EQS.
""THENGOTOGET_COMMAND$IFF$LOCATE(COMMAND+"/",OPTION_TABLE).
EQ.
F$LENGTH(OPTION_TABLE)-(6)THENGOTOINVALID_COMMAND$GOTO'COMMAND'$!
$INVALID_COMMAND:7)$WRITESYS$OUTPUT"Invalidcommand"$!
$HELP:8)$TYPESYS$INPUTThecommandsyoucanenterare:FILENameofFORTRANprograminyourcurrentUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumdefaultdirectory.
Subsequentcommandsprocessthisfile.
EDITEdittheprogram.
COMPILECompiletheprogramwithFORTRAN.
LINKLinktheprogramtoproduceanexecutableimage.
RUNRuntheprogram'sexecutableimage.
EXECUTESamefunctionasCOMPILE,LINK,andRUN.
DEBUGRuntheprogramundercontrolofthedebugger.
PRINTQueuethemostrecentlistingfileforprinting.
DONEReturntointeractivecommandlevel.
HELPPrintthishelpmessage.
EnterCtrl/Ytorestartthissession$GOTO'PROMPT'9)$EDIT:10)$DEFINE/USER_MODESYS$INPUTSYS$COMMAND:$EDIT'FILE_NAME'.
FOR$GOTOGET_COMMAND$COMPILE:$FORTRAN'FILE_NAME'/LIST/OBJECT/DEBUG$GOTOGET_COMMAND$LINK:$LINK'FILE_NAME'/DEBUG$PURGE'FILE_NAME'.
*/KEEP=2$GOTOGET_COMMAND$RUN:$DEFINE/USER_MODESYS$INPUTSYS$COMMAND:$RUN/NODEBUG'FILE_NAME'$GOTOGET_COMMAND$DEBUG:$DEFINE/USER_MODESYS$INPUTSYS$COMMAND:$RUN'FILE_NAME'$GOTOGET_COMMAND$EXECUTE:$FORTRAN'FILE_NAME'/LIST/OBJECT$LINK/DEBUG'FILE_NAME'$PURGE'FILE_NAME'.
*/KEEP=2$RUN/NODEBUG'FILE_NAME'$GOTOGET_COMMAND$PRINT:$PRINT'FILE_NAME'$GOTOGET_COMMAND$BADFILE:11)$WRITESYS$OUTPUT"Filemustbeincurrentdefaultdirectory.
"UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$FILE:$INQUIREFILE_NAME"Filename"$IFFILE_NAME.
EQS.
""THENGOTOFILE$IFF$PARSE(FILE_NAME,,,"DIRECTORY").
NES.
F$DIRECTORY()-(12)THENGOTOBADFILE$FILE_NAME=F$PARSE(FILE_NAME,,,"NAME")$GOTOGET_COMMAND$DONE:$EXITFORTUSER.
COM命令过程的注解1.
SETNOCONTROL=Y命令确保在这个过程控制下的注册用户不能中断这个过程或其中的任何命令或程序.
2.
任选项表列出允许用户执行的命令.
每个命令用斜杠分隔.
3.
过程引入本身.
4.
在过程中符号名PROMPT被赋予标号的值.
当过程最初被调用时,这个符号有值INIT.
HELP命令文本终止于指定标号PROMPT的GOTO命令.
当这个文本第一次显示时,GOTO命令导致控制流转移到标号HELP.
它显示HELP消息,解释可以输入的命令.
然后,过程转移回标号INIT,在此PROMPT的值更改为"GET_COMMAND".
最后,过程转移到标号FILE获得文件名.
其后,当显示求助文本时,过程转移到标号GET_COMMAND去获得下一个命令.
5.
Ctrl/Y条件动作设置为返回到标号GET_COMMAND,好象是警告条件动作.
过程提示输入命令并且继续提示,即使没有输入任何字符.
要终止对话期并返回到交互命令级,输入命令DONE.
6.
过程使用F$LOCATE和F$LENGTH词法函数确定命令是否包括在任选项列表中.
F$LOCATE函数搜索用户输入的命令,后面跟随一个斜杠.
(例如,如果输入EDIT,过程就搜索EDIT/.
)如果命令没有包括在任选项列表中,那么过程转移到标号INVALID_COMMAND.
如果命令是有效的,过程就转移到适当的标号.
7.
在标号INVALID_COMMAND,过程写入出错消息并显示求助文本,列出有效的命令.
8.
求助文本列出有效的命令.
最初就显示这个文本.
无论何时用户输入HELP命令或任何无效命令,也显示它.
9.
在求助文本结束处,GOTO命令指定符号名PROMPT.
当这个过程第一次调用时,该符号有值INIT.
其后,它有值GET_COMMAND.
10.
列表中的每个有效命令在任选项表中有相应的条目,并且在命令过程中有相应的标号.
对于从终端读取输入的命令,例如EDIT,过程包含一个把输入流定义为SYS$COMMAND的DEFINE命令.
11.
在标号BADFILE处,过程显示一条消息,指出文件必须在当前目录中.
然后过程提示输入另一个文件名.
12.
在获得文件名之后,过程检查您没有指定一个不同于当前默认目录的目录.
然后,过程使用F$PARSE函数抽取文件名.
(每个命令提供适当的默认文件类型.
)其次,过程转移回标号GET_COMMAND去获得一个处理这个文件的命令.
执行FORTUSER.
COM命令过程的样例UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum以下例子说明如何把这个命令过程用作受约束命令过程:Username:CLASS30Password:OpenVMSVersion7.
1OpenVMSFORTRANCommandInterpreterEnternameoffilewithwhichyouwouldliketowork.
Thecommandsyoucanenterare:FILENameofFORTRANprograminyourcurrentdefaultdirectory.
Subsequentcommandsprocessthisfile.
EDITEdittheprogram.
COMPILECompiletheprogramwithVAXFORTRAN.
LINKLinktheprogramtoproduceanexecutableimage.
RUNRuntheprogram'sexecutableimage.
EXECUTESamefunctionasCOMPILE,LINKandRUN.
DEBUGRuntheprogramundercontrolofthedebugger.
PRINTQueuethemostrecentlistingfileforprinting.
DONEReturntointeractivecommandlevel.
HELPPrintthishelpmessage.
EnterCtrl/YtorestartthissessionFilename:AVERAGECommand:COMPILECommand:LINKCommand:RUNCommand:FILEFilename:READFILECommand:EDIT这个执行样例说明一个对话期,其中用户CLASS30注册到被FORTUSER命令过程控制的帐户.
FORTUSER命令过程显示允许用户执行的命令,以及一条重新启动对话期的指令.
然后,用户指定文件AVERAGE、编译、链接和运行它.
然后,用户输入FILE命令开始处理另一个文件.
B.
9LISTER.
COM命令过程UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum提示输入数据,按列格式化数据,并把它排序到输出文件.
这个过程说明如何使用READ和WRITE命令,以及赋值语句的字符子串覆盖格式.
例子:LISTER.
COM$!
Proceduretoaccumulateprogrammernamesanddocumentfilenames.
$!
Afterallprogrammernamesandfilenamesareentered,theyare$!
sortedinalphabeticorderbyprogrammernameandprintedon$!
thesystemprinter.
$!
$SAVE_VERIFY_IMAGE=F$ENVIRONMENT("VERIFY_IMAGE"1)$SAVE_VERIFY_PROCEDURE=F$VERIFY(0)$!
$OPEN/WRITEOUTFILEDATA.
TMP!
Createoutputfile(2)$!
$!
Looptoobtainprogrammers'lastnamesandfilenames,$!
andwritethisdatatoDATA.
TMP.
$!
$LOOP:3)INQUIRENAME"Programmer(pressReturntoquit)"IFNAME.
EQS.
""THENGOTOFINISHEDINQUIREFILE"Documentfilename"RECORD[0,20]:='NAME'4)RECORD[21,20]:='FILE'WRITEOUTFILERECORDGOTOLOOP$FINISHED:CLOSEOUTFILE$!
$DEFINE/USER_MODESYS$OUTPUT:NL:!
Suppresssortoutput$SORT/KEY=(POSITION:1,SIZE=20)DATA.
TMPDOC.
SRT(5)$!
$OPEN/WRITEOUTFILEDOCUMENT.
DAT(6)$WRITEOUTFILE"ProgrammerFilesasof",F$TIME()$WRITEOUTFILE""$RECORD[0,20]:="ProgrammerName"$RECORD[21,20]:="FileName"$WRITEOUTFILERECORD$WRITEOUTFILE""$!
$CLOSEOUTFILE(7)$APPENDDOC.
SRTDOCUMENT.
DAT$PRINTDOCUMENT.
DATUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
$INQUIRECLEAN_UP"Deletetemporaryfiles[Y,N]8)$IFCLEAN_UPTHENDELETEDATA.
TMP;*,DOC.
SRT;*$SAVE_VERIFY_PROCEDURE=F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)$EXITLISTER.
COM命令过程的注解1.
LISTER.
COM保存当前校验设置并停掉校验.
2.
OPEN命令为写入建立临时文件.
3.
INQUIRE命令提示输入程序员名和文件名.
如果通过按下Return输入一个空行来响应INQUIRE命令的提示,那么过程假定没有其他数据输入,并且转移到标号FINISHED.
4.
在赋值给符号NAME和FILE之后,过程使用赋值语句的字符串覆盖格式来构造符号RECORD的值.
在RECORD的列1至21,写入NAME的当前值.
命令解释程序用空格填充NAME的值使其长度为指定的20个字符.
同样,RECORD的后20列填充为FILE的值.
然后,把RECORD的值写入输出文件.
5.
在文件关闭之后,过程排序输出文件DATA.
TMP.
DEFINE命令指示SORT命令输出到空文件NL.
否则,这些统计将显示在终端上:排序执行在前20列;即,按程序员名排序.
排序的输出文件有名称DOC.
SRT.
6.
过程使用OPEN命令建立最终的输出文件DOCUMENT.
DAT.
写入文件的第一行是标题行,给出标题、当天的日期和时间和列标题.
7.
过程关闭文件DOCUMENT.
DAT,并把排序的输出文件DOC.
SRT附加到这个文件.
然后,输出文件排队到系统打印机.
8.
过程提示确定是否删除中间文件.
如果在INQUIRE命令提示中输入真回答(T、t、Y或y),那么就删除文件DATA.
TMP和DOC.
SRT.
否则,保留它们.
执行LISTER.
COM命令过程的样例$@LISTERProgrammer:WATERSDocumentfilename:CRYSTAL.
CAVProgrammer:JENKINSDocumentfilename:MARIGOLD.
DATProgrammer:MASONDocumentfilename:SYSTEM.
SRCProgrammer:ANDERSONDocumentfilename:JUNK.
JProgrammer:[Return]Deletetemporaryfiles[Y,N]:y这个过程执行的输出文件结果包含以下内容:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumProgrammerFilesasof31-DEC-199916:18:58.
79ProgrammerNameFileNameANDERSONJUNK.
JJENKINSMARIGOLD.
DATMASONSYSTEM.
SRCWATERSCRYSTAL.
CAVB.
10CALC.
COM命令过程执行算术计算,并把结果值转换为十六进制和十进制值.
例子:CALC.
COM$!
Proceduretocalculateexpressions.
Ifyouenteran$!
assignmentstatement,thenCALC.
COMevaluatestheexpression$!
andassignstheresulttothesymbolyouspecify.
Inthenext$!
iteration,youcanuseeitheryoursymbolorthesymbolQto$!
representthecurrentresult.
$!
$!
Ifyouenteranexpression,thenCALC.
COMevaluatesthe$!
expressionandassignstheresulttothesymbolQ.
In$!
thenextiteration,youcanusethesymbolQtorepresent$!
thecurrentresult.
$!
$SAVE_VERIFY_IMAGE=F$ENVIRONMENT("VERIFY_IMAGE")$SAVE_VERIFY_PROCEDURE=F$VERIFY(0)$START:$ONWARNINGTHENGOTOSTART(1)$INQUIRESTRING"Calc"2)$IFSTRING.
EQS.
""THENGOTOCLEAN_UP$IFF$LOCATE("=",STRING).
EQ.
F$LENGTH(STRING)THENGOTOEXPRESSION$!
$!
Executeifstringisintheformsymbol=expression$STATEMENT:3)$'STRING'!
Executeassignmentstatements$SYMBOL=F$EXTRACT(0,F$LOCATE("=",STRING)-1,STRING)!
getsymbolname$Q='SYMBOL'Setupqforfutureiterations$LINE=F$FAO("Decimal=!
SLHex=!
-!
XLOctal=!
-!
OL",Q)UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$WRITESYS$OUTPUTLINE$GOTOSTART$!
$!
$!
Executeifstringisanexpression$EXPRESSION:4)$Q=F$INTEGER('STRING'CanuseQinnextiteration$LINE=F$FAO("Decimal=!
SLHex=!
-!
XLOctal=!
-!
OL",Q)$WRITESYS$OUTPUTLINE$GOTOSTART$!
$CLEAN_UP:$SAVE_VERIFY_PROCEDURE=F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE)$EXITCALC.
COM命令过程的注解1.
过程建立一个重新启动过程的出错处理条件.
如果发生一个警告或更严重的出错,那么过程转移到重新设置ON条件的开始点.
如果用户输入一个错误的表达式,那么这个技术确保过程将不会退出.
2.
INQUIRE命令提示输入算术表达式.
过程接受的表达式格式如下:name=expressionexpression4.
如果按下Return,那么过程假定结束CALC对话期并退出.
如果按格式"name=expression"输入,那么过程将在标号STATEMENT继续执行.
否则,过程转移到标号EXPRESSION.
5.
过程执行赋值语句,并把表达式的结果赋值给符号.
然后过程抽取符号名,并把符号的值赋值给Q.
这允许您在过程的下一个循环中使用Q或您的符号.
然后,过程显示结果并转移回标号START.
6.
过程求表达式的值,并把结果赋值给符号Q.
这允许您在过程的下一个循环中使用Q.
然后,过程显示结果并转移回标号START.
执行CALC.
COM命令过程的样例$@CALCCalc:2*30UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumDecimal=60Hex=0000003COctal=00000000074Calc:Q+3Decimal=63Hex=0000003FOctal=00000000077Calc:TOTAL=Q+4Decimal=67Hex=00000043Octal=00000000103Calc:5+7Decimal=12Hex=0000000COctal=00000000014Calc:[Return]$在过程的每个提示之后,用户输入一个算术表达式.
过程按十进制、十六进制和八进制格式显示结果.
通过按下Return输入一行不带数据的空行,结束CALC对话期.
B.
11BATCH.
COM命令过程接受一个命令字符串、命令过程或一列命令,然后以批量作业模式执行这些命令.
例子:BATCH.
COM$VERIFY_IMAGE=F$ENVIRONMENT("VERIFY_IMAGE")$VERIFY_PROCEDURE=F$VERIFY(0)$!
$!
Turnoffverificationandsavecurrentsettings.
$!
(Thiscommentmustappearafteryouturnverification$!
off;otherwiseitwillappearinthebatchjoblogfile.
)$!
$!
$!
Ifthisisbeingexecutedasabatchjob,$!
(fromtheSUBMITsectionbelow)gototheEXECUTE_BATCH_JOBsection$!
Otherwise,gettheinformationyouneedtopreparetoexecutethe$!
batchjob.
$!
$IFF$MODE().
EQS.
"BATCH"THENGOTOEXECUTE_BATCH_JOB(1)$!
$!
$!
Preparetosubmitacommand(oracommandprocedure)asabatchjob.
$!
First,determineamnemonicprocessnameforthebatchjob.
Usethe$!
followingrules:$!
$!
1)Iftheuserisexecutingasinglecommand,thenusetheverbname.
$!
Stripoffanyqualifiersthatwereincludedwiththecommand.
$!
2)Iftheuserisexecutingacommandprocedure,thenusethefilename.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$!
3)Otherwise,useBATCH.
$!
$JOB_NAME=P1(2)$IFJOB_NAME.
EQS.
""THENJOB_NAME="BATCH"$IFF$EXTRACT(0,1,JOB_NAME).
EQS.
"@"THENJOB_NAME=F$EXTRACT(1,999,JOB_NAME)$JOB_NAME=F$EXTRACT(0,F$LOCATE("/",JOB_NAME),JOB_NAME)$JOB_NAME=F$PARSE(JOB_NAME,,,"NAME","SYNTAX_ONLY")$IFJOB_NAME.
EQS.
""THENJOB_NAME="BATCH"$!
$!
$!
Getthecurrentdefaultdeviceanddirectory.
$!
$ORIGDIR=F$ENVIRONMENT("DEFAULT")$!
$!
$!
Concatenatetheparameterstoformthecommandstringtobeexecuted.
$!
Iftheuserdidnotenteracommandstring,thesymbolCOMMANDwillhave$!
anullvalue.
$!
$COMMAND=P1+""+P2+""+P3+""+P43)P5+""+P6+""+P7+""+P8$!
$!
$!
Iftheuserisexecutingasinglecommandandifboththecommandandthe$!
originaldirectoryspecificationaresmallenoughtobepassedas$!
parameterstotheSUBMITcommand,thensubmitthebatchjobnow.
$!
$IF(P1.
NES.
"").
AND.
(F$LENGTH(COMMAND).
LE.
255).
AND.
-(4)(F$LENGTH(ORIGDIR).
LE.
255)THENGOTOSUBMIT$!
$!
$!
Ifthesinglecommandtobeexecutedinthebatchjobisverylarge,or$!
ifyouhavetopromptforcommandstoexecuteinthebatchjob,then$!
createatemporarycommandproceduretoholdthosecommandsandgetthe$!
fullyexpandednameofthecommandprocedure.
$!
$CREATE_TEMP_FILE:$ONCONTROL_YTHENGOTOCONTROL_Y_HANDLER(5)$OPEN/WRITE/ERROR=FILE_OPEN_ERRORTEMPFILEUNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumSYS$SCRATCH:'JOB_NAME'.
TMP(6)$FILESPEC=F$SEARCH("SYS$SCRATCH:"+JOB_NAME+".
TMP")$!
$!
Bydefault,havethebatchjobcontinueifitencountersanyerrors.
$!
$WRITETEMPFILE"$SETNOON"$!
$!
Eitherwritethesinglelargecommandtothefile,orpromptfor$!
multiplecommandsandwritethemtothefile.
$!
$IFCOMMAND.
NES.
THENGOTOWRITE_LARGE_COMMAND$$LOOP:$READ/END_OF_FILE=CLOSE_FILE/PROMPT="Command:"SYS$COMMANDCOMMAND$IFCOMMAND.
EQS.
""THENGOTOCLOSE_FILE$WRITETEMPFILE"$",COMMAND$GOTOLOOP$$WRITE_LARGE_COMMAND:$WRITETEMPFILE"$",COMMAND$$!
$!
Finishthetemporaryfilebydefiningasymbolsothatyouwillknow$!
thenameofthecommandproceduretodeleteandthenclosethefile.
$!
DefinethesymbolCOMMANDtomean"executethecommandprocedure$!
youhavejustcreated.
"Thensubmitthebatchjobandexecute$!
thiscommandprocedureinthebatchjob.
$!
$CLOSE_FILE:7)$WRITETEMPFILE"$BATCH$DELETE_FILESPEC==""",FILESPEC,""""$CLOSETEMPFILE$ONCONTROL_YTHENEXIT$COMMAND="@"+FILESPEC$!
$!
$!
SubmitBATCH.
COMasabatchjob,andpassittwoparameters.
$!
P1isthecommand(ornameofthecommandprocedure)toexecute.
$!
P2isthedirectoryfromwhichtoexecutethecommand.
$!
$SUBMIT:8)$SUBMIT/NOTIFY/NOPRINT'F$ENVIRONMENT("PROCEDURE")'/NAME='JOB_NAME'-/PARAMETERS=("''COMMAND'","''ORIGDIR'")UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$GOTOEXIT$!
$!
$!
TheuserpressedCtrl/Ywhilethetemporarycommandprocedurewasopen.
$!
Closethecommandprocedure,deleteitifitexists,andexit.
$!
$CONTROL_Y_HANDLER:9)$CLOSETEMPFILE$IFF$TYPE(FILESPEC).
NES.
""THENDELETE/NOLOG'FILESPEC'$WRITESYS$OUTPUT"Ctrl/Ycausedthecommandproceduretoabort.
"$GOTOEXIT$!
$!
$!
Thetemporarycommandprocedurecouldnotbecreated.
$!
Notifytheuserandexit.
$!
$FILE_OPEN_ERROR:10)$WRITESYS$OUTPUT"Couldnotcreatesys$scratch:",job_name,".
tmp"$WRITESYS$OUTPUT"Pleasecorrectthesituationandtryagain.
"$!
$!
$!
Restoretheverificationstatesandexit.
$!
$EXIT:11)$VERIFY_PROCEDURE=F$VERIFY(VERIFY_PROCEDURE,VERIFY_IMAGE)$EXIT$!
$!
$!
BATCH.
COMwasinvokedasabatchjob.
P1containsthecommand$!
toexecuteandP2thedefaultdirectoryspecification.
$!
ReturnastatuscodethatindicatestheterminationstatusofP1.
$!
$EXECUTE_BATCH_JOB:12)$SETNOON$VERIFY_PROCEDURE=F$VERIFY(VERIFY_PROCEDURE,VERIFY_IMAGE)$SETDEFAULT'P2'$'P1'$IFF$TYPE(BATCH$DELETE_FILESPEC).
EQS.
""THENEXIT$STATUS$STATUS=$STATUS$DELETE/NOLOG'BATCH$DELETE_FILESPEC'$EXITSTATUSBATCH.
COM命令过程的注解UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum1.
这个IF语句测试BATCH.
COM是否执行在批量模式下.
当交互地调用BATCH.
COM时,您提供(作为参数)一个要执行为一个批量作业的命令字符串或命令过程.
如果不提供任何参数,那么BATCH.
COM提示输入命令,把这些命令写入一个文件,然后把这个命令过程执行为一个批量作业.
在BATCH.
COM准备执行批量作业的命令之后,它使用SUBMIT命令把本身提交为一个批量作业,并执行这个作业中的命令.
(请参阅注释8.
)当把BATCH.
COM调用为一个批量作业时,过程转移到标号EXECUTE_BATCH_JOB.
注意,如果以批量模式执行BATCH.
COM,必须把要执行的命令或命令过程指定为P1,把默认目录指定为P2.
2.
这些命令准备要执行的批量作业.
首先,过程构造批量作业名.
如果传递一个命令字符串,那么BATCH.
COM使用其动词名称作为作业名.
如果传递一个命令过程,那么BATCH.
COM使用其文件名.
如果没有传递的输入,那么BATCH.
COM把这个作业命名为BATCH.
3.
连接这些参数,以形成要执行的命令字符串.
这个命令字符串被赋予符号COMMAND.
4.
SUBMIT命令不能传递大于255个字符的参数.
因此,过程测试命令字符串和目录名长度是小于255个字符的.
如果两个字符串都小于255个字符(并且如果用户确实传递了一个命令字符串),那么过程转移到标号SUBMIT.
5.
过程建立一个Ctrl/Y处理程序,因而在这段命令过程中如果用户按下Ctrl/Y,就执行清除操作.
6.
过程建立一个临时文件包含要执行的命令.
如果用户提供一个长的命令字符串,那么过程转移到WRITE_LARGE_COMMAND,并把这个命令写入临时文件.
否则,过程提示输入要执行的命令.
每个命令被写入临时文件.
7.
在关闭临时文件之前,把符号赋值语句写入这个文件.
这个语句把临时文件的文件名赋值到符号BATCH$DELETE_FILESPEC.
在关闭这个临时文件之后,过程重新设置默认的Ctrl/Y处理程序.
然后过程定义符号COMMAND,以便执行时,符号COMMAND调用临时的命令文件.
8.
过程把本身提交为一个批量作业,使用定义的作业名.
(请参阅注释2.
)过程也传递两个参数:要执行的命令或命令过程,和命令应该从此执行的目录.
然后过程转移到标号EXIT.
(请参阅注释11.
)9.
当临时文件建立时,如果用户输入Ctrl/Y,本段就执行清除操作.
10.
如果不能建立临时文件,本段就写入出错消息.
11.
过程重新设置原始的校验设置,然后退出.
12.
当BATCH.
COM以批量模式运行时,就执行这些命令.
首先,撤消ON出错处理,并且设置用户的默认校验设置.
然后,其默认设置为P2指出的目录,并且执行P1指出的命令或命令过程.
如果建立一个临时文件,那么就删除这个文件.
在删除BATCH$DELETE_FILESPEC之前,保存P1的完成状态.
这个完成状态通过EXIT命令返回.
执行BATCH.
COM命令过程的样例$@BATCHRUNMYPROGJobRUN(queueSYS$BATCH,entry1715)startedonSYS$BATCH这个例子使用BATCH.
COM运行批量作业中的程序.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumB.
12COMPILE_FILE.
COM命令过程编译、链接和运行用Pascal或FORTRAN编写的文件.
它提示输入要处理的文件,确定文件类型是.
PAS还是.
FOR.
如果文件类型不是.
PAS或.
FOR,或者如果在当前默认目录中不存在这个文件,那么命令过程输出适当的出错消息.
这个过程说明如何使用IF-THEN-ELSE语言构造.
例子:COMPILE_FILE.
COM$!
Thiscommandprocedurecompiles,links,andrunsafilewritteninPascal$!
orFORTRAN.
$!
$ONCONTROL_YTHENEXIT$!
$TOP:$INQUIREFILE"Filetoprocess"$IFF$SEARCH(FILE).
NES.
1)$THEN$FILE_TYPE=F$PARSE(FILE,,,"TYPE")(2)determinefiletype$FILE_TYPE=F$EXTRACT(1,F$LENGTH('FILE_TYPE'),FILE_TYPE)!
removeperiod$!
Removetypefromfilespecification$PERIOD_LOC=F$LOCATE(".
",FILE)$FILE=F$EXTRACT(0,PERIOD_LOC,FILE)$ONWARNINGTHENGOTOOTHER$GOTO'FILE_TYPE'$ELSE(3)$WRITESYS$OUTPUTFILE,"doesnotexist"$ENDIF(4)$!
$GOTOEND$!
$!
$!
$FOR:5)$ONERRORTHENGOTOPRINT$FORTRAN/LIST'FILE'$GOTOLINK$!
$PAS:UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum$ONERRORTHENGOTOPRINT$PASCAL/LIST'FILE'$GOTOLINK$!
$OTHER:$WRITESYS$OUTPUT"Can'thandlefilesoftype.
''FILE_TYPE'"$GOTOEND$!
$LINK:6)$ONERRORTHENGOTOEND$WRITESYS$OUTPUT"Successfulcompilation.
.
.
.
"$LINK'FILE'$DEFINE/USER_MODESYS$INPUTSYS$COMMAND$RUN'FILE'$GOTOCLEANUP$!
$PRINT:7)$WRITESYS$OUTPUT"Unsuccessfulcompilation,printinglistingfile.
.
.
.
"$PRINT'FILE'$!
$CLEANUP:$DELETE'FILE'.
OBJ;$DELETE'FILE'.
LIS;$!
$END:$INQUIRE/NOPUNCTUATIONANS"Processanotherfile(YorN)"$IFANSTHENGOTOTOP$EXITCOMPILE_FILE.
COM命令过程的注解1.
IF命令使用F$SEARCH词法函数搜索目录,并且确定这个文件是否存在.
2.
跟随THEN命令的命令块:o使用F$LENGTH词法函数确定文件类型的长度o确定文件类型o除去文件类型中的句点o除去文件说明中的文件类型来确定文件名o除去文件名中的句点o定义如果出错发生则执行的动作o转移到符号FILE_TYPE定义的标号3.
如果在"Filetoprocess:"提示中输入的文件在目录中不存在,那么执行跟随ELSE命令的命令.
4.
ENDIF命令结束IF-THEN-ELSE命令语言构造.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum5.
过程编译这个FORTRAN程序,并转移到LINK标号.
如果在编译期间出错发生,那么过程转移到PRINT标号.
6.
过程显示程序正确编译,链接和运行程序,并转移到CLEANUP标号.
如果出错发生,程序就转移到END标号.
7.
过程把程序的列出文件加入默认打印队列.
执行COMPILE_FILE.
COM命令过程的样例$@COMPILE_FILEFiletoprocess:RAND.
PASSuccessfulcompilation%DELETE-I-FILDEL,WORK:[DESCH]RAND.
OBJ;1deleted(3blocks)%DELETE-I-FILDEL,WORK:[DESCH]RAND.
LIS;1deleted(9blocks)Processanotherfile(YorN)N[Return]词汇表ASCII:参阅美国信息交换标准码.
CPU:参阅中央处理器.
DCL(DIGITAL命令语言):在OpenVMS系统上的命令解释程序,为用户和操作系统之间的通信提供一种手段.
DECnet-Plus:Compaq硬件和软件产品系列,实现数字网络体系结构(DNA)阶段V,集成了OSI和DNA协议.
DECnet-Plus符合OSI标准并且与DECnet阶段IV和TCP/IP兼容.
DIGITAL命令语言(DCL):参阅DCL(DIGITAL命令语言).
RMS(记录管理服务):程序调用的一组操作系统过程,可处理文件和文件中的记录.
RMS允许程序在记录级(记录I/O)发出GET和PUT请求以及读取和写入块(I/O).
RMS是系统软件的一个完整部分;它的过程以执行模式运行.
UAF(用户授权文件):拥有系统每个帐户细节的文件.
UAF包含分配给每个帐户的用户名、口令、用户标识码(UIC)、定额、限制和特权.
UFD(用户文件目录):简要对存储在磁盘或磁带上一组文件编目录的文件.
UFD包括这组文件中每个文件的名称、类型和版本号.
它也包含标识文件实际位置的唯一编号,并指向一列文件属性.
另请参阅目录.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forumUIC(用户标识码):分配给用户、文件、全局节、命令事件标记簇和邮箱的号码对.
UIC指定可供拥有者、组、全体用户和系统使用的存取类型(读、写或读/写,在对象是文件的情况下还有执行、删除或两者).
个性化注册命令过程:让您用户化计算环境的命令过程.
每次您注册时就执行它包含的命令.
口令:用户在注册时提供的字符串,用来验证他们的身份并作为授权存取他们帐户的证据.
有两种口令---系统口令和用户口令.
用户口令包括主和次口令.
子目录:一种目录文件,在更高级目录中编目录,它列出属于目录拥有者的附加文件.
子进程:由另一个进程建立的辅助进程.
建立子进程的进程是它的拥有者.
进程和它的子进程共享一套定额和限制.
当拥有者进程从系统除去时,它的所有子进程(和子进程的子进程)也被除去.
子例行程序:由另一个程序调用而执行的辅助例行程序.
子例行程序经常被重复调用,直到满足某个条件.
小键盘:终端上主键盘旁边的一组键.
专用卷:进程分配给它自己独占使用的海量存储媒体.
中央处理器(CPU):处理所有计算、输入输出路由选择和执行程序的硬件.
简而言之,CPU是计算机实际计算的部分.
公开帐户:不需要口令的帐户.
公用程序:提供一组相关的通用功能的程序,例如,程序开发公用程序(编辑程序、链接程序)、文件管理公用程序(文件复制或文件格式翻译程序)或者操作管理公用程序(磁盘定额、诊断程序).
分层式目录结构:目录的结构具有几个层次,安排为基于一对多关系的树形结构,.
分析:以下二者之一:1.
把命令串分解为它的基本元素,并加以解释.
2.
解释文件说明,如同OpenVMS记录管理服务(RMS)所做.
分离进程:没有拥有者的进程.
当用户注册到系统时,作业控制程序就建立一个分离进程.
每次开始一个批作业或服务一个逻辑链接连接的请求时,它也建立一个分离进程.
因为作业控制程序不拥有它建立的进程,所以这些进程被称为分离的.
DCL命令RUN/UIC和建立进程系统服务(指定UIC)允许有合适特权的进程请求建立分离进程.
反向视频:将默认视频对比反向的视频终端特性.
如果默认显示是白色背景的黑色图,反向视频则显示黑色背景的白色图.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum文件:对用户重要的结构中安排的一组数据元素.
文件是系统可存取的任何命名和存储的程序、数据或两者.
存取分为两种类型:只读,意即文件不能被改变;读/写,意即文件内容可以改变.
另请参阅卷.
文件名:在文件说明中,在文件类型之前包含1至39个字符名称的字段.
文件夹:您可以存储邮件消息的文件的细分.
文件类型:在文件说明中,包括句点跟随0至39个字符标识的字段.
按照约定,该字段标识具有同样使用或特征的文件类属级别,例如编译器和汇编程序列表文件,二进制的目标文件,等等.
文件说明:在海量存储媒体中,一个文件的唯一名称.
它标识文件存储的节点、设备、目录名、文件名、文件类型和版本号.
文件路径:文件说明的磁盘和目录部分.
比较顺序:指派给字符集(例如,ASCII、多国或EBCDIC)字符的次序,用于定序.
队列:以下任何一个:1.
一行待处理的作业;例如,一个批作业队列或打印机作业队列.
主要按先进/先出(FIFO)次序处理,但是也反映提交作业的进程优先级.
另请参阅打印队列.
2.
要在列表或表中添加条目,经常通过使用INSQUE指令.
主口令:一种用户口令,是系统要求用户的第一个用户口令.
系统可能也需要次口令.
主口令必须是与用户名关联的口令.
主文件目录(MFD):包含磁盘主目录的文件.
主机:连接到网络的系统.
另请参阅节点.
代理注册:准许用户从远程节点有效地注册到本地节点的一种注册,就象用户在本地节点拥有一个帐户.
然而,用户在存取控制字符串中不指定口令.
远程用户可能拥有该帐户或者与其他用户共享帐户.
写入:映象发送数据的动作或能力.
例如,当发出PRINT命令时,从存储的地方读取指定文件并写入打印机.
另请参阅读取.
出错消息:当您请求的一些动作失败时,系统发送的消息.
每个出错消息标识操作系统检测到出错的特定部分.
多数出错消息起因于键入错误或指定语法错误.
通常,通过正确地重新键入命令,您可以改正错误.
功能键:发送特殊信号给操作系统的键盘键.
功能键标识为Fn,在此n是与该键相关的编号.
例如,在Mail中按F9键,告诉系统您要转发消息.
可执行映象:可以在进程中运行的映象.
当运行时,可执行映象从文件中读取,用于进程执行.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum外部文件说明:其说明不符合OpenVMS语法或格式的文件.
外部命令:执行映象的符号,其名称不被命令解释程序识别为DCL命令.
对象:系统控制存取信息的被动仓库.
存取对象意味着存取它所包含的信息.
打印队列:等待打印的一列文件.
打印表格:为打印而定义页面设置和纸张的一组属性.
本地节点:用户所在的网络节点.
用户口令:与用户关联的口令.
当用户尝试注册时,必须正确地提供口令,以便批准用户存取系统.
两种用户口令是主和次口令;这些术语也表示它们输入的次序.
用户授权文件(UAF):参阅UAF(用户授权文件).
目录:简要地为一组存储在磁盘或磁带上文件编制目录的文件.
目录包括每个文件的名称、类型和版本号,以及标识文件实际位置的唯一号码并指向其属性列表.
另请参阅子目录.
节点:以下之一:1.
网络上的一个独立计算机系统,可以与网络上的其他计算机系统进行通信.
2.
在OpenVMSVAX系统中,是一个VAXBI接口---例如一个中央处理器、控制器或存储器子系统---占用一个VAXBI总线上的16位逻辑位置.
3.
在OpenVMSVAX系统中,是一个由系统通信服务(SCS)软件识别的VAX处理器或HSC.
节点说明:文件说明的第一字段.
该字段识别计算机系统在网络中的位置.
记录文件地址(RFA):记录在文件中的唯一地址.
RFA允许以后随机地存取以前存取的记录.
这种存取与文件组织无关.
记录排序:一种排序处理,经过这种排序处理后,记录保持原样并且产生一个包含完整记录的输出文件.
记录管理服务(RMS):参阅RMS(记录管理服务).
交互模式:与操作系统通信的一种模式,在此模式下,您输入命令,系统则执行它并作出响应.
在系统完成执行一条命令前,您不能输入下一条命令.
优先级:指派给进程的等级,当该进程运行时确定它获得系统资源的优先权.
光标:在监视器屏幕上使用的一个指示器,用于指向屏幕上的一个位置.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum全名:在DECdns命名空间中对名称的完整说明,包括从根目录到对象、目录或指定软链接路径的所有父目录;也可以包括命名空间名称,但是当网络中只存在一个命名空间时则没有必要.
全局符号:以下任何一个定义:1.
在程序模块中定义的符号,可被另一个模块引用.
链接程序分辩(引用与定义匹配)全局符号.
与局部符号形成对照.
2.
在所有命令级可存取的命令语言符号.
关键字:专供某些指定语法格式用的字,通常在命令串或语句中使用.
多用途互连网邮件扩展(MIME):用来把非文本文件附加到邮件消息的标准.
非文本文件,例如图形或声音文件,以普通文本格式编码和发送,虽然该文本可能是不可读的.
但是,使用MIME解释公用程序,接收人可以把该文本解码为文件的原始格式.
字段:逻辑记录中的一组邻接字节.
字符串:一串可打印字符.
字符串:连接的字符序列.
当文本编辑程序在文本文件中搜索一个字或短语时,它就是寻找一个字符串.
构成命令的字符序列经常称为命令串.
存取控制列表(ACL):定义用户或组对受保护系统对象的存取权条目集合.
存取控制字符串:一连串0至42个字符,包含被发送到远程节点的注册信息.
在OpenVMS系统中,存取控制字符串通常包含一个用户名、若干空格或制表符和一个口令.
存取控制条目(ACE):在存取控制列表中的条目.
存取控制条目可以指定标识符和准予或拒绝该标识符持有者的存取权、目录的默认保护或安全警报细节.
存储器(内存):可以以二进制字格式放置数据或指令的连续物理位置.
存储器的每个位置可以定址并且可以改变它的内容.
不要混淆存储器和海量存储设备这两个概念.
安全终端服务器:OpenVMS软件确保用户只能注册到已经注销的终端上.
当用户按下终端的打断键时,安全终端服务器(如果被允许)第一时间响应,断开任何已注册的进程,然后开始注册.
如果在终端上没有注册的进程,立即就能进行注册.
并置:把文件连接在一个系列中的动作.
扩展文件说明:可选特性,它除去OpenVMS以前强加的许多目录和文件命名约束.
允许深目录和扩展文件名.
次口令:在注册时,正确提交主口令后立即可能需要的用户口令.
可以分别把主和次口令告知不同的用户以确保注册时有一个以上用户.
不太普遍使用的是需要次口令作为一种增加口令长度的方法,以致字符组合总数使口令猜测更加耗时和困难.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum网络:互相连接的、独立计算机系统的集合.
行式打印机:一次打印一行文件的输出设备.
它用于打印大量输出,否则要绑定一个较慢的设备.
几乎每个系统有一个被指定为行式打印机的设备.
在有些情况下,"行式打印机"实际上是一个高速终端.
行编辑程序:一种允许您按行对文件进行添加和删除的程序.
设备:任何连接到处理器的外围设备的一般名称,外设能够接收、存储或传输数据.
卡片阅读机、行式打印机和终端是面向记录设备的例子.
磁带设备和磁盘设备是海量存储设备的例子.
终端线路接口和内处理器链接是通信设备的例子.
设备不一定是硬件.
设备名:在文件说明中的字段,它标识文件存储在哪一个设备单元上.
设备名也包括助忆符,在数据转移请求中,它标识一个I/O外围设备.
设备名包括一个跟随控制器标识字母(如果适用)的助忆符、一个单元号(如果适用)和一个冒号.
作业:等价于一个进程及其子进程(如有)、以及它们建立的所有子进程的计帐单位.
作业分类为批作业和交互作业.
例如,当用户注册系统时作业控制程序建立一个交互作业处理用户的请求,而当共存管理程序传递一个命令输入文件给系统时,就建立一个批作业.
作业树:所有过程和子进程的层次结构,而主进程在顶层.
启动位置限定词:在EVE中,您能使用该限定词决定光标第一次出现在指定缓冲区的行和列位置.
局部符号:以下二者一个:1.
只对定义它的模块有意义的符号.
不被语言处理器识别为全局符号的符号就是局部符号.
语言处理器分辨(引用与定义匹配)局部符号.
它们不被链接程序认出,并且不能用于另一个目标模块.
然而,链接程序可以把它们传递给调试程序.
与全局符号形成对照.
2.
只在当前命令级和后续调用级可存取的命令语言符号名称.
当定义它的命令级退出时,它就被删除.
帐户:每个用户必须有一个使用系统的帐户.
帐户通过用户名标识.
不同帐户允许系统的不同服务级(例如,用户拥有的特权,可以注册的时间,等等).
批作业:一个在批处理子系统控制下预定和执行的程序.
批作业的控制输入来自存储在磁盘上的命令过程,而输出被指引到磁盘文件.
时间戳:完全指定一个日期和时间文本串.
例如,11-DEC-199617:13:21.
求助:其格式适于使用HELP命令的文本文件.
联机求助可以提供多达9级搜索.
系统口令:在终端能够开始注册前需要的口令.
系统注册命令过程:让您的系统管理员确保您注册时总是执行某些命令的过程.
系统管理员:使资源可供用户使用并设置资源使用限制的人员.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum词法函数:一个命令语言结构.
在分析命令串之前,DIGITAL命令语言(DCL)命令解释程序使用它求值和替换.
词法函数返回有关当前进程(例如,用户标识码(UIC)或默认目录)和有关字符串(例如,字符串长度或子串位置)的信息.
运算符:表达式中告诉计算机如何操纵操作数部分.
例如,加号(+)是一个告诉计算机执行加运算的运算符.
进程:系统软件调度的基本实体.
进程提供映象执行的环境.
进程包括地址空间、硬件和软件环境.
进程默认目录:当您注册时,系统自动把您的顶级目录作为您的进程的默认目录.
远程节点:在网络上的任何节点,不同于您当前注册的节点.
卷:海量存储媒体,例如磁盘包或磁带的卷盘.
卷是文件结构的最大逻辑单位.
卷动:视频终端的一种特性,通过垂直移动允许显示多屏文本.
例如,当输入TYPE命令时,新的输出在屏幕的底部出现,而最旧的输出则从顶部消失.
卷集:驻留在一个或多个海量存储媒体上数据的文件结构集合.
参数:以下二者之一:1.
一个传递给命令过程的值,等于从P1到P8的符号.
另请参阅命令参数.
2.
在易失性或永久数据库中的一个条目,用于网络管理组件.
命令:在DIGITAL命令语言(DCL)中,命令是一条指令,一般是英文单字,用户可在终端上输入或者包括在一个命令过程中.
一个命令请求软件监控终端或者读取命令过程,执行一些明确的活动.
例如,输入COPY命令请求系统把一个文件的内容复制到另一个文件.
命令级:用于命令解释程序的输入流.
初始输入流总是命令级0.
交互命令过程在命令级1开始执行.
批作业命令过程在命令级0开始执行.
您可以在命令过程中使用执行过程(@)命令或CALL命令建立多达32个嵌套的命令级.
命令过程:一个包含命令解释程序可以接受的命令和数据的文件.
因为命令过程提供一种把命令自动传递给操作系统的手段,用户不必在终端上手工地输入那些命令.
另外,命令过程准许用户使用循环、计数器、标号和符号代替这样的编程技术来建立详细的命令序列,而且通过用户交互可以改变.
命令过程也可以作为批作业提交给系统处理.
命令串:包含一个命令和,可选地,修改命令信息的一行(或一组连续行).
命令串由一个命令、它的限定词、它的参数(例如文件说明)和它们的限定词组成.
通常,按回车键可终止命令串.
命令参数:通过空格分隔的命令定位操作数,例如文件说明、任选项或常数.
命令映象:与DCL命令相关的程序,并且通过DCL命令调用.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum命令解释程序:在管理程序模式执行的基于过程的一种系统代码,在一个处理环境中,它接收用户在终端输入或在命令文件中提交的命令,检查命令的语法并进行分析.
定界符:分开、终止或组织字符串、语句或程序元素的字符.
注册:系统对用户的识别.
当用户注册时,他们键入用户名和口令以响应系统的提示.
如果用户名和口令匹配系统上的一个帐户,用户就被允许存取系统.
注册目录:用户注册时LOGINOUT建立的默认目录.
注册级别:注册进入系统的用户方法.
系统管理员可以基于以下注册级别控制系统存取:本地、拨号、远程、批处理或网络.
注册命令过程:注册时和批作业开始时自动执行的命令过程.
注销:输入DIGITAL命令语言(DCL)命令LOGOUT的过程,通知操作系统用户已使用完特定的终端.
版本号:文件说明的数字部分.
编辑文件时,其版本号按1递增.
物理设备名:系统唯一识别物理设备(例如存储磁盘或终端)的字符串.
空值:不含任何字符的字符串,在命令过程中用两个引号("")表示.
终端:有一键盘和一视频屏幕或打印机的外围设备的总名称.
在程序控制下,终端允许用户从键盘键入命令和数据并接收在视频屏幕或打印机上的消息.
表达式:带运算符的变量、常数或两者的任何组合,计算机可以对它求值产生结果.
视频终端:键盘和显示您与操作系统交互的视频屏幕(或监视器).
另请参阅终端.
软件:映象、过程、规则和与操作特定计算机系统相关的文档的集合.
例如,操作系统就是软件.
迭代翻译:逻辑名的反复翻译,当一个逻辑名定义包括另一个逻辑名时就会出现这种情况.
限定词:是命令串的一部分,选择几个任选项之一修改命令动词或命令参数.
一个限定词,如果出现,跟随它应用的命令动词或参数,并且按照此格式/qualifier[=option].
例如,在命令串"PRINTfilename/COPIES=3,"中,COPIES限定词指明用户要打印给定文件的3个副本.
非法存取企图:未被授权者想获得对系统的存取权的企图.
因为第一次系统存取要通过注册完成,非法存取企图主要是指尝试非法注册.
这些尝试主要是通过多种猜测或其他反复试验方法提供已知在系统上有帐户的用户口令.
保护码:一串字母,指定不同类型的系统用户可以对文件或另一个受保护对象有什么存取权,以及当他们存取它时他们可以做什么.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum受约束帐户:一类其用户活动受限制的OpenVMS帐户.
典型情况是,用户不能使用某些命令过程和命令.
例如,用户可能不允许使用Ctrl/Y组合键.
这类帐户与启钥帐户或受限制帐户同义.
受限帐户:一种安全注册过程的OpenVMS帐户.
在系统或进程注册命令过程中,不允许该用户使用Ctrl/Y组合键.
控制可以移交给随后执行注册命令过程的用户.
受保护对象:一个包含可共享信息的对象,系统控制其存取.
另请参阅对象.
复合字符:简单字符和扩充字符集的字符的组合.
映象:链接程序将过程和数据绑在一起形成一个可执行程序.
进程执行这个可执行程序.
有3类映象:可执行的、可共享的和系统.
标识符:表示用户或用户组的字母数字字符串,记录在使用权数据库中,系统使用它检查存取请求.
有4种类型标识符:环境、设施、一般和用户标识码(UIC).
相对文件组织:记录在文件中的安排.
用此安排每个记录在存储桶中占用一个相同长度的单元.
给每个单元指定一个连续的数,表示它相对于文件开始的位置.
类属设备名:标识设备类型而但不标识特定单元的设备名;省略特定控制器或单元号的设备名.
美国信息交换标准码(ASCII):在文本表示和通信协议中使用的一组8位二进制数,用于表示字母表、标点符号、数字和其他特殊符号.
语法:命令的特定格式,包括拼写以及限定词和参数的次序.
拼错字是最普通的语法出错.
说明文件:在排序/合并公用程序使用的命令文件,指定需要完成一个排序操作的命令和限定词.
面向记录设备:一种设备,例如终端、行式打印机或卡片阅读机.
面向记录设备的物理记录是程序在一个I/O操作中能够存取的最大数据单位.
顺序文件组织:一种文件组织,用这种文件组织,记录按照最初写入的次序出现.
记录长度可以是固定或可变.
由记录地址可以顺序地或随机地存取记录.
也可以通过相对记录号随机地存取固定长度的记录.
顺序存取模式:检索或存储记录的模式,在这种模式下,程序要按照它们出现的次序一个接一个地读取或写入记录,可以在文件的任意位置开始和结束.
海量存储设备:当数据和其他类型文件不被使用时,存储它们的输入/输出设备.
典型的海量存储设备包括磁盘、磁带和软盘.
索引顺序文件:其中每个记录有一个或多个数据键的记录文件.
通过指定与记录相关的键,可独立存取文件中的记录.
读取:映象接受数据的动作或能力.
例如,当发出TYPE命令时,系统从磁盘读取指定的文件,并把它写入终端.
另请参阅写入.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum通配符:一个非字母数字字符,例如星号(*)或百分号(%),用于文件说明中的文件名、文件类型、目录名或版本号,指明在给定字段中表示"所有".
高性能排序/合并公用程序:可用于OpenVMSAlpha系统的排序/合并公用程序的版本.
符号:是一个实体,被定义时,它表示在特定环境下的特定功能或实体(例如,命令串、目录名或文件名).
符号作用域:命令过程级的集合,能够在这个范围内存取这个符号.
逻辑名:用户指定的名称,可以代替另一个字符串表示系统对象,例如文件、目录、设备和队列.
逻辑名赋值在逻辑名表中维护.
逻辑名表:包含一组逻辑名及其等价串的表格.
逻辑名可以是进程专用或可共享的.
默认可共享的逻辑名表是作业、组、系统、簇范围系统和簇范围父表.
逻辑设备名:一个字符串,它将有点神秘的设备名用一个简短、有意义的名称来表示.
逻辑表达式:具有真值或假值的表达式.
随机存取:检索或写入数据的一种方法,用此方法,检索或写入数据的位置不依赖以前检索或写入数据的位置.
随机存取也可指平等存取所有信息的存储器或海量存储设备.
提示符:出现在终端屏幕上的字符串,指出用户必须提供输入.
最快传送:尝试传送数据而如果出错,例如线路失败,也不设法恢复的网络协议.
硬件设备:实际的计算机设备,包括这样一些机械设备,如行式打印机、终端、海量存储设备,等等.
硬拷贝终端:在纸上打印输出的终端.
另请参阅终端.
程序:实现特定结果的一串指令.
程序设计语言是描述过程的一种方法,所以他们可以被计算机执行.
另请参阅映象.
程序桩:在编写命令过程的测试阶段使用的临时代码片断.
程序桩通常输出一条消息声明它正在替换的过程.
等价串:与逻辑名表中某个逻辑名相关字符串.
例如,等价串可以是一个设备名、另一个逻辑名,或一个与部分文件说明连接的逻辑名.
缓存:在输入或输出操作期间用于暂时存储数据记录的内存区域.
编辑程序:用来建立或修改计算机文件中文本的程序.
赋值语句:在DCL中,符号名称与字符串或数值的联合.
符号可以定义系统命令的同义词或者可以用作命令过程中的变量.
UNIX在线http://www.
unixonline.
org/UNIX在线社区欢迎爱好UNIX的朋友!
!
http://www.
unixonline.
org/forum超时:设备要完成I/O转递的时间限制的终止.
数字表达式:一个包含一组通过算术运算符连接的操作数的计算语句.
数据:是指事实、概念或指令的任何表示的通用术语,以适当格式用于通信、解释或处理.
简单字符:能用于文件说明中除版本之外所有成分的基本字符集.
输入文件:包含的数据要被转递给计算机的文件.
输入和输出文件经常混淆.
DCL通常提示输入这些文件,但是多数系统公用程序需要您在命令行中标识您的输入和输出文件.
确信您所使用命令的语法或格式.
输入流:命令和数据的来源---用户终端、分批流或命令过程.
输出文件:包含处理操作结果的文件;例如,一个已被排序或编辑的文件.
键:以下之一:1.
在索引文件中,键是在索引文件每个数据记录中的一个字符串、一个压缩十进制数、一个2或4字节的无符号二进制数或一个2或4字节有符号整数.
用户定义在记录中的长度和位置.
OpenVMS记录管理服务(RMS)使用键建立索引.
2.
在相对文件中,键是每个数据记录在数据文件中的相对记录号.
OpenVMS记录管理服务(RMS)使用相对记录号标识相对文件中的数据记录、并按随机存取模式存取.
3.
在排序/合并公用程序中,键是记录中的数据字段,包含用户要用以对记录排序的信息.
键盘:操作类似打字机的输入装置.
磁带:可以存储和存取数据的媒体.
磁盘:高速、随机存储设备.
有几种磁盘.
软盘是小的、软性磁盘.
硬盘分为固定硬盘或可移动硬盘两种.
可移动磁盘包括装入保护盒中的单个硬盘和装入保护盒中的一组叠式磁盘.
操作系统:控制执行计算机程序和执行系统功能的程序的完整集合.
操作数:表达式中包含值的部分.
在求表达式的值时运算符处理操作数而产生结果.
默认:自动包括在命令中的值或操作,除非用户指定其他选项.
在大多数情况下,默认设置将是"正常的"或"期望的".
默认目录:当用户没有提供目录说明时,OpenVMS操作系统假定的目录.
默认磁盘:按照默认,当您建立所有文件时系统读和写的磁盘.
当命令中的文件说明没有明确命名一个设备时,就使用默认的磁盘.
本文档由UNIX在线ID:gongdehua整理

华为云年中聚惠618活动,新用户专区,云服务器低至88元/年,3年仅580.98元,热销抢购中,最后2天!

华为云怎么样?华为云用在线的方式将华为30多年在ICT基础设施领域的技术积累和产品解决方案开放给客户,致力于提供稳定可靠、安全可信、可持续创新的云服务,做智能世界的“黑土地”,推进实现“用得起、用得好、用得放心”的普惠AI。华为云作为底座,为华为全栈全场景AI战略提供强大的算力平台和更易用的开发平台。本次年终聚惠618活动相当给力,1核2G内存1m云耀云服务器仅88元/年起,送主机安全基础版套餐,...

3元/首月香港便宜vps究竟是什么货。

便宜的香港vps多少钱?现在国外VPS主机的价格已经很便宜了,美国VPS主机最低一个月只要十几元,但同样免备案的香港VPS价格贵不贵呢?或者说便宜的香港VPS多少钱?香港vps主机价格要比美国机房的贵一些,但比国内的又便宜不少,所以目前情况是同等配置下,美国VPS比香港的便宜,香港VPS比国内(指大陆地区)的便宜。目前,最便宜香港vps低至3元/首月、18元/月起,今天云服务器网(www.yunt...

hostio荷兰10Gbps带宽,10Gbps带宽,€5/月,最低配2G内存+2核+5T流量

成立于2006年的荷兰Access2.IT Group B.V.(可查:VAT: NL853006404B01,CoC: 58365400) 一直运作着主机周边的业务,当前正在对荷兰的高性能AMD平台的VPS进行5折优惠,所有VPS直接砍一半。自有AS208258,vps母鸡配置为Supermicro 1024US-TRT 1U,2*AMD Epyc 7452(64核128线程),16条32G D...

最新的电脑操作系统为你推荐
操作http检索网易yeah2019支付宝五福2019年1月25日今天的支付宝集五福了吗?三五互联科技股份有限公司三五互联 网站做的怎么样 公司打算做网站,近来接到电话,不知道网站做的如何,水平怎么样,后期的服务呢35邮箱邮箱地址怎么写三五互联股票三五互联是干什么的?佛山海虹海虹好吃吗,我从来没吃过qq头像上传失败昨天和今天QQ头像上传失败,是怎么回事?discuz!databaseerrorDiscuz,Database Error是什么原因,怎么修复广告后台朋友圈广告投放!在哪设置白名单
域名管理 smartvps lnmp 免费网络电视 工信部icp备案号 web服务器是什么 登陆空间 宏讯 论坛主机 秒杀品 北京主机托管 学生机 qq部落24-5 华为云服务器宕机 国内免备案cdn vpn服务器架设 上海服务器托管 服务器操作系统下载 彩虹云点播 北京市摇号申请网站 更多