unknown — 존재하지 않는 명령어 사용 처리하기

unknown — 존재하지 않는 명령어 사용 처리하기

Tcl 스크립트에서 존재하지 않는 명령어를 호출하면 어떻게 될까요? 바로 오류만 나진 않고, unknown이라는 특별한 후킹 절차가 개입해요. 이 명령어 덕분에 자동 로딩이라든가 명령어 이름 축약 확장 같은 편의 기능이 동작하는 거예요. 기본 구현을 바꾸거나 네임스페이스별로 다른 핸들러를 등록할 수도 있어서, 확장성이 아주 넓은 명령어예요.

출처: 문서

본문

문법

unknown cmdName ?arg arg ...?

이 명령어는 스크립트가 존재하지 않는 명령어를 호출하려 할 때마다 Tcl 인터프리터가 호출해요. 기본 unknown 구현은 Tcl이 인터프리터를 초기화할 때 정의하는 라이브러리 프로시저예요. 기본 unknown을 오버라이드해 기능을 바꿀 수도 있고, namespace unknown 명령어로 개별 네임스페이스에 새 핸들러를 등록할 수도 있어요. 단, safe 인터프리터에는 기본 unknown 구현이 없다는 점을 유의하세요.

Tcl 인터프리터가 (현재 네임스페이스나 전역 네임스페이스 어디에도) 정의되지 않은 명령어 이름을 만나면, Tcl은 현재 네임스페이스의 unknown 핸들러가 존재하는지 확인해요. 기본적으로 이 핸들러는 ::unknown이라는 명령어예요. 그런 명령어가 없으면 인터프리터는 오류를 반환해요.

unknown 명령어가 존재하거나(또는 현재 네임스페이스에 새 핸들러가 등록돼 있으면), 그것은 완전히 치환된 이름과 원래 존재하지 않던 명령어의 인자들로 구성된 인자와 함께 호출돼요.

unknown 명령어는 대개 이런 일들을 해요. cmdName이라는 이름의 명령어 프로시저를 라이브러리 디렉토리에서 찾거나, 축약된 명령어 이름을 전체 길이로 확장하거나, 알 수 없는 명령어를 자동으로 하위 프로세스로 실행하는 식이죠. 어떤 경우(예: 축약 확장)에는 unknown이 원래 명령어를 살짝 바꾼 뒤 (다시) 실행해요. unknown 명령어의 결과는 원래 존재하지 않던 명령어의 결과로 사용돼요.

기본 구현이 동작하는 순서

기본 unknown 구현은 다음과 같이 동작해요.

  1. 먼저 auto_load 라이브러리 프로시저를 호출해 명령어를 로드해요. 성공하면 원래 인자로 원래 명령어를 실행해요.
  2. 자동 로드가 실패하고 Tcl이 대화형으로 실행 중이면, unknownauto_execok을 호출해 cmd라는 이름의 실행 파일이 있는지 확인해요. 있으면 cmd와 모든 인자를 인자로 하여 Tcl exec 명령어를 호출해요.
  3. cmd를 자동 실행할 수 없으면, unknown은 명령어가 최상위에서, 어떤 스크립트 바깥에서 호출됐는지 확인해요. 그렇다면 두 가지 단계를 더 거쳐요.
  4. 먼저 cmd!!, !event, ^old^new?^? 중 한 형태인지 확인해요. 그렇다면 unknown은 csh이 이런 구성을 처리하는 것과 같은 방식으로 히스토리 치환을 수행해요.
  5. 마지막으로 unknowncmd가 기존 Tcl 명령어의 유일한 축약인지 확인해요. 그렇다면 명령어 이름을 확장해 원래 인자로 그 명령어를 실행해요.

위 어느 시도로도 명령어를 실행할 수 없으면, unknown은 오류 반환을 생성해요.

전역 변수 auto_noload가 정의돼 있으면 자동 로드 단계는 건너뛰고, 전역 변수 auto_noexec가 정의돼 있으면 자동 실행 단계를 건너뛰어요. 정상적인 상황에서 unknown의 반환값은 결국 실행된 명령어의 반환값이 돼요.

예제

명령어를 찾지 못했다는 사실을 먼저 로그로 남기는 것 말고는 기본 동작을 그대로 유지하려면:

# 원본을 저장해 두고 체인으로 연결
rename unknown _original_unknown

# 우리만의 구현 제공
proc unknown args {
    puts stderr "WARNING: unknown command: $args"
    uplevel 1 [list _original_unknown {*}$args]
}

더 알아보기

  • info, proc, interp, library, namespace — 명령어·인터프리터 관련 명령어
  • 관련 키워드: error, non-existent command, unknown