HP OpenVMS Systems Documentation

Content starts here

13 명령 프로시저 소개
명령 프로시저란 DCL 명령과 DCL 명령이 사용하는 데이터 행이 들어 있는 파일입니다. 일부 단순 명령 프로시저에는 한 개 또는 두 개의 DCL 명령만 포함될 수 있지만, 복합 명령 프로시저는 정교한 컴퓨터 프로그램과 같은 기능을 할 수 있습니다. 명령 프로시저가 실행되면 DCL 인터프리터가 해당 파일을 읽고 그 파일에 포함된 명령을 실행합니다.
시스템 관리자가 시스템 로그인 명령 프로시저를 설정한 경우에는 사용자가 로그인할 때마다 그 명령 프로시저가 실행됩니다. 시스템 로그인 명령 프로시저를 사용하면 시스템 상의 사용자들이 로그인할 때 특정 명령이 항상 실행되도록 할 수 있습니다.
시스템 로그인 명령 프로시저 실행 후 시스템에서는 사용자의 개인 로그인 명령 프로시저가 있을 경우 그 명령 프로시저를 실행합니다. 사용자의 개인 로그인 명령 프로시저를 사용하여 자신의 컴퓨팅 환경을 사용자 정의할 수 있습니다. 사용자가 로그인할 때마다 그 안에 포함된 명령이 실행됩니다. 사용자가 로그인하면 시스템에서는 로그인 명령 프로시저를 두 개(시스템 로그인 명령 프로시저와 사용자 로그인 명령 프로시저)까지 실행합니다.
계정을 설정해 주는 사람이 사용자의 최상위 디렉토리에 로그인 명령 프로시저를 두었을 수도 있습니다. 로그인 명령 프로시저가 자신의 최상위 디렉토리에 없을 경우에는 사용자가 직접 만들 수 있습니다. 이름을 LOGIN.COM이라고 지정하여 최상위 디렉토리에 둡니다. 시스템 관리자가 다른 언급을 하지 않는 한, 사용자가 만드는 LOGIN.COM 파일은 사용자가 로그인할 때마다 실행됩니다.
이 장의 내용은 다음과 같은 주요 절로 나누어집니다.
명령 프로시저 작성을 위한 기본 정보
명령 프로시저 작성을 위한 단계별 절차
명령 프로시저 실행
종료, 중단 및 오류 처리 명령 프로시저
로그인 명령 프로시저
DCL 명령 프로시저는 다음 두 가지 유형이 있습니다.
단순
일련의 DCL 명령을 작성된 순서대로 실행합니다.
복합
프로그램과 유사한 기능을 수행합니다.
명령 프로시저 작성을 위한 기본 정보
명령 프로시저를 만드는 방법은 두 가지가 있습니다.
EVE 같은 텍스트 편집기를 사용하여 새 파일 만들기
DCL 명령 CREATE를 사용하여 새 파일 만들기
사용자가 만드는 파일에는 명령행, 레이블, 주석, 조건문, 변수 등이 포함될 수 있습니다.
기본 파일 유형
명령 프로시저의 기본 파일 유형은 .COM입니다. 명령 프로시저의 이름을 지정할 때 .COM 파일 유형을 지정할 경우, 해당 파일 이름만 지정하여 프로시저를 실행할 수 있습니다. 별도로 지정하지 않는 한, SUBMIT과 실행 프로시저(@) 명령의 파일 유형은 .COM으로 간주됩니다.
명령 작성
다음은 명령 프로시저에 명령을 포함하는 작업에 대한 제안 사항입니다.
명령과 한정자에 대해 전체 이름을 사용합니다. 전체 이름을 사용하면 나중에 릴리즈되는 OpenVMS, 즉 상위 버전과의 호환성을 유지하는 데 도움이 됩니다.
연속선을 사용하여 프로시저를 더욱 읽기 쉽도록 만듭니다. 연속선은 달러 기호로 시작되지 않는 것에 주의하십시오. 예를 들면 다음과 같습니다.
$ PRINT LAB.DAT -
/AFTER=17:00 -
/COPIES=20 -
/NAME="COMGUIDE"
명령행 작성
명령행 작성 시 주의할 사항은 다음과 같습니다.
명령, 주석 또는 레이블이 포함된 각 행의 맨 앞에 달러 기호($)를 사용해야 합니다.
데이터가 들어 있는 행을 포함시키려면 해당 행에서 달러 기호($)를 생략합니다.
달러 기호($)로 시작되는 데이터 행을 포함해야 할 경우, DCL 명령 DECK 및 EOD를 사용합니다. 예를 들면 다음과 같습니다.
$ ! Everything between the commands DECK and EOD
$ ! is written to the file WEATHER.COM
$ !
$ CREATE WEATHER.COM
$ DECK
$ FORTRAN SUMMER
$ LINK SUMMER
$ RUN SUMMER
$ EOD
$ !
$ ! Now execute WEATHER.COM
$ @WEATHER
$ EXIT
달러 기호로 시작되지 않는 명령행은 DCL에 의해 중단될 수있지만, 모든 DCL 명령행 앞에는 달러 기호를 반드시 사용하는 것이 좋습니다.
명령행에서 레이블 사용
레이블은 DCL 명령 프로시저에서 루프, 코드의 섹션, 서브 루틴 등을 표시하는 데 사용됩니다. 레이블을 사용할 때는 다음 규칙에 주의하십시오.
루프, 서브 루틴 및 조건 코드가 눈에 더욱 잘 띄도록 별도의 행에 레이블을 둡니다.
길이가 255자보다 짧고 공백이 없는 레이블 이름을 사용합니다.
달러 기호($) 바로 다음에 레이블을 넣고 명령 앞에 공백을 넣어서 명령과 레이블을 구분합니다.
각 레이블 끝에 콜론을 사용합니다.
레이블을 삭제할 수 없습니다.
로컬 기호 테이블의 레이블
명령 인터프리터가 레이블을 만나면 그 레이블을 로컬 기호 테이블의 특수 섹션에 넣습니다. 레이블용으로 사용할 수 있는 공간의 양은 제한되어 있습니다. 명령 프로시저에 많은 레이블이 포함되어 있고 많은 기호가 사용될 경우에는 명령 인터프리터의 기호 테이블 공간이 모자라서 오류 메시지가 나타날 수 있습니다. 오류 메시지가 나타날 경우, DELETE/SYMBOL 명령을 프로시저에 포함하여 더 이상 필요하지 않은 기호를 삭제합니다. 그러나 레이블은 삭제할 수 없습니다.
중복 레이블
명령 프로시저에서 동일한 레이블을 두 번 이상 사용할 경우, 로컬 기호 테이블의 기존 정의가 새 정의로 바뀝니다.
중복 레이블이 있을 경우, GOTO 명령은 DCL이 최근에 처리한 레이블로 제어를 넘깁니다. 또한 GOTO 명령은 중복 레이블을 처리할 때 다음과 같은 규칙을 사용합니다.
모든 중복 레이블이 GOTO 명령 앞에 올 경우, 해당 GOTO 명령에 가장 가까운 레이블로 제어가 넘어갑니다.
중복 레이블이 GOTO 명령의 앞뒤로 올 경우, 해당 GOTO 명령에 가장 가까운 앞쪽 레이블로 제어가 넘어갑니다.
모든 중복 레이블이 GOTO 명령 뒤에 올 경우, 해당 GOTO 명령에 가장 가까운 레이블로 제어가 넘어갑니다.
명령 프로시저에서 주석 사용
명령 프로시저에 주석을 포함하는 것은 좋은 프로그래밍 습관입니다. 주석은 명령 프로시저의 업데이트 또는 문제 해결 시에 도움이 될 수 있습니다. 주석을 사용하는 방법은 다음과 같습니다.
프로시저의 시작 부분에서 프로시저를 설명하고 그 프로시저에 전달된 매개 변수를 설명합니다.
각 명령 블록의 시작 부분에서 프로시저의 해당 섹션을 설명합니다.
일련의 명령을 달러 기호와 감탄 부호($!)가 포함된 행으로 구분합니다. 이렇게 하면 명령 프로시저의 개요를 더욱 쉽게 파악할 수 있습니다. 공백 행을 삽입하면 명령 인터프리터에서 그 행을 데이터 행으로 해석하므로, 해당 데이터 행이 무시되었다는 경고 메시지가 만들어집니다.
명령 프로시저에서 주석을 작성할 때는 다음 규칙이 적용됩니다.
감탄 부호(!)를 사용하여 주석이 시작됨을 나타냅니다. 명령 인터프리터는 명령 프로시저가 실행될 때 감탄 부호의 오른쪽에 있는 모든 텍스트를 무시합니다.
명령행에 감탄 부호 문자 자체를 포함하려면 감탄 부호를 인용 부호( ”)로 묶습니다.
명령 프로시저 작성 방법
명령 프로시저를 작성하려면 먼저 그 명령 프로시저가 실행할 작업을 대화형으로 수행합니다. 필요한 명령을 입력하면서 함께 사용되는 변수와 조건 및 모든 반복을 기록합니다.
다음 절에서는 단순 명령 프로시저를 작성하는 단계에 대해 설명합니다. 해당 절 전체에서 사용되는 보기는 CLEANUP.COM이라는 명령 프로시저입니다. 이 프로시저는 디렉토리를 정리할 때 사용할 수 있습니다.
정의
변수
작업을 수행할 때마다 변경되는 데이터입니다.
조건
바뀔 수 있기 때문에 작업을 수행할 때마다 테스트해야 하는 명령 또는 명령 집합입니다.
반복
조건이 만족될 때까지 반복적으로 수행되는 명령 또는 명령 집합입니다.
명령 프로시저 작성 단계
다음 단계를 수행하여 명령 프로시저를 작성합니다.
표 13-1
단계
작업
1
명령 프로시저를 디자인합니다.
2
변수를 할당하고 조건을 테스트합니다.
3
루프를 추가합니다.
4
명령 프로시저를 끝냅니다.
5
프로그램 논리를 테스트하고 디버그합니다.
6
정리 작업을 추가합니다.
7
프로시저를 마칩니다.

1 단계: 명령 프로시저 디자인
다음 단계를 수행하여 명령 프로시저를 디자인합니다.
표 13-2
단계
작업
1
프로시저에서 수행할 작업을 결정합니다.
2
명령 프로시저에서 사용할 변수와 그 변수를 로드하는 방법을 결정합니다.
3
명령 프로시저에 필요한 조건과 그 조건을 테스트하는 방법을 결정합니다.
4
명령 프로시저를 종료하는 방법을 결정합니다.

대체로 정리 작업 중에 실행되는 특정 명령이 있습니다. 다음 표에서는 그러한 명령과 그러한 명령이 수행하는 작업을 나열합니다.
표 13-3
명령
수행하는 작업
DIRECTORY
현재 디렉토리의 내용을 표시합니다.
TYPE filespec
파일을 표시합니다.
PURGE filespec
파일을 소거합니다.
DELETE filespec
파일을 삭제합니다.
COPY filespec new-filespec
파일을 복사합니다.

변수
작업을 수행할 때 변경되는 데이터가 변수입니다. 디렉토리에서 파일을 만들거나 삭제할 경우, 디렉토리를 지울 때마다 파일 이름이 달라지므로 CLEANUP.COM의 파일 이름은 변수가 됩니다.
조건
명령 프로시저를 실행할 때마다 테스트되어야 하는 명령은 모두 조건으로 간주됩니다. 수행해야 할 작업에 따라 CLEANUP.COM의 명령이 모두 또는 일부가 실행될 수 있기 때문에 각 명령은 조건부입니다.
디자인 결정
CLEANUP.COM 명령 프로시저에서 사용할 변수와 조건을 결정했으면 변수를 로드하고, 조건을 테스트하고, 명령 프로시저를 종료하는 방법을 결정해야 합니다. CLEANUP.COM 명령 프로시저에 대해서는 다음과 같은 결정이 이루어졌습니다.
표 13-4
작업
수행 방법
변수 로드
명령 프로시저에서 터미널로부터 파일 이름을 가져옵니다.
조건 테스트
명령 프로시저에서 다음을 수행하십시오.
터미널로부터 명령 이름을 가져와서 그 명령 이름을 기반으로 적절한 명령문을 실행합니다.
각 명령의 처음 두 문자를 읽어 DELETE와 DIRECTORY 명령을 구분할 수 있도록 합니다.
루프 종료
루프를 종료하려면 EXIT 명령을 입력해야 합니다.

명령 프로시저를 더욱 쉽게 이해하고 유지 관리하기 위해서는 프로시저에서 첫 번째 명령부터 마지막 명령까지 실행하도록 명령문을 작성합니다.
2 단계: 변수 할당 및 조건 테스트
변수에 값을 할당하는 방법은 여러 가지가 있습니다. 이 절에서는 INQUIRE 명령 사용에 대해 설명합니다. 추가 방법을 보려면 14장을 참조하십시오.
다음 단계를 수행하여 변수에 값을 할당하고 조건을 테스트합니다.
표 13-5
단계
작업
1
INQUIRE 명령을 사용하여 변수에 값을 할당합니다.
2
수행할 작업을 결정합니다.
3
IF와 THEN 문을 사용하여 조건을 테스트합니다.
4
프로그램 스텁을 작성하여 명령 프로시저에 명령에 대한 자리 표시자로 삽입합니다.
5
필요할 경우 오류 메시지를 작성합니다.

INQUIRE 명령 사용
INQUIRE 명령은 값을 확인하는 프롬프트를 표시하고, 터미널로부터 값을 읽고, 그 값을 기호에 할당합니다.
기본적으로 INQUIRE 명령은 다음을 수행합니다.
응답을 대문자로 변환합니다.
여러 개의 공백과 탭을 단일 공백으로 바꿉니다.
선행 공백과 후행 공백을 제거합니다.
응답에 기호나 렉시칼 함수가 들어 있으면 어포스트로피 대체를 수행합니다.
다음 명령행은 CLEANUP.COM에서 사용자에게 명령 이름을 입력하라는 프롬프트를 나타내기 위해 사용됩니다. INQUIRE 명령은 COMMAND 기호에 입력된 값과 일치합니다.
$ INQUIRE COMMAND-
"Enter command (DELETE, DIRECTORY, PRINT, PURGE, TYPE)"
리터럴 문자 보존
INQUIRE 명령을 사용할 때 소문자, 여러 개의 공백 및 탭을 유지하려면 사용자의 응답을 인용 부호(“ ”)로 묶습니다. 응답에 인용 부호를 포함하려면 인용된 텍스트를 인용 부호로 묶습니다(“ “ 텍스트 ” ”).
IF와 THEN을 사용하여 조건 테스트
INQUIRE 명령에서 변수를 입력하라는 프롬프트가 표시된 후에는 명령 프로시저에 수행할 작업을 결정하는 명령문이 포함되어야 합니다. 예를 들어, 실행할 명령을 결정하려면 사용자가 입력한 명령을 가능한 각 명령에 대해 확인하는 명령문을 명령 프로시저에 포함해야 합니다.
조건이 참인지 확인하려면 IF와 THEN 명령을 사용합니다. 다음 표에서는 CLEANUP.COM에서 확인해야 할 사항들을 보여 줍니다.
표 13-6
조건
수행할 작업
일치가 있을 경우,
명령을 실행합니다.
일치가 없을 경우,
다음 명령을 계속합니다.
유효한 명령을 모두 확인한 후 일치가 없을 경우,
오류 메시지를 출력합니다.

프로그램 스텁 작성
프로그램 스텁은 디자인을 테스트하는 동안 프로시저에서 사용하는 코드의 임시 섹션입니다. 대체로 프로그램 스텁은 바꿀 함수를 나타내는 메시지를 출력합니다. 전체 디자인이 제대로 작동한 후 각 스텁을 정확한 코딩으로 바꿉니다.
보기: 변수 할당 및 조건 테스트
다음은 변수를 할당하고 조건을 테스트하는 방법을 보여 주는 보기입니다.
$ INQUIRE COMMAND-
"Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)"
$ IF COMMAND .EQS. "EXIT" THEN EXIT
$!
$! Execute if user entered DELETE
$ DELETE:
$ IF COMMAND .NES "DELETE" THEN GOTO DIRECTORY [1] [2]
$ WRITE SYS$OUTPUT "This is the DELETE section." [3]
$! Execute if user entered DIRECTORY
$ DIRECTORY: [4]
$ IF COMMAND .NES "DIRECTORY" THEN GOTO PRINT
$ WRITE SYS$OUTPUT "This is the DIRECTORY section."
.
.
.
$! Execute if user entered TYPE
$ TYPE:
$ IF COMMAND .NES "TYPE" THEN GOTO ERROR [5]
$ WRITE SYS$OUTPUT "This is the TYPE section."
$!
$ ERROR:
$ WRITE SYS$OUTPUT "You have entered an invalid command." [6]
$!
$ EXIT
보기를 검사할 때는 다음 사항에 주의하십시오.
[1] 이 IF 문은 사용자가 입력한 명령(COMMAND)이 DELETE”와 같은지 여부를 테스트합니다. COMMAND가 DELETE와 같으면 명령 프로시저에서 다음 명령을 실행합니다.
[2] 이 명령문에는 GOTO 명령도 포함됩니다. GOTO 명령은 실행의 흐름을 프로시저의 레이블로 변경하기 위해 사용됩니다. 이 경우, COMMAND가 DELETE와 같지 않으면 프로시저는 DIRECTORY 레이블로 이동합니다.
[3] 이 명령문은 프로그램 스텁입니다. 명령 프로시저의 논리가 테스트된 후, 이 행은 DELETE 작업에 필요한 실제 명령으로 바뀝니다.
[4] 이것은 DIRECTORY 서브 루틴에 대한 레이블입니다. 각 명령 블록을 식별하는 레이블은 옵션 목록의 명령들과 동일합니다. 따라서 GOTO 명령문에서 COMMAND 기호(사용자의 요청과 일치함)를 사용할 수 있습니다.
[5] 이 IF 명령문은 TYPE” 명령을 입력했는지 여부를 테스트합니다. TYPE”이 입력되었으면 프로시저에서 This is the TYPE section”을 출력합니다. 그러나 이 명령이 마지막으로 테스트할 명령이므로, 입력한 명령이 TYPE”이 아니면 프로그램에서 오류 메시지가 표시됩니다.
[6] 모든 명령이 테스트되고 유효한 명령 이름이 없을 경우에는 프로그램에서
You have entered an invalid command”를 출력합니다.
3 단계: 루프 추가
루프는 조건이 만족될 때까지 반복적으로 실행되는 명령문 그룹입니다. 반복은 다음과 같이 작동합니다.
1. 사용자 입력으로부터 값을 받습니다.
2. 명령을 처리합니다.
3. 사용자가 명령 프로시저를 종료할 때까지 프로세스를 반복합니다.
루프를 작성하려면 다음 절차를 수행하십시오.
표 13-7
단계
작업
1
레이블을 사용하여 루프를 시작합니다.
2
변수를 테스트하여 루프에서 명령을 실행해야 하는지 확인합니다.
3
루프를 실행할 필요가 없으면 루프의 끝으로 이동합니다.
4
루프를 실행해야 하면 루프의 본문에 있는 명령을 수행한 다음 루프의 시작 부분으로 돌아갑니다.
5
루프를 끝냅니다.

다음은 CLEANUP.COM 명령 프로시저에서 루프의 사용을 보여 주는 보기입니다.
$ GET_COM_LOOP:
$ INQUIRE COMMAND-
$ "Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)"
$ IF COMMAND .EQS. "EXIT" THEN GOTO END_LOOP
$!
$! Execute if user entered DELETE
$ DELETE:
$ IF COMMAND .NES. "DELETE" THEN GOTO DIRECTORY
$ WRITE SYS$OUTPUT "This is the DELETE section."
$ GOTO GET_COM_LOOP
.
.
.
$ END_LOOP:
$ WRITE SYS$OUTPUT "Directory ''F$DIRECTORY()' has been cleaned"
$ EXIT
명령이 일단 실행되면 사용자가 EXIT 명령을 입력할 때까지 GET_COM_LOOP 레이블로 제어가 다시 넘어갑니다. EXIT 명령이 입력되면 프로시저에서 디렉토리가 지워졌다는 메시지를 출력합니다.
4 단계: 명령 프로시저 종료
명령 프로시저를 종료하려면 다음 절차를 수행합니다.
표 13-8
단계
작업
1
명령 프로시저를 종료하거나 끝내야 할 수 있는 경우를 결정합니다.
2
EXIT 또는 STOP 명령을 적절히 넣습니다.

EXIT 명령 사용
EXIT 명령을 명령 프로시저에 넣어 다음을 수행할 수 있습니다.
프로시저에서 특정 행이 실행되지 않도록 합니다.
두 개 이상의 실행 경로가 있는 프로시저를 종료합니다.
명령 프로시저를 종료합니다.
다음은 EXIT 명령을 사용하여 프로시저 끝에 있는 오류 처리 루틴이 실행되지 않도록 하는 보기입니다.
.
.
.
$ EXIT ! End of normal execution path
$ ERROR_ROUTINE
.
.
.
다음은 EXIT 명령을 사용하여 두 개 이상의 실행 경로가 있는 프로시저를 종료하는 보기입니다.
$ START:
$ IF P1 .EQS. "TAPE" .OR. P1 .EQS. "DISK" THEN GOTO 'P1'
$ INQUIRE P1 "Enter device (TAPE or DISK)"
$ GOTO START
$ TAPE: !Process tape files
.
.
.
$ EXIT $ DISK: ! Process disk files
.
.
.
$ EXIT
각 레이블(TAPE와 DISK) 다음에 오는 명령은 프로시저를 통해 서로 다른 경로를 제공합니다. DISK 레이블 앞의 EXIT 명령은 프로시저가 해당 레이블로 명시적으로 분기되지 않는 한, DISK 레이블 다음에 오는 명령이 실행되지 않도록 합니다.
프로시저의 파일 끝에서는 암시적 EXIT 명령이 야기되므로 프로시저의 끝에서는 EXIT 명령이 필요 없습니다. 그러나 EXIT 명령을 사용하는 것이 좋습니다.
STOP 명령 사용
명령 프로시저에서 STOP 명령을 사용하여 서버 오류가 발생할 경우 프로시저가 종료되도록 할 수 있습니다. 대화형으로 실행되는 명령 프로시저에 STOP 명령이 있으면 DCL 수준으로 제어가 반환됩니다. 명령 프로시저가 일괄 처리 모드로 실행될 경우에는 일괄 처리 작업이 종료됩니다.
다음 명령은 심각한 오류가 발생할 경우 프로시저가 중지되도록 합니다.
$ ON SEVERE_ERROR THEN STOP
5 단계: 프로그램 논리 테스트 및 디버그
프로그램 스텁을 사용하여 코드를 작성한 경우에는 명령 프로시저의 전체 논리를 테스트해야 합니다. 가능한 모든 실행 경로를 테스트해야 합니다.
다음 절차를 수행하여 명령 프로시저를 테스트하고 디버그합니다.
표 13-9
단계
작업
1
명령 프로시저에 유효한 각 명령을 입력하여 프로그램 논리를 테스트합니다.
2
유효하지 않은 명령을 입력하여 프로그램 논리를 계속해서 테스트합니다.
3
EXIT 명령을 사용하여 명령 프로시저를 종료함으로써 프로그램 논리 테스트를 마칩니다.
4
필요할 경우, SET VERIFY, SET PREFIX 또는 SHOW SYMBOL 명령을 사용하여 프로그램을 디버그합니다.

다음 보기에서는 가능한 모든 명령, 유효하지 않은 명령을 입력 및 실행한 다음 종료하여 명령 프로시저를 테스트하는 방법을 보여 줍니다.
$ @CLEANUP
Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): DELETE
This is the DELETE section.
Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): DIRECTORY
This is the DIRECTORY section.
.
.
.
Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): PRINF
You have entered an invalid command.
Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): EXIT
$
명령 프로시저 디버깅
다음 명령을 사용하여 명령 프로시저의 디버그를 도울 수 있습니다.
SET VERIFY
각 행이 실행되기 전에 해당 행을 표시합니다. 확인 설정과 함께 오류가 발생할 때는 오류와 그 오류를 생성한 해당 행이 표시됩니다. SET VERIFY 명령과 함께 키워드를 사용하여 확인할 명령행이나 데이터 행만 나타낼 수 있습니다.
SET VERIFY 명령은 로그아웃하거나, SET NOVERIFY 명령을 입력하거나, F$VERIFY 렉시칼 함수를 사용하여 확인 설정을 변경할 때까지 유지됩니다.
확인 설정 변경에 대한 자세한 내용은 15장에 있습니다.
SET PREFIX
확인이 적용되어 있을 때는 DCL 명령 SET PREFIX를 사용하여 각 명령행이 실행된 시간을 해당 명령행 앞에 붙여서 프로시저 로그 파일에 time-stamp를 지정할 수도 있습니다.
SHOW SYMBOL
SHOW SYMBOL 명령을 사용하여 프로시저에서 기호가 정의되는 방식을 확인할 수 있습니다.
보기: SET VERIFY 명령을 사용하여 디버깅
다음 보기에서는 END_LOP 레이블의 철자가 틀리게 되어 있습니다. 확인이 설정되어 있기 때문에 오류의 위치를 정확하게 볼 수 있습니다.
$ SET VERIFY
$ @CLEAN
$ GET_COM_LOOP:
$ INQUIRE COMMAND -
"Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)"
Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): EXIT
$ IF COMMAND .EQS. "EXIT" THEN GOTO END_LOP
%DCL-W-USGOTO, target of GOTO not found -
check spelling and presence of label
오류를 수정하려면 해당 레이블을 END_LOOP로 변경합니다.
보기: SET PREFIX 명령을 사용하여 디버깅
다음 보기에서는 time-stamp의 사용을 보여 줍니다.
$ SET VERIFY
$ @TEST
$ SET DEFAULT SYS$LOGIN
$ SHOW DEFAULT
USER$:[SMYTHE]
$ SET PREFIX "(!5%T) "
$ @TEST
(17:52) $ SET DEFAULT SYS$LOGIN
(17:52) $ SHOW DEFAULT
USER$:[SMYTHE]
보기: SHOW SYMBOL 명령을 사용하여 디버깅
다음 보기에서는 SHOW SYMBOL 명령을 사용하여 COMMAND 기호가 어떻게 정의되었는지 확인하는 방법을 보여 줍니다.
$ SET VERIFY
$ @CLEAN
$ GET_COM_LOOP:
$ INQUIRE COMMAND -
"ENTER COMMAND (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)"
ENTER COMMAND (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE): EXIT
$ SHOW SYMBOL COMMAND
COMMAND = "EXIT"
$ IF COMMAND .EQS. "exit" THEN GOTO END_LOOP
.
.
.
SHOW SYMBOL 명령은 COMMAND 기호에 “EXIT” 값이 있음을 보여 줍니다. INQUIRE 명령은 입력 내용을 대문자로 자동 변환하고, 명령을 테스트하는 IF 문은 “exit” 문자열에서 소문자를 사용하므로, DCL은 문자열이 서로 다른 것으로 판정합니다. 오류를 수정하려면 IF 문의 인용된 문자열이 대문자로 쓰이도록 해야 합니다. 문자열의 나머지 부분에는 대문자와 소문자 중 어느 것이든 사용할 수 있습니다.
실행 중 확인 활성화
확인을 활성화기 위해 실행 중인 명령 프로시저를 중단할 수도 있습니다. 명령 프로시저에 SET VERIFY 명령 또는 Ctrl/Y 키 시퀀스가 포함되어 있지 않은 경우에 한해 다음 단계를 수행하여 확인을 활성화할 수 있습니다.
표 13-10
단계
작업
1
Ctrl/Y를 눌러 실행을 중단합니다.
2
SET VERIFY 명령을 입력합니다.
3
CONTINUE 명령을 입력하여 명령 프로시저의 실행을 계속합니다(확인이 설정된 상태).

6 단계: 정리 작업 추가
일반적으로 명령 프로시저를 실행함으로 인해 사용자의 프로세스 상태가 변경되어서는 안 됩니다. 따라서 명령 프로시저에는 프로세스를 원래 상태로 되돌리는 명령 집합이 포함되어야 합니다. 이 명령 집합은 대체로 “CLEAN_UP”이라는 레이블이 지정된 서브 루틴의 일부입니다. 일반적인 정리 작업에는 파일 닫기와 기본 장치 및 디렉토리의 재설정이 포함됩니다.
다음 절차를 수행하여 명령 프로시저에 정리 작업을 추가합니다.
표 13-11
단계
작업
1
정리 서브 루틴 앞에 CLEAN_UP과 같은 레이블을 지정합니다.
2
F$GETJPI 렉시칼 함수를 사용하여 열려 있는 파일을 모두 테스트합니다.
3
DELETE 또는 PURGE 명령을 사용하여 임시 파일이나 관계 없는 파일을 모두 삭제합니다.
4
장치나 디렉토리 같은 기본값을 변경한 경우에는 SET DEFAULT 명령을 사용하여 원래 상태로 복원합니다.
5
ON CONTROL_Y 문을 포함하여 정리 작업이 수행되도록 합니다.

파일 닫기
열려 있는 파일이 있으면 프로시저가 종료되기 전에 닫아야 합니다. F$GETJPI 렉시칼 함수를 사용하여 프로세스에 대한 나머지 열려 있는 파일 할당량(FILCNT)을 검사할 수 있습니다. FILCNT가 명령 프로시저의 시작 부분과 끝 부분에서 동일하면 열려 있는 파일이 없는 것입니다.
다음은 사용자에게 열려 있는 파일이 한 개 있다는 경고를 보낼 때 사용하는 명령입니다.
$ FIL_COUNT = F$GETJPI ("","FILCNT")
.
.
.
$ IF FILCNT .NE. F$GETJPI ("", "FILCNT") THEN-
WRITE SYS$OUTPUT "WARNING -- file left open)
임시 파일 또는 관계없는 파일 삭제
임시 파일을 만든 경우에는 그 파일을 삭제합니다. 일반적으로 파일을 업데이트했을 때는 해당 파일을 소거해야 이전 복사본을 삭제할 수 있습니다. 사용자가 자신이 만든 파일을 삭제하기 전에 확실히 삭제할 것인지 확인합니다. 예를 들어, 중요한 데이터가 들어 있는 파일을 업데이트한 경우에는 소거 작업을 선택 사항으로 만들고 싶을 경우도 있습니다.
기본 장치와 디렉토리 중 하나 또는 둘 다를 변경할 경우, 명령 프로시저가 종료되기 전에 원래 기본값을 다시 설정합니다. 원래 기본 디렉토리의 이름을 저장하려면 F$ENVIRONMENT 렉시칼 함수의 DEFAULT 키워드를 사용합니다. 명령 프로시저의 끝에서, 저장된 장치와 디렉토리를 복원하는 SET DEFAULT 명령을 포함합니다.
다음 보기에 나오는 명령행에서는 장치와 디렉토리 기본값을 저장 및 복원합니다.
$ SAV_DEFAULT = F$ENVIRONMENT ("DEFAULT")
.
.
.
$ SET DEFAULT 'SAV_DEFAULT'
일반적으로 변경되는 프로세스 특성
다음 표에서는 일반적으로 변경되는 그 밖의 프로세스 특성, 그러한 특성을 저장할 때 사용하는 렉시칼 함수 및 그러한 특성을 복원할 때 사용하는 렉시칼 함수 또는 명령을 나열합니다.
표 13-12
특성
저장에 사용하는 렉시칼 함수
복원에 사용하는 렉시칼 함수
DCL 프롬프트
F$ENVIRONMENT
SET PROMPT
기본 보호
F$ENVIRONMENT
SET PROTECTION/DEFAULT
권한
F$SETPRV
F$SETPRV 또는 SET PROCESS/PRIVILEGES
제어 문자
F$ENVIRONMENT
SET CONTROL
확인
F$VERIFY
F$VERIFY
메시지 형식
F$ENVIRONMENT
SET MESSAGE
키 상태
F$ENVIRONMENT
SET KEY

이러한 렉시칼 함수에 대한 전체 설명을 보려면 OpenVMS DCL Dictionary를 참조하십시오.
정리 작업의 수행 보장
명령 프로시저가 중단되더라도 정리 작업이 수행되도록 하려면 명령 프로시저에서 각 명령 수준을 다음 명령문으로 시작합니다.
$ ON CONTROL_Y THEN GOTO CLEANUP
ON CONTROL_Y 명령 사용에 대한 추가 정보를 보려면 14장을 참조하십시오.
7 단계: 명령 프로시저 완료
일반 디자인이 제대로 작동할 때는 다음 단계를 수행하여 명령 프로시저를 완료합니다.
표 13-13
단계
작업
1
명령 프로시저의 첫 번째 프로그램 스텁을 명령으로 대체합니다.
2
명령 프로시저를 테스트하여 새 명령이 제대로 작동하는지 확인합니다.
3
필요할 경우 명령 프로시저를 디버그합니다.
4
첫 번째 프로그램 스텁이 작동하면 모든 프로그램 스텁이 바뀔 때까지 계속해서 다음 프로그램 스텁으로 이동합니다.

보기: 프로그램 스텁을 명령으로 바꾸기
다음 보기에서는 CLEANUP.COM의 TYPE 섹션에 대한 코드를 보여 줍니다.
$! Execute if user entered TYPE
$! TYPE:
$ IF COMMAND .NES. "TYPE" THEN GOTO ERROR
$ INQUIRE FILE "File to type"
$ TYPE 'FILE'
$ GOTO GET_COM_LOOP
다음은 기존 코드를 바꿉니다.
$ WRITE SYS$OUTPUT "This is the TYPE section."
보기: CLEANUP.COM 명령 프로시저
다음은 완료된 CLEANUP.COM 명령 프로시저의 보기입니다.
$ GET_COM_LOOP:
$ INQUIRE COMMAND -
"Enter command (DELETE, DIRECTORY, EXIT, PRINT, PURGE, TYPE)"
$ IF COMMAND .EQS. 'EXIT' THEN GOTO END_LOOP
$!
$!Execute if user entered DELETE
$ DELETE:
$ IF COMMAND .NES. "DELETE" THEN GOTO DIRECTORY
$ INQUIRE FILE "File to delete? "
$ DELETE 'FILE'
$ GOTO GET_COM_LOOP
$!
$!Execute if user entered DIRECTORY
$ DIRECTORY:
$ IF COMMAND .NES. "DIRECTORY" THEN GOTO PRINT
$ DIRECTORY
$ GOTO GET_COM_LOOP
$!
$!Execute if user entered PRINT
$ PRINT:
$ IF COMMAND .NES. "PRINT" THEN GOTO PURGE
$ INQUIRE FILE "File to print? "
$ PRINT SYS$OUTPUT 'FILE'
$ GOTO GET_COM_LOOP
$!
$!Execute if user entered PURGE
$ PURGE:
$ IF COMMAND .NES. "PURGE" THEN GOTO TYPE
$ PURGE
$ GOTO GET_COM_LOOP
$!
$!Execute if user entered TYPE
$ TYPE:
$ IF COMMAND .NES. "TYPE" THEN GOTO ERROR
$ INQUIRE FILE "File to type"
$ TYPE 'FILE'
$ GOTO GET_COM_LOOP
$!
$ ERROR:
$ WRITE SYS$OUTPUT "You entered an invalid command."
$ GOTO GET_COM_LOOP
$!
$ END_LOOP:
$ WRITE SYS$OUTPUT "Directory ''F$DIRECTORY()' has been cleaned."
$
$ EXIT
명령 프로시저 실행
명령 프로시저가 실행되기 위해서는 사용자가 해당 명령 프로시저를 실행해야 합니다. 다음과 같은 방법으로 명령 프로시저를 실행할 수 있습니다.
다른 명령 프로시저에서 명령 프로시저 실행
원격 노드에서 명령 프로시저 실행
DCL 한정자 또는 매개 변수를 사용하여 명령 프로시저 실행
대화형으로 명령 프로시저 실행
일괄 처리 작업으로 명령 프로시저 실행
디스크 및 테이프 볼륨에서 명령 프로시저 실행
다음 절에서는 이러한 방법들을 각각 설명합니다.
다른 명령 프로시저에서 명령 프로시저 실행
실행 프로시저(@) 명령을 포함하여 명령 프로시저에서 다른 명령 프로시저를 실행할 수 있습니다.
다음 명령 프로시저 WRITEDATE.COM에서는 명령 프로시저 GETDATE.COM을 호출합니다.
$! WRITEDATE.COM
$!
$ INQUIRE TIME "What is the current time in hh:mm format?"
$ @GETDATE [JONES.COM]GETDATE.COM
원격 노드에서 명령 프로시저 실행
TYPE 명령을 사용하여 원격 노드에서 다른 계정의 최상위 디렉토리에 있는 명령 프로시저를 실행할 수 있습니다. 다음과 같은 명령 프로시저를 실행할 수 있습니다.
클러스터 전체에 제공되지 않는 로컬 OpenVMS Cluster 시스템에서 서비스 상태를 표시하는 명령 프로시저
원격 노드에 로그인한 사용자를 나열합니다.
TYPE 명령 다음에 액세스 제어 문자열을 입력합니다. 다음 형식을 사용합니다.
$ TYPE nodename"username password"::"TASK=command_procedure"
username과 password 변수는 원격 노드의 계정에 대한 사용자 이름과 암호입니다.
다음 명령 프로시저에서는 명령 프로시저가 위치한 원격 노드에 로그인한 사용자를 표시합니다.
$!SHOWUSERS.COM
$!
$ IF F$MODE() .EQS. "NETWORK" THEN DEFINE/USER SYS$OUTPUT SYS$NET
$ SHOW USERS
다음 보기에서는 SHOWUSERS.COM이 ORIOLE 노드의 BIRD 계정의 최상위 디렉토리에 있으며 암호는 BOULDER입니다. SHOWUSERS.COM은 원격 노드 ORIOLE에서 DCL 명령 SHOW USERS를 실행합니다. TYPE 명령은 로컬 노드, 즉 TYPE 명령을 입력하는 터미널에서 SHOWUSERS.COM의 출력을 표시합니다.
$ TYPE ORIOLE"BIRD BOULDER"::"TASK=SHOWUSERS"

OpenVMS User Processes at 11-DEC-1999 17:20:13.30
Total number of users = 4, number of processes = 4
Username Node Interactive Subprocess Batch
FLICKER AUTOMA 2 1
ROBIN FABLES 1 2 1
DOVE MURMUR 1
DUCK FABLES 1 1
보안 참고
액세스 제어 문자열과 함께 TYPE 명령을 사용할 경우 터미널에 암호가 표시됩니다. 적절한 보안 주의 사항을 따릅니다.
DCL 한정자 또는 매개 변수를 사용하여 명령 프로시저 실행
DCL 명령 매개 변수나 한정자를 지정하는 명령 프로시저를 만들 수 있습니다. 이러한 유형의 명령 프로시저는 한 개 이상의 명령과 함께 자주 사용하는 매개 변수 또는 한정자 집합이 있을 경우에 유용합니다.
한정자나 매개 변수를 일반적으로 지정하는 명령행에서 실행 프로시저 명령(@)을 입력합니다.
다음 명령 프로시저는 LINK 명령에 대한 한정자 집합을 입력할 때 사용할 수 있습니다.
$! This command procedure contains command
$! qualifiers for the LINK command.
$!
/DEBUG/SYMBOL_TABLE/MAP/FULL/CROSS_REFERENCE
다음 명령행은 DEFLINK.COM에서 지정된 한정자를 사용하여 SYNAPSE.OBJ라는 객체를 연결합니다.
$ LINK SYNAPSE@DEFLINK
다음 명령 프로시저는 CHAP1.TXT, CHAP2.TXT, CHAP3.TXT 매개 변수를 DCL 명령과 함께 입력할 때 사용할 수 있습니다.
$! PARAM.COM
$! This command procedure contains a list of
$! parameters that can be used with commands.
$!
CHAP1, CHAP2, CHAP3
다음 명령행은 매개 변수 목록 대신 PARAM 명령 프로시저를 지정합니다. 다음 보기에서는 PARAM.COM에 나열된 파일 이름이 매개 변수입니다.
$ DIRECTORY/SIZE @PARAM
주) 실행 프로시저 명령(@)을 사용할 때는 지정된 전체 파일이 DCL에 의한 명령 입력으로 처리됩니다.
제한 사항
명령 프로시저 실행 시에는 다음과 같은 제한 사항이 적용됩니다.
명령 프로시저가 한정자 이름으로 시작될 경우, 실행 프로시저 명령(@) 앞에 공백을 포함할 수 없습니다.
명령 프로시저가 매개 변수로 시작될 경우, 실행 프로시저 명령(@) 앞에 공백이 와야 합니다.
대화형으로 명령 프로시저 실행
명령 프로시저를 대화형으로 실행하려면 실행 프로시저 명령(@) 다음에 명령 프로시저의 파일 지정을 입력합니다.
예를 들어, 다음 명령은 WORKDISK 디스크의 [MAINT.PROCEDURES] 디렉토리에 있는 SETD.COM 프로시저를 실행합니다.
$ @WORKDISK:[MAINT.PROCEDURES]SETD Return
기호 이름을 정의하여 긴 명령행을 나타낼 수 있습니다. 그런 다음 그 기호를 사용하여 명령 프로시저를 실행할 수 있습니다.
기호를 사용하여 이전 보기에 표시된 명령 프로시저를 실행하려면 로그인 명령 프로시저에 다음 행을 포함합니다.
$ SETD == "@WORKDISK:[MAINT.PROCEDURES]SETD"
그런 다음 SETD.COM 프로시저를 실행하려면 다른 명령과 마찬가지로 기호 이름을 입력합니다.
$ SETD Return
기본적으로 명령 프로시저를 대화형으로 실행할 때는 운영 체제에서 사용자의 터미널에 출력 내용을 표시합니다. 그러나 실행 명령에 대해 /OUTPUT 한정자를 사용하여 출력을 파일로 재지정할 수 있습니다.
명령 프로시저 출력을 파일로 재지정하면 해당 프로시저에서 모든 오류 메시지를 터미널로 보내고 출력을 받을 파일로도 보냅니다.
다음 명령은 SETD.COM의 출력을 터미널 대신 RESULTS.TXT 파일에 기록합니다.
$ @SETD/OUTPUT=RESULTS.TXT
명령 프로시저 이름 다음에는 항상 공백 없이 /OUTPUT 한정자를 지정합니다. 그렇지 않을 경우, DCL은 한정자를 해당 프로시저에 전달되는 매개 변수로 해석합니다.
명령 프로시저를 일괄 처리 작업으로 실행
처리 시간이 오래 걸리는 명령 프로시저(예: 큰 프로그램의 컴파일 또는 어셈블)를 사용할 경우, 이러한 프로시저를 일괄 처리 작업으로 제출하면 터미널을 대화형으로 계속해서 사용할 수 있게 됩니다.
명령 프로시저를 일괄 처리 모드로 실행하려면 DCL 명령 SUBMIT을 입력하여 명령 프로시저를 일괄 처리 대기열(실행 대기 중인 일괄 처리 작업 목록)로 제출합니다. 작업을 제출하면 기본 일괄 처리 대기열인 SYS$BATCH로 작업이 지정되며 이 대기열에서는 실행 대기 중인 작업의 대기열 끝에 작업이 추가됩니다. 앞에 있는 작업들이 완료되면 해당 작업이 실행됩니다. OpenVMS 시스템에서는 시스템 관리자가 일괄 처리 대기열을 만들 때 동시에 실행될 수 있는 일괄 처리 작업의 개수가 지정됩니다.
다음 보기에서는 JOB1.COM이라는 명령 프로시저를 실행하는 방법을 보여 줍니다. SUBMIT 명령은 기본 파일 유형인 .COM을 사용하므로, 명령 프로시저의 파일 유형이 .COM일 경우 파일 유형을 입력하지 않아도 됩니다.
$ SUBMIT
JOB1 Job JOB1 (queue SYS$BATCH, entry 651, started on SYS$BATCH) )
원격 일괄 처리 작업
시스템이 네트워크의 일부일 경우, 명령 프로시저를 원격 노드의 일괄 처리 작업으로 제출할 수 있습니다. 명령 프로시저 안에서 DCL 명령을 사용하여 원격 노드의 파일을 열고 닫을 수 있으며 로컬 파일에 대해 동일한 명령과 한정자를 사용하여 해당 파일의 레코드를 읽고 쓸 수 있습니다.
일괄 처리 작업 다시 시작
기본적으로 작업이 끝나기 전에 시스템에 오류가 발생하면 일괄 처리 작업이 첫 행부터 다시 실행됩니다. 그러나 명령 프로시저에서 다음 기호를 사용하여 다시 시작하는 지점을 다르게 지정할 수 있습니다.
$RESTART
이러한 실행 전에 일괄 처리 작업이 최소한 한 번 실행되었을 경우 값이 참인 글로벌 기호입니다. $RESTART의 값은 시스템에서 적절히 할당해 주므로, 사용자가 값을 지정하지는 않습니다.
BATCH$RESTART
SET RESTART_VALUE 명령을 사용하여 값을 지정하는 글로벌 기호입니다.
$RESTART 및 BATCH$RESTART 사용
다음 절차에서는 $RESTART와 BATCH$RESTART 기호를 사용하는 방법을 설명합니다.
표 13-14
단계
작업
1
프로시저의 가능한 각 시작 지점을 레이블로 시작합니다.
2
각 섹션의 첫 번째 단계로, SET RESTART_VALUE 명령을 사용하여 BATCH$RESTART의 값을 레이블과 일치시킵니다.
3
프로시저의 시작 부분에서 $RESTART를 테스트합니다.
4
$RESTART가 참일 경우, BATCH$RESTART를 사용하여 GOTO 문을 전송 레이블로 실행합니다.

다음 명령 프로시저에서는 라이브러리에서 많은 모듈을 추출하여, 그 모듈을 연결한 다음, 결과 파일을 정렬합니다.
$! SORT_MODULES.COM
!
$! Set default to the directory containing
$! the library whose modules are to be sorted
$ SET DEFAULT WORKDISK:[ACCOUNTS.DATA83]
$!
$! Check for restarting
$ IF $RESTART THEN GOTO "BATCH$RESTART"
$!
$ EXTRACT_LIBRARIES:
$ SET RESTART_VALUE=EXTRACT_LIBRARIES
.
.
.
$ CONCATENATE_LIBRARIES:
$ SET RESTART_VALUE=CONCATENATE_LIBRARIES
.
.
.
$ SORT_FILE:
$ SET RESTART_VALUE=SORT_FILE
.
.
.
$ EXIT
이 명령 프로시저가 중단되면 BATCH$RESTART의 값에 따라 CONCATENATE_LIBRARIES 레이블이 지정된 명령문이나 SORT_FILE 레이블이 지정된 명령문에서 파일의 처음부터 명령 프로시저가 다시 실행됩니다. 별도의 많은 모듈을 추출할 경우, 각 추출을 별도의 섹션으로 만들 수 있습니다.
디스크 및 테이프 볼륨에서 명령 프로시저 실행
다음 절에서는 디스크 및 테이프 볼륨에서 명령 프로시저를 실행하는 방법을 설명합니다.
개인 디스크에서 실행
SUBMIT 명령을 사용하여 명령 프로시저를 제출할 때는 할당된 장치의 파일을 액세스할 수 없습니다. 그러나 /SHARE 한정자로 마운트된 개인 디스크에 있는 명령 프로시저는 실행할 수 있습니다.
테이프 볼륨에서 실행
다음과 같은 경우, 테이프 볼륨에 위치한 명령 프로시저를 실행할 수 있습니다.
프로시저에서 다른 프로시저를 호출하지 않는 경우
프로시저에서 GOTO 명령 전의 프로시저에 있는 레이블을 참조하는 GOTO 명령을 실행하지 않는 경우
이러한 두 가지 조건 중 어느 하나라도 발생하면 다음을 수행하여 명령 프로시저를 실행할 수 있습니다.
표 13-15
단계
작업
1
명령 프로시저를 공유 디스크 볼륨으로 복사합니다.
2
공유 디스크 볼륨의 명령 프로시저를 실행합니다.

명령 프로시저 종료 및 중단
이 절에서는 명령 프로시저 종료 방법을 사용할 때는 명령 수준에 대해 설명합니다.
명령 수준은 DCL 수준 인터프리터에 대한 입력 스트림입니다. 터미널에서 명령을 입력할 때는 명령 수준 0을 입력하는 것입니다. CLEANUP.COM 같은 단순 대화형 명령 프로시저는 명령 수준 1에서 실행됩니다. 프로시저가 종료되고 DCL 프롬프트가 화면에 다시 나타나면 명령 수준 0으로 돌아갑니다.
종료 방법
명령 프로시저가 실행 중일 동안 그 명령 프로시저를 종료하는 방법은 세 가지가 있습니다.
명령 프로시저에 EXIT 명령을 넣습니다.
명령 프로시저에 STOP 명령을 넣습니다.
프로그램 실행 중에 Ctrl/Y를 입력합니다.
EXIT 명령을 사용하여 종료
프로시저 또는 EXIT 명령의 끝에서 종료가 이루어지면 더 높은 다음 명령 수준으로 제어가 반환됩니다. EXIT 명령의 매개 변수로 값을 지정하여 더 높은 명령 수준으로 상태 값을 반환할 수 있습니다.
SUB라는 명령 프로시저를 DCL 수준에서 호출하고 SUB가 서브 루틴 SUB1을 호출할 경우, 다음과 같은 상황이 발생합니다.
1. SUB1을 종료하면 SUB1 호출 다음의 명령행에서 SUB로 돌아갑니다.
2. SUB를 종료하면 DCL 명령 수준으로 돌아갑니다.
STOP 명령을 사용하여 종료
STOP 명령으로 인한 종료가 이루어지면 STOP 명령이 실행되는 명령 수준에 관계 없이 제어가 항상 DCL 명령 수준으로 반환됩니다.
STOP 명령을 일괄 처리 작업으로 실행하면 해당 일괄 처리 작업이 종료됩니다.
Ctrl/Y를 사용하여 종료
Ctrl/Y를 누른 다음 EXIT 또는 STOP 명령을 사용하여 프로시저를 종료하는 방법으로 명령 프로시저를 중단할 수 있습니다. 이 경우, EXIT와 STOP 명령은 사용자를 DCL 수준으로 돌려보냅니다.
다음 보기에서는 Ctrl/Y를 눌러서 TESTALL 프로시저를 중단합니다. EXIT 명령은 프로시저의 처리를 종료하고 사용자를 DCL 수준으로 돌려보냅니다. 프로시저를 중단한 후 STOP 명령을 입력할 수도 있습니다.
$ @TESTALL Return
Ctrl/Y
$ EXIT Return
$
종료 처리 루틴
명령 프로시저를 중단할 때 중단할 명령(또는 이미지)에서 종료 처리 루틴을 선언하는 경우, EXIT 명령은 이러한 루틴에 제어를 넘깁니다. 그러나 STOP 명령은 이러한 루틴을 실행하지 않습니다.
오류 처리
기본적으로 명령 인터프리터는 어떤 명령으로 인해 오류 또는 심각한 오류가 발생할 경우, EXIT 명령을 실행합니다. 이 경우 프로시저는 이전 명령 수준으로 종료됩니다. 그 밖의 심각도 수준(성공, 경고, 정보 등)의 경우, 명령 프로시저는 계속됩니다.
명령 인터프리터에서 오류를 처리하는 방법에 한 가지 예외가 있습니다. 명령 프로시저의 레이블과 존재하지 않는 레이블을 참조할 경우(예: 프로시저에서 레이블로 사용되지 않는 GOTO ERR1과 ERR1 명령을 포함할 경우), GOTO 명령은 경고를 내보내고 명령 프로시저는 종료됩니다.
시스템에서 EXIT 명령을 오류 처리 루틴의 일부로 실행할 경우, $STATUS의 값이 한 가지 변경 사항과 함께 다시 이전 명령 수준으로 전달됩니다. 명령 인터프리터에서는 $STATUS의 상위 자릿수를 1로 설정하여 명령 인터프리터에서 해당 상태 값과 관련된 메시지를 다시 표시하지 않도록 합니다.
다음 보기의 TEST.COM 명령 프로시저에는 출력 파일 지정에 오류가 들어 있습니다.
$ CREATE DUMMY.DAT\
THIS IS A TEST FILE
$ SHOW TIME
이 프로시저를 실행하면 CREATE 명령이 $STATUS에 오류를 반환하고 해당 메시지를 표시합니다. 그러면 명령 인터프리터에서 $STATUS의 값을 검사하고, 발생한 오류를 확인하고, EXIT 명령을 실행하고, $STATUS의 값을 반환합니다. CREATE 명령이 오류 메시지를 이미 한 번 표시했기 때문에 프로시저가 종료될 경우 오류 메시지가 다시 표시되지는 않습니다. DCL 명령 수준에서는 $STATUS에 오류 메시지가 들어 있지만 상위 자릿수는 1로 설정된 것을 볼 수 있습니다. 예를 들면 다음과 같습니다.
$ @TEST
%CREATE-E-OPENOUT, error opening DUMMY.DAT\ as output
-RMS-F-SYN, file specification syntax error
%DCL-W-SKPDAT, image data (records not beginning with "$") ignored
$ SHOW SYMBOL
$STATUS $STATUS = "%X109110A2"
$ WRITE SYS$OUTPUT F$MESSAGE(%X109110A2)
%CREATE-E-OPENOUT, error opening !AS as output
기본 오류 동작
다음 표에서는 명령 프로시저가 실행 중인 동안 오류 조건이나 Ctrl/Y 중단이 발생할 경우에 취할 기본 동작을 설명합니다. ON, SET [NO]ON, SET [NO]CONTROL=Y 명령 등을 사용하여 이러한 기본 동작을 무시할 수 있습니다.
표 13-16
중단
기본 동작
오류 또는 심각한 오류
프로시저가 다음 명령 수준으로 종료됩니다.
DCL 명령 수준 또는 명령 수준 1에서의 Ctrl/Y
프로시저가 중단됩니다. 종료를 강요하는 다른 이미지가 없을 경우에는 프로시저가 계속될 수 있습니다.
명령 수준 1 아래 수준에서의 Ctrl/Y
프로시저가 더 높은 다음 명령 수준으로 종료됩니다.

기타 오류 처리 방법
다음 절에서는 그 밖의 오류 처리 방법을 설명합니다.
ON 명령
ON 명령은 특정 심각도 이상의 오류가 발생할 경우 수행할 동작을 지정합니다. 그러한 오류가 발생하면 시스템에서 다음과 같은 동작을 취합니다.
ON 명령으로 지정된 동작을 수행합니다.
지정한 ON 동작의 결과를 나타내도록 $STATUS와 $SEVERITY를 설정합니다. 일반적으로 성공으로 설정되어 있습니다.
오류 또는 심각한 오류가 발생할 경우 종료하도록 기본 오류 동작을 다시 설정합니다.
ON 명령 동작은 한 번만 실행됩니다. 따라서 ON 명령에 지정된 동작을 명령 프로시저에서 수행하면 기본 오류 동작이 다시 설정됩니다.
ON 명령으로 지정된 동작은 명령이 실행되는 명령 수준 안에서만 적용됩니다. 따라서 다른 프로시저를 호출하는 프로시저에서 ON 명령을 실행할 경우, ON 명령 동작이 중첩된 프로시저에 적용되지 않습니다.
ON 명령의 형식은 다음과 같습니다.
ON condition THEN [$] command
여기서 “condition”은 다음 키워드 중 하나가 됩니다.
표 13-17
ON 키워드
취해지는 동작
WARNING
경고, 오류 또는 심각한 오류가 발생할 경우 명령 프로시저는 지정된 동작을 수행합니다.
ERROR
오류 또는 심각한 오류가 발생할 경우 명령 프로시저는 지정된 동작을 수행합니다. 경고가 발생할 경우 명령 프로시저는 계속됩니다.
SEVERE_ERROR
심각한(치명적) 오류가 발생할 경우 명령 프로시저는 지정된 동작을 수행합니다. 경고나 오류가 발생할 경우 프로시저는 계속됩니다.

특정 보안 수준에 대해 ON 명령 동작이 설정될 경우, 명령 인터프리터는 심각도가 동일하거나 더 심각한 오류가 발생할 때 지정된 동작을 수행합니다. 덜 심각한 오류가 발생하면 명령 인터프리터는 파일 처리를 계속합니다.
보기: ON 명령 사용
다음 명령을 사용하여 경고, 오류 또는 심각한 오류가 발생할 경우 프로시저가 종료되도록 기본 오류 처리를 무시할 수 있습니다.
$ ON WARNING THEN EXIT
보기: 오류 후 계속
명령 프로시저에 다음 명령이 들어 있으면 오류 또는 심각한 오류가 발생할 때까지 명령 프로시저가 정상적으로 실행됩니다.
$ ON ERROR THEN GOTO ERR1
해당 오류가 발생하면 프로시저는 ERR1에서 실행을 계속합니다. $STATUS와 $SEVERITY는 성공으로 설정되고 기본 오류 동작이 다시 설정됩니다. 다른 ON 또는 SET NOON 명령이 실행되기 전에 두 번째 오류가 발생하면 프로시저가 이전 명령 수준으로 종료됩니다. ON 명령으로 지정된 동작은 명령이 실행되는 명령 수준 안에서만 적용됩니다. 따라서 다른 프로시저를 호출하는 프로시저에서 ON 명령을 실행하면 ON 명령 동작이 중첩된 프로시저에 적용되지 않습니다.
그림 13-1에서는 ON 명령 동작을 보여 줍니다.
그림 13-1 ON 명령 동작
[1] 이 ON 명령은 기본 명령 동작(경고 시에는 계속, 오류 또는 심각한 오류 시에는 종료)을 무시합니다. A.FOR를 컴파일하는 동안 오류 또는 심각한 오류가 발생하면 명령 프로시저는 다음 명령을 계속합니다.
[2] 이전의 ON 명령이 적용될 경우, 기본 명령 동작이 다시 설정됩니다. 따라서 A.FOR와 B.FOR를 모두 컴파일하는 동안 오류 또는 심각한 오류가 발생하면 명령 프로시저가 종료됩니다.
[3] C.FOR를 컴파일하는 동안 경고, 오류 또는 심각한 오류가 발생하면 명령 프로시저가 종료됩니다.
[4] 명령이 실행되기 전에 명령 프로시저가 종료되지 않으면 명령 동작이 적용됩니다.
부록 B의 보기 명령 프로시저인 FORTUSER.COM과 CALC.COM에서도 오류 처리 설정을 위한 ON 명령의 사용을 보여 줍니다.
SET NOON 명령 사용
명령 프로시저에서 SET NOON 명령을 사용하여 명령에서 반환된 상태를 명령 인터프리터가 검사하지 못하도록 할 수 있습니다. 이 명령은 ON 명령을 NO 상태로 설정합니다. SET NOON 명령을 사용하면 명령 인터프리터가 계속해서 값을 $STATUS와 $SEVERITY에 넣지만 오류 검사는 수행하지 않습니다. SET ON 명령 또는 ON 명령을 사용하여 오류 검사를 복원할 수 있습니다.
프로시저에서 오류 검사를 비활성화할 경우, 명령 또는 프로그램 실행 후의 $STATUS 값을 명시적으로 확인할 수 있습니다.
다음 보기에서는 SET NOON 명령을 RUN 명령 앞에 사용하여 TESTA 또는 TESTB 프로그램에서 오류 조건을 반환하더라도 명령 프로시저가 계속되도록 합니다. SET ON 명령은 명령 인터프리터에 의한 기본 오류 검사를 복원합니다.
$ SET NOON
$ RUN TESTA
$ RUN TESTB
$ SET ON
다음 보기에서는 첫 번째 IF 명령이 $STATUS에 참 값이 있는지(즉, 홀수 값인지) 여부를 확인합니다. 참 값이 있으면 FORTRAN 명령이 성공적이였으므로 LINK 명령이 실행됩니다. LINK 명령이 실행된 후에는 $STATUS를 다시 테스트합니다. $STATUS가 홀수이면 RUN 명령이 실행되고 그렇지 않으면 RUN 명령이 실행되지 않습니다. SET ON 명령은 현재 ON 조건 동작을 복원합니다. 즉, SET NOON 명령이 실행되기 전에 어떤 조건이 적용되었는지는 문제되지 않습니다.
$ SET NOON
$ FORTRAN MYFILE
$ IF $STATUS THEN LINK MYFILE
$ IF $STATUS THEN RUN MYFILE
$ SET ON
SET ON 또는 SET NOON 명령은 현재 명령 수준, 즉, 명령이 실행되는 해당 명령 수준에만 적용됩니다. 다른 명령 프로시저를 호출하는 명령 프로시저에서 SET NOON 명령을 사용할 경우, 중첩된 프로시저 안에서 기본 오류 검사 메커니즘이 적용됩니다. DCL 수준에서 대화형으로 SET NOON을 입력할 때는 아무런 의미가 없습니다.
Ctrl/Y 중단 처리
기본적으로 명령 프로시저를 실행하는 동안 Ctrl/Y를 누르면 명령 인터프리터는 Ctrl/Y 명령 수준을 호출한 특별한 명령 수준에서 명령 입력을 요구하는 프롬프트를 표시합니다. Ctrl/Y 명령 수준에서 명령 인터프리터 안에서 실행되는 DCL 명령을 입력한 다음 CONTINUE 명령을 사용하여 명령 프로시저의 실행을 다시 시작할 수 있습니다. 또한 명령 프로시저의 실행을 중지시키는 DCL 명령을 입력하여 프로시저를 중지할 수 있습니다.
이 절에서는 명령 프로시저에서 ON 명령을 사용하여 Ctrl/Y 중단을 처리하는 방식을 무시하는 방법에 대해 설명합니다.
명령 프로시저 중지
Ctrl/Y를 눌러서 대화형으로 실행되고 있는 명령 프로시저를 중단할 수 있습니다. Ctrl/Y를 누르면 명령 인터프리터에서 Ctrl/Y 수준이라고 하는 새로운 명령 수준을 설정하고 명령 입력을 요구하는 프롬프트를 표시합니다. 중단이 이루어지는 시기는 실행 중인 명령 또는 프로그램에 따라 다릅니다.
명령 인터프리터에 의해 명령이 직접 실행될 경우(예: IF, GOTO 또는 할당문), 명령 인터프리터가 Ctrl/Y 수준에서 명령을 입력하라는 프롬프트를 표시하기 전에 명령 실행이 완료됩니다.
명령 또는 프로그램이 별개의 이미지(즉, 명령 인터프리터 외의 다른 이미지)일 경우, 명령이 중단되고 명령 인터프리터는 Ctrl/Y 수준에서 명령을 입력하라는 프롬프트를 표시합니다.
Ctrl/Y 수준에서는 명령 인터프리터가 이전에 설정된 모든 명령 수준에 대한 상태를 저장하여 Ctrl/Y 중단 후 정확한 상태를 복원할 수 있도록 합니다.
프로시저를 중단한 후에는 다음을 수행할 수 있습니다.
명령 인터프리터 안에서 실행되는 DCL 명령을 입력합니다.
그러한 명령으로는 SET VERIFY, SHOW TIME, SHOW TRANSLATION, ASSIGN, EXAMINE, DEPOSIT, SPAWN, ATTACH 명령 등이 있습니다. 이러한 명령을 한 개 이상 입력한 후에는 CONTINUE 명령을 사용하여 프로시저의 실행을 계속할 수 있습니다. 명령 인터프리터 안에서 실행되는 명령의 전체 목록을 보려면 명령 및 이미지에서 출력 재지정을 참조하십시오.
CONTINUE 명령을 입력하면 중단된 명령이나 프로그램 또는 최근에 완료된 명령의 다음 행에서 명령 프로시저가 실행을 계속합니다.
다른 이미지를 실행하는 DCL 명령을 입력합니다.
새 이미지를 호출하는 명령을 입력하면 명령 인터프리터는 명령 수준 0으로 돌아가서 명령을 실행합니다. 이렇게 하면 명령 프로시저의 실행이 종료됩니다. 중단된 이미지에 의해 선언된 모든 종료 처리기는 새 이미지가 시작되기 전에 실행될 수 있습니다.
EXIT 또는 STOP 명령을 입력하여 명령 프로시저의 실행을 종료합니다.
EXIT 명령을 사용할 경우에는 중단된 이미지에 의해 선언된 종료 처리기가 실행될 수 있습니다. 그러나 STOP 명령은 이러한 루틴을 실행하지 않습니다.
주) Ctrl/Y 다음에 명령 프로시저를 명령 수준에서 명시적으로 또는 ON 루틴의 일부로 종료하지 않을 경우, 다음에 입력하는 명령이 명령 프로시저의 컨텍스트에서 중단됩니다. 예를 들어, 대화형 수준에서 다음 기호를 정의하는 경우를 가정합니다.
$ MAIL = "mail/edit=(send,reply,forward)"
Ctrl/Y를 입력하여 이 정의가 포함되지 않은 명령 프로시저를 중단한 다음 MAIL 명령을 입력하여 메시지를 보내면 편집기가 자동으로 호출되지 않습니다.
특권 있는 이미지 중지
특권 있는 이미지의 실행을 중단할 경우, 이미지의 컨텍스트를 저장하기 위해서는 CONTINUE, SPAWN 또는 ATTACH 명령만 입력할 수 있습니다. 사용자가 생성했거나 연결한 하위 프로세스 내의 경우를 제외한 그 밖의 명령을 입력할 경우, 특권 있는 이미지는 강제로 종료됩니다.
Ctrl/Y 동작 루틴 설정
다음 절에서는 Ctrl/Y 동작 루틴을 설정하는 방법을 설명합니다.
ON 명령 사용
오류 조건에 대해 취할 동작을 정의하는 ON 명령은 명령 프로시저의 실행 중에 발생하는 Ctrl/Y 중단에 대한 동작 루틴을 정의하는 방법도 제공합니다. 사용자가 지정하는 기본 동작은 기본 Ctrl/Y 동작(즉, Ctrl/Y 명령 수준에서 명령 입력을 요구하는 프롬프트)을 무시합니다. 예를 들면 다음과 같습니다.
$ ON CONTROL_Y THEN EXIT
프로시저에서 ON 명령을 실행하면 해당 프로시저의 실행 중 이어지는 Ctrl/Y 중단으로 인해 프로시저가 종료됩니다. 이전 명령 수준으로 제어가 넘어갑니다.
Ctrl/Y를 눌러서 ON CONTROL_Y를 사용하는 프로시저를 중단하면 다음 동작이 이루어집니다.
현재 실행 중인 명령이 명령 인터프리터 안에서 실행된 명령일 경우, 해당 명령이 완료되고 Ctrl/Y 동작이 수행됩니다.
현재 명령 또는 프로그램이 명령 인터프리터 외의 다른 이미지에 의해 실행될 경우, 이미지가 강제로 종료되고 Ctrl/Y 동작이 수행됩니다. 그러나 이미지가 종료 처리기를 선언한 경우에는 Ctrl/Y 동작이 수행되기 전에 종료 처리기가 실행됩니다. Ctrl/Y 동작 다음에는 이미지가 계속될 수 없습니다.
Ctrl/Y 입력의 효과
Ctrl/Y의 실행으로 기본 Ctrl/Y 동작(즉, Ctrl/Y 명령 수준에서 명령 입력을 요구하는 프롬프트 표시)이 자동으로 다시 설정되지는 않습니다. Ctrl/Y 동작은 다음 조건들 중 하나가 발생할 때까지 유지됩니다.
Ctrl/Y를 누르거나, EXIT 또는 STOP 명령을 실행하거나, 기본 오류 조건 처리 동작의 결과로 프로시저가 종료됩니다.
다른 ON CONTROL_Y 명령이 실행됩니다.
프로시저가 SET NOCONTROL=Y 명령을 실행합니다(Ctrl/Y 중단의 비활성화 및 활성화 참조).
Ctrl/Y 동작은 활성화된 각 명령 수준에서 지정할 수 있으며 지정된 명령 수준에만 영향을 미칩니다.
다음 보기에 나오는 명령 프로시저가 실행될 때는 각 Ctrl/Y 중단으로 인해 SHOW TIME 명령이 실행됩니다. 각 SHOW TIME 명령이 실행된 후 프로시저는 중단된 명령의 다음 명령에서 실행을 계속합니다.
$ ON CONTROL_Y THEN SHOW TIME
그림 13-2에서는 Ctrl/Y 중단 다음의 실행 흐름을 보여 줍니다.
그림 13-2 Ctrl/Y 동작 다음의 실행 흐름
[1] Ctrl/Y 중단은 TYPE 명령 실행 중에 발생합니다.
[2] 그런 다음 CLEAN_UP 레이블로 제어가 넘어갑니다.
[3] 루틴 실행 후 명령 프로시저가 종료되고 대화형 명령 수준으로 돌아갑니다.
[4] Ctrl/Y 중단은 TYPE 명령 실행 중에 발생합니다.
[5] ON 명령에 지정된 WRITE 명령이 실행됩니다.
[6] 중단된 명령의 다음 명령에서 명령 프로시저의 실행이 계속됩니다.
그림 13-3에서는 중첩된 명령 프로시저를 실행하는 동안 Ctrl/Y를 누를 경우 어떤 상황이 발생하는지 보여 줍니다.
그림 13-3 중첩된 프로시저에서의 Ctrl/Y
[1] SEARCH.COM이 실행되는 동안 Ctrl/Y 중단이 발생하면 CLEAN_UP 레이블로 제어가 넘어갑니다.
[2] SUBSEARCH.COM이 실행되는 동안 Ctrl/Y 중단이 발생하면 SEARCH.COM의 NEXT_STEP 레이블로 제어가 넘어갑니다.
[3] SUBSEARCH.COM에 지정된 Ctrl/Y 동작이 없기 때문에 프로시저는 Ctrl/Y 중단이 발생한 이전 명령 수준으로 종료됩니다.
[4] SUBSUB.COM이 실행되는 동안 Ctrl/Y 중단이 발생하면 SHOW TIME이 실행됩니다.
Ctrl/Y 중단의 비활성화 및 활성화
다음 절에서는 Ctrl/Y 중단을 비활성화하고 활성화하는 방법을 설명합니다.
SET NOCONTROL=Y 사용
SET NOCONTROL=Y 명령은 Ctrl/Y 처리를 비활성화합니다. 즉, 명령 프로시저에서 SET NOCONTROL=Y 명령을 실행할 경우에는 Ctrl/Y를 눌러도 아무 효과가 없습니다.
또한 SET NOCONTROL=Y 명령은 ON CONTROL_Y 명령을 사용하여 설정된 현재의 Ctrl/Y 동작을 취소합니다. 기본 Ctrl/Y 동작을 다시 설정하려면 다음 두 명령을 사용합니다.
$ SET NOCONTROL=Y
$ SET CONTROL=Y
SET NOCONTROL=Y 명령은 Ctrl/Y 처리를 비활성화하며 현재의
ON CONTROL_Y 동작을 취소합니다. SET CONTROL=Y 명령은 Ctrl/Y 처리를 활성화합니다. 이 시점에서 기본 동작이 복원됩니다. 즉, 프로시저 실행 중 Ctrl/Y를 누르면 명령 인터프리터는 Ctrl/Y 명령 수준에서 명령을 입력하라는 프롬프트를 표시합니다.
SET NOCONTROL=Y 명령은 모든 명령 수준에서 사용할 수 있습니다. 이 명령은 SET CONTROL=Y 명령이 Ctrl/Y 처리를 다시 활성화할 때까지 모든 명령 수준에 영향을 미칩니다.
SET CONTROL=Y 사용
ON CONTROL_Y 명령은 다른 ON CONTROL_Y 또는 SET NOCONTROL=Y 명령이 실행되거나 명령 프로시저가 종료될 때까지 유지됩니다.
Ctrl/Y가 비활성화될 경우 종료되지 않는 루프를 끝내려면 DCL 명령 STOP을 사용하여 다른 터미널에서 프로세스를 삭제해야 합니다. 기본 Ctrl/Y 동작을 비활성화할 경우에는 될 수 있는 대로 빨리 다시 설정하십시오. 기본 Ctrl/Y 동작을 다시 설정하려면 SET NOCONTROL=Y 명령 다음에 SET CONTROL=Y 명령을 실행합니다.
다음 명령 프로시저에서는 파일이 입력되는 동안 Ctrl/Y를 눌러서 END_TYPE 레이블로 제어를 넘깁니다.
.
.
.
$! Type a file
$ IF COMMAND .NES. "TY" THEN GOTO END_TYPE
$ ON CONTROL_Y THEN GOTO END_TYPE
$ TYPE 'FILESPEC'
$END_TYPE:
$!
$!
Reset default
$ SET NOCONTROL=Y
$ SET CONTROL=Y
.
.
.
주) ON CONTROL_Y와 SET NOCONTROL=Y 명령은 특수 어플리케이션을 위한 명령입니다. 일반적으로 Ctrl/Y 중단을 비활성화하도록 권장되지는 않습니다. Ctrl/Y가 비활성화될 경우 종료되지 않는 루프를 끝내려면 루프 반복 중인 프로시저가 실행되고 있는 프로세스를 다른 터미널에서 삭제해야 합니다.
조건 코드를 사용하여 명령 프로시저의 오류 감지
명령 프로시저의 각 DCL 명령 실행이 완료되면 명령 인터프리터는 명령이 종료된 이유를 설명하는 조건 코드를 저장합니다. 이 코드는 성공적인 완료를 나타낼 수도 있고, 정보 또는 오류 메시지를 식별할 수도 있습니다.
명령 인터프리터에서는 명령 프로시저의 각 명령을 수행한 후 조건 코드를 검사합니다. 특별한 동작이 요구되는 오류가 발생했으면 시스템에서 그 동작을 수행합니다. 그렇지 않을 경우 프로시저의 다음 명령이 실행됩니다.
조건 코드 표시($STATUS)
명령 인터프리터에서는 조건 코드를 32비트 긴 단어로 예약된 글로벌 기호 $STATUS에 저장합니다. $STATUS 기호는 다음과 같은 시스템 메시지 코드의 형식을 따릅니다.
비트 0-2에는 메시지의 심각도 수준이 포함됩니다.
비트 3-15에는 메시지 번호가 포함됩니다.
비트 16-27에는 메시지를 생성한 기능에 관련된 번호가 포함됩니다.
비트 28-31에는 내부 제어 플래그가 포함됩니다.
명령이 성공적으로 완료되면 $STATUS는 홀수 값을 갖습니다. 비트 0-2에는 1 또는 3이 포함됩니다. 어떤 유형의 경고나 오류가 발생하든 간에 $STATUS에는 짝수 값이 포함됩니다. 비트 0-2에는 0, 2 또는4가 포함됩니다. 명령 인터프리터에서는 $STATUS의 현재 16진수 값을 유지하고 표시합니다. SHOW SYMBOL $STATUS 명령을 입력하여 $STATUS의 ASCII 변환을 표시할 수 있습니다.
다음 보기에서는 파일 이름(%FRED.LIS)이 잘못 입력되었습니다.
$ CREATE %FILE.LIS
%CREATE-E-OPENOUT, error opening %FRED.LIS; as output
-RMS-F-WLD, invalid wildcard operation
$ SHOW SYMBOL $STATUS
$STATUS = " %X109110A2"
$ WRITE SYS$OUTPUT F$MESSAGE(%X109110A2)
%CREATE-E-OPENOUT, error opening !AS as output
조건 코드와 EXIT 명령
명령 프로시저가 종료되면 명령 인터프리터에서 $STATUS의 이전 명령에 대한 조건 코드를 반환합니다. 조건 코드는 최신 명령이 성공적으로 실행되었는지 여부에 대한 정보를 제공합니다.
명령 프로시저에서 EXIT 명령을 사용하면 DCL이 $STATUS에 할당한 값을 무시하는 값을 지정할 수 있습니다. 상태 코드라고 하는 이 값은 정수 식으로 지정되어야 합니다.
명령 프로시저에 여러 명령 수준을 만들기 위한 중첩된 프로시저가 들어 있을 때는 EXIT 명령을 사용하여 기본 조건 코드를 명시적으로 무시하는 값을 반환할 수 있습니다.
다음 두 명령 프로시저를 검사합니다.
$! This is file A.COM
$!
$ @B
.
.
.
$! This is file B.COM
$!
$ ON WARNING THEN GOTO ERROR
.
.
.
$ ERROR:
$ EXIT 1
B.COM의 ON 명령은 B.COM이 실행 중일 때 경고, 오류 또는 심각한 오류가 발생할 경우 프로시저가 ERROR 레이블로 지정된다는 것을 의미합니다. 여기서 조건 코드는 성공을 나타내는 1로 명시적으로 설정됩니다. 따라서 B.COM이 종료되면 오류의 발생 여부에 관계 없이 성공 코드를 A.COM으로 다시 전달합니다.
보안 수준 결정
$STATUS의 최하위 세 비트는 명령을 종료시키는 조건의 심각도를 나타냅니다. 조건 코드의 이 부분은 예약된 글로벌 기호인 $SEVERITY에 들어 있습니다. $SEVERITY 기호에는 각각 다음 보안 수준 중 하나를 나타내는 0부터 4까지의 값이 있을 수 있습니다.
표 13-18
값
심각도
0
경고
1
성공
2
오류
3
정보
4
치명적(심각한) 오류

성공과 정보 코드는 홀수 값을 가지며, 경고와 오류 코드는 짝수 값을 갖습니다.
성공적인 완료 테스트
$SEVERITY 또는 $STATUS에 대한 논리 테스트를 수행하는 IF 명령을 사용하여 명령의 성공적인 완료를 다음과 같이 테스트할 수 있습니다.
$ IF $SEVERITY THEN GOTO OKAY
$ IF $STATUS THEN GOTO OKAY
이러한 IF 명령은 $SEVERITY와 $STATUS의 값이 참(홀수)일 경우 OKAY 레이블로 분기됩니다. $SEVERITY와 $STATUS의 현재 값이 홀수이면 명령 또는 프로그램이 성공적으로 완료된 것입니다. 명령 또는 프로그램이 성공적으로 완료되지 않았으면 $SEVERITY와 $STATUS는 짝수입니다. 따라서 IF 식은 거짓입니다.
조건이 참인지를 테스트하는 대신, 거짓인지 여부를 테스트할 수 있습니다. 예를 들면 다음과 같습니다.
$ IF .NOT. $STATUS THEN ...
명령 인터프리터에서는 조건 코드의 심각도 수준을 사용하여 기타 오류 처리 방법에 설명된 대로 ON 명령에 의해 정의된 동작을 수행할지 여부를 결정할 수 있습니다.
$STATUS를 설정하지 않는 명령 사용
대부분의 DCL 명령은 컴파일을 할 때 상태 값과 오류 메시지를 생성하는 시스템 유틸리티를 호출합니다. 그러나 성공적으로 완료되어도 $STATUS와 $SEVERITY 값을 변경하지 않는 명령이 몇 가지 있습니다. 이러한 명령은 다음과 같습니다.
표 13-19
CONTINUE
DECK
DEPOSIT
EOD
EXAMINE
GOTO
IF
RECALL
SET SYMBOL/SCOPE
SHOW STATUS
SHOW SYMBOL
STOP
WAIT

이러한 명령들 중 하나로 인해 성공하지 못한 상태가 초래되면 조건 코드가 $STATUS에 넣어지고 심각도 수준이 $SEVERITY에 넣어집니다.
로그인 명령 프로시저
로그인 명령 프로시저는 사용자가 로그인할 때마다 운영 체제에서 자동으로 실행되는 명령 프로시저입니다. 시스템에서는 사용자가 제출하는 모든 일괄 처리 작업의 시작 부분에서도 이 프로시저를 실행합니다.
로그인 명령 프로시저에는 두 가지 유형이 있습니다.
시스템(또는 그룹 정의)
개인
시스템 로그인 명령 프로시저
시스템 로그인 명령 프로시저에는 다음과 같은 특성이 있습니다.
개인 로그인 명령 프로시저보다 먼저 실행됩니다.
시스템 로그인 명령 프로시저가 종료되면 로그인 명령 프로시저로 제어가 넘어갑니다.
사용자가 로그인할 때면 항상 특정 명령이 실행되도록 시스템 관리자가 지정할 수 있습니다.
시스템 로그인 명령 프로시저를 설정하려면 시스템 관리자가 해당 로그인 명령 프로시저에 논리 이름 SYS$SYLOGIN을 일치시켜야 합니다. 시스템 관리자는 로그인 명령 프로시저가 모든 시스템 사용자 또는 특정 그룹의 사용자들에 대해 사용되도록 지정할 수 있습니다.
개인 로그인 명령 프로시저
개인 로그인 명령 프로시저를 만들어서 로그인할 때마다 동일한 명령을 실행할 수 있습니다.
로그인 명령 프로시저에 대한 파일 지정은 시스템 관리자가 할당합니다. 대부분의 설치에서 로그인 명령 프로시저는 LOGIN.COM이라고 합니다. 따라서 시스템 관리자가 다른 사항을 지시하지 않았다면 로그인 명령 프로시저 이름을 LOGIN.COM으로 지정하십시오.
다음은 LOGIN.COM 프로시저의 보기입니다.
$IF F$MODE() .NES. "INTERACTIVE" THEN EXIT
$SET TERMINAL/INSERT
$DIR :== DIR/DATE/SIZE
$EDIT :== EDIT/EDT
$EXIT
전용 계정의 로그인 명령 프로시저
시스템 관리자는 사용자 계정에 대한 LGICMD 필드에 특수 명령 프로시저의 이름을 지정하여 전용 계정을 설정할 수 있습니다. 전용 계정으로 로그인할 경우, 사용자는 자신의 계정에 대한 명령 프로시저에 지정된 기능만 수행할 수 있습니다. 전체 DCL 명령 집합은 사용할 수 없습니다. 전용 계정에 대한 자세한 내용은 OpenVMS System Manager's Manual을 참조하십시오.
확장 파일 지정 및 구문 분석 스타일
특정 파일 이름 구문 분석 스타일이 필요한 명령 프로시저에는 스타일을 전환하는 명령이 프로시저 안에 포함될 수 있습니다. 다음 명령 프로시저에서는 현재의 구문 분석 스타일을 저장하고, 구문 분석 스타일을 TRADITIONAL로 설정하고(지정되지 않은), 명령을 수행한 다음, 저장된 구문 분석 스타일을 복원합니다.
$ original_style= f$getjpi("","parse_style_perm")
$ SET PROCESS/PARSE_STYLE=TRADITIONAL
.
.
.
$ SET PROCESS/PARSE_STYLE='original_style'
첫 번째 명령은 'original_style'을 현재 구문 분석 스타일과 일치시킵니다. 두 번째 명령은 구문 분석 스타일을 TRADITIONAL로 설정합니다. 마지막 명령은 구문 분석 스타일을 원래 스타일로 설정합니다.
DCL 명령 매개 변수에 확장 파일 이름 사용
파일 이름을 매개 변수로 사용하는 명령 프로시저는 ODS-5 환경에서 여러 가지 결과를 만들 수 있습니다.
구문 문석 스타일을 TRADITIONAL에서 EXTENDED로 전환할 수 있습니다. 이 절에서는 구문 분석 스타일을 이렇게 전환하도록 선택할 경우 영향을 받을 수 있는 다음 영역들에 대해 설명합니다.
명령 프로시저 파일 지정
대/소문자 보존 및 $FILE
앰퍼샌드 및 어포스트로피 대체
구문 분석 스타일 간의 전환에 대한 자세한 내용은 DCL의 확장 파일 지정 방법 분석 기능 사용을 참조하십시오.
명령 프로시저 파일 지정
간접적인 명령 프로시저가 사용될 경우, 일부 프로시저 인수를 인용 부호로 묶어야 할 수도 있습니다.
다음 보기에서는 동일한 명령 파일인 SS.COM 사용 시 TRADITIONAL과 EXTENDED 구문 분석 스타일 간의 출력 차이점을 보여 줍니다.
$ create ss.com
$ if p1 .nes. "" then write sys$output "p1 = ",p1
$ if p2 .nes. "" then write sys$output "p2 = ",p2
$ if p3 .nes. "" then write sys$output "p3 = ",p3
구문 분석 스타일을 TRADITIONAL로 설정하고 SS.COM을 실행하면 다음과 같은 출력이 만들어집니다.
$ set process/parse_style=traditional
$ @ss ^ parg2 parg3
p1 = ^
p2 = PARG2
p3 = PARG3
악센트 기호(^)가 첫 번째 인수이고(이스케이프 문자 아님), p2와 p3 프로시저 인수에 대해서는 대/소문자가 보존되지 않는 것에 주의하십시오.
구문 분석 스타일을 EXTENDED로 설정하면 동일한 명령 프로시저를 실행할 때 다음과 같은 출력이 만들어집니다.
$ set process/parse_style=extended
$ @ss ^ parg2 parg3
p1 = ^ PARG2
p2 = PARG3
명령 프로시저에서는 공백을 인수 분리자가 아니라 리터럴 문자로 식별하는 이스케이프 문자로 악센트 기호(^)를 인식하며, ^ PARG2”가 첫 번째 인수라는 것에 주의하십시오. 대/소문자는 보존되지 않습니다.
악센트 기호(^)에 인용 부호를 추가하면 다음과 같은 결과가 만들어집니다.
$ @ss "^" parg2 parg3
p1 = ^
p2 = PARG2
p3 = PARG3
악센트 기호(^)는 인용된 문자열 안에 있으므로 이스케이프 문자로 처리되지 않습니다.
p3 인수에 인용 부호를 추가하면 다음과 같은 결과가 만들어집니다.
$ @ss "^" parg2 "parg3"
p1 = ^
p2 = PARG2
p3 = parg3
p3 프로시저 인수에 대해서는 대/소문자가 보존됩니다.
구문 분석 스타일이 TRADITIONAL로 설정될 경우, 다음 명령에서는 악센트 기호(^)와 parg2, parg3 문자열을 프로시저 인수로 처리하며, 명령 프로시저에서는 다음과 같은 결과가 만들어집니다.
$ set process/parse_style=traditional
$ @ss^ parg2 parg3
p1 = ^
p2 = PARG2
p3 = PARG3
구문 분석 스타일이 EXTENDED로 설정될 경우, 악센트 기호(^)는 공백을 리터럴 문자로 식별하는 이스케이프 문자로 처리됩니다. DCL은 SS^_PARG2.COM” 파일을 찾고 다음 보기에 표시된 오류를 만듭니다.
$ set process/parse_style=extended
$ @ss^ parg2 parg3
-RMS-E-FNF, file not found
대/소문자 보존 및 $FILE
DCL은 파일 지정의 대/소문자 보존을 시도합니다. CDU(Command Definition Utility)로 정의된 명령에 대해서만 이러한 시도를 할 수 있습니다. DCL은 $FILE 구문 분석 유형을 사용하여 명령 정의 파일(.CLD)에 정의된 모든 항목에 대한 대/소문자를 보존합니다.
자세한 내용은 OpenVMS Command Definition, Librarian, and Message Utilities를 참조하십시오.
앰퍼샌드 및 어포스트로피 대체
어포스트로피 대체와는 반대로, 앰퍼샌드(&) 대체를 사용하면 TRADITIONAL 구문 분석 중에 대/소문자를 보존할 수 있습니다.
다음 TRADITIONAL 구문 분석 보기에서는 문자열의 대/소문자를 변경하는 일련의 명령을 보여 줍니다.
$ set process/parse_style=traditional
$ x = "string"
$ define y 'x'
$ sho log y
"Y" = "STRING" (LNM$PROCESS_TABLE)
$ define y &x
%DCL-I-SUPERSEDE, previous value of Y has been superseded
$ sho log y
"Y" = "string" (LNM$PROCESS_TABLE)
앰퍼샌드(&) 사용으로 인해 x 변수에 할당된 문자열의 대/소문자가 보존된 것에 주의하십시오.
어포스트로피 대체는 명령행이 대문자로 설정되기 전에 이루어지며, 앰퍼샌드 대체는 명령행이 대문자로 설정된 후에 이루어집니다.
다음 확장 구문 분석 보기에서는 일련의 동일한 명령을 보여 줍니다.
$ set process/parse_style=extended
$ define y 'x'
%DCL-I-SUPERSEDE, previous value of Y has been superseded
$ sho log y
"Y" = "string" (LNM$PROCESS_TABLE)
$ define y &x
%DCL-I-SUPERSEDE, previous value of Y has been superseded
$ sho log y
"Y" = "string" (LNM$PROCESS_TABLE)
y 변수에 대한 두 문자열은 모두 소문자로 반환됩니다. 이것은 DEFINE 명령이 대/소문자를 보존하는 $FILE을 사용하기 때문입니다.
따라서 구문 분석 스타일이 TRADITIONAL로 설정되어 있더라도 다음 보기에 나오는 것처럼 앰퍼샌드 대체를 사용하여 EXTENDED 파일 이름을 지정할 수 있습니다.
$ set process/parse=extended
$ cre file^ name.doc
Contents of an ODS5 file
Exit

$ set process/parse=traditional
$ a = "file^ name.doc"
$ type file^ name.doc
%DCL-W-PARMDEL, invalid parameter delimiter - check use of special characters \^NAME\
$ type 'a'
%DCL-W-PARMDEL, invalid parameter delimiter - check use of special characters \^NAME\
$ type &a
Contents of an ODS5 file
주) 외부 명령에 대해서는 앰퍼샌드 대체가 작동하지 않습니다.

TOC PREV NEXT INDEX