명령줄 완성

[right|섬네일|402px|[배시 (유닉스 셸)|배시에서의 명령줄 완성 예시]]
[right|섬네일|402px|[인텔리센스가 포함된 파워셸에서의 명령줄 완성 예시]]
**명령줄 완성**(, 또는 **탭 완성**())은 명령줄 인터페이스의 일반적인 기능으로, 프로그램이 부분적으로 입력된 명령어를 자동으로 채워주는 기능이다.

명령줄 인터페이스는 사용자가 그래픽 사용자 인터페이스(GUI)에서 마우스를 가리키고 클릭하는 것과 대조적으로, 명령줄 인터페이스(CLI)를 사용하여 명령 프롬프트에 명령어를 입력함으로써 기저의 운영 체제와 상호작용할 수 있게 해주는 프로그램이다. 명령줄 완성을 통해 사용자는 명령어, 프로그램 또는 파일 이름의 처음 몇 글자를 입력하고 완성 키(일반적으로 )를 눌러 항목의 나머지 부분을 채울 수 있다. 그런 다음 사용자는  또는 를 눌러 명령어를 실행하거나 파일을 연다.

명령줄 완성은 이 문서에 첨부된 애니메이션에서 알 수 있듯이 여러 방면에서 유용하다. 자주 사용하는 명령어, 특히 이름이 긴 명령어는 더 적은 키 입력으로 실행할 수 있다. 파일 이름이 길거나 철자가 어려운 명령어는 처음 몇 글자를 입력하고 완성 키를 누르면 명령어 또는 파일 이름이 완성된다. 여러 개의 완성이 가능한 경우, 일부 명령줄 인터페이스(특히 유닉스 셸)는 해당 글자로 시작하는 모든 가능한 완성 목록을 나열한다. 사용자가 더 많은 글자를 입력하고 다시 을 누르면 입력된 글자가 여전히 모호한 경우 좁혀진 새 목록을 보여주거나, 그렇지 않으면 뒤에 공백을 붙여 명령어/파일 이름을 완성한다. 대체 형태의 완성 방식은 입력이 모호할 때 일치하는 모든 결과 사이를 순환한다.

완성 가능한 요소에는 특정 인터프리터와 그 설정에 따라 명령어, 인자, 파일 이름 및 기타 엔티티가 포함될 수 있다. 명령줄 완성은 일반적으로 대화형 모드에서만 작동한다. 즉, 완성이 명확하더라도 셸 스크립트나 배치 파일 내에서 부분적으로 입력된 명령어를 완성하기 위해 호출할 수는 없다. **탭 완성**이라는 이름은 명령줄 완성이 종종 Tab 키를 눌러 호출된다는 사실에서 유래했다.

## 역사
탭 완성은 컴퓨팅 역사 초기에 등장했다. 첫 번째 사례 중 하나는 SDS 940용 버클리 시분할 시스템에서 나타났는데, 입력된 문자열이 모호하면 인터프리터가 아무 작업도 수행하지 않지만, 문자열이 명확하면 사용자의 명령 없이도 자동으로 완성했다. 이 기능은 너무 빈번한 오식 문제와 잘 맞지 않아 장단점이 뚜렷했다. 이 기능은 Tenex 개발자들에 의해 모방되었는데, 그들은 중요한 변화를 주었다. Tenex는 "이스케이프 인식"을 사용했는데, 사용자가 Esc 키를 누르지 않는 한 인터프리터가 자동 완성을 시도하지 않았다. 대상 범위 또한 버클리 시스템의 프로그램 이름에서 Tenex의 프로그램 이름과 파일 모두로 확장되었다. Tenex의 후손인 TOPS-20은 명령줄 완성을 다른 사용자 애플리케이션에서도 사용할 수 있도록 COMND JSYS 시스템 호출을 통해 명령 인터프리터에서 운영 체제로 옮겼다. 거기서 유닉스로 차용되었다.

## 예시
모질라 파이어폭스를 사용하여  파일을 열려면 다음과 같이 입력해야 한다.

  firefox introduction-to-command-line-completion.html

이는 입력하기에 긴 명령어다. 대신 명령줄 완성을 사용할 수 있다.

### 프롬프트형 완성
다음 예시는 배시에서 명령줄 완성이 어떻게 작동하는지 보여준다. 다른 명령줄 셸은 약간 다르게 작동할 수 있다.

먼저 명령어의 처음 세 글자를 입력한다.

  fir

그 다음 을 누르면 시스템에서 "fir"로 시작하는 유일한 명령어가 "firefox"이므로 다음과 같이 완성된다.

  firefox

그런 다음 파일 이름을 입력하기 시작한다.

  firefox i

하지만 이번에는 현재 디렉토리에 "i"로 시작하는 파일이  하나만이 아니다. 디렉토리에는 와  파일도 포함되어 있다. 시스템은 우리가 입력하려는 파일 이름이 무엇인지 결정할 수 없지만, 파일이 "introduction-to-"로 시작해야 한다는 것은 알고 있으므로 명령어는 다음과 같이 완성된다.

  firefox introduction-to-

이제 "c"를 입력한다.

  firefox introduction-to-c

을 누르면 전체 파일 이름이 완성된다.

  firefox introduction-to-command-line-completion.html

요약하자면 다음과 같이 입력한 것이다.

  firic

이는 단 8번의 키 입력으로, 명령줄 완성을 사용하지 않았을 때 필요한 52번의 키 입력보다 훨씬 적다.

### 순환형 완성
다음 예시는 윈도우의 CMD에서 사용하는 것과 같은 순환형 완성의 작동 방식을 보여준다.

프롬프트형 완성과 동일한 절차를 따라 다음까지 입력한다.

  firefox i

을 한 번 누르면 다음과 같은 결과가 나온다.

  firefox introduction-to-bash.html

을 다시 누르면 다음과 같이 된다.

  firefox introduction-to-command-line-completion.html

요약하자면 다음과 같이 입력한 것이다.

  firi

이는 단 7번의 키 입력으로 프롬프트형 완성과 비슷하다. 이 방식은 인터프리터가 어떤 가능성들을 순환할지 알고 있을 때 가장 효과적이다.

## 다양한 명령줄 인터페이스에서의 완성
* 여러 유닉스 셸들(대부분의 리눅스 배포판 기본 셸인 배시 및 ksh 포함)은 고급스럽고 사용자 정의 가능한 완성 기능을 제공하는 오랜 전통을 가지고 있다.
** 배시의 프로그래밍 가능한 완성 기능인 `complete` 및 `compgen` 명령어는 2000년의 2.04 베타 버전부터 제공되었으며 최소한 경로명과 파일 이름 완성을 지원한다.
** 콘셸 사용자의 경우 파일 이름 완성은 EDITOR 변수의 값에 따라 달라진다. EDITOR가 vi로 설정된 경우 이름의 일부를 입력한 다음 ,를 누른다. EDITOR가 이맥스로 설정된 경우 이름의 일부를 입력한 다음 ,를 누른다.
** Z 셸 (zsh)은 완전히 프로그래밍 가능한 완성을 지원하여 사용자가 셸 자체와 관련 없는 다양한 명령어의 매개변수를 자동으로 완성할 수 있게 했으며, 이는 알려진 모든 스위치 정의와 적절한 매개변수 유형을 셸에 미리 준비시킴으로써 수행된다. 이를 통해 사용자는 예를 들어 을 입력했을 때 실제 파일 시스템에서 압축된 gzip 아카이브만 완성하고 입력 매개변수와 호환되지 않는 파일은 건너뛸 수 있다. 현대적인 zsh 설치본에는 500개 이상의 명령어에 대한 완성 정의가 포함되어 있다.
** Tcsh는 을 사용하여 활성화되는 기본 파일, 명령어 및 변수 이름 완성을 제공한다. 'complete' 내장 명령은 완전히 프로그래밍 가능한 완성을 제공한다. 소스 코드에는 완성 구문의 많은 예시가 포함된 'complete.tcsh' 파일이 함께 제공된다.
* 마이크로소프트의 확장 가능한 명령 셸인 파워셸은 객체 지향 프로그래밍과 마이크로소프트 .NET 프레임워크를 기반으로 하며, 전통적인 유닉스 셸과 유사한 강력하고 사용자 정의 가능한 완성 기능을 제공한다.
* 윈도우 NT 기반 시스템의  명령 프로세서는 기본적인 완성을 지원한다. 디렉토리 이름만 일치시키기 위해 별도의 키 바인딩을 사용할 수 있다.
* 은 파일 및 디렉토리 이름 완성 문자(기본값은 ^F 및 ^D)를 활성화한다. 자세한 내용은 를 참조하라.
* TweakUI를 사용하여 파일 이름 및 디렉토리 이름 완성에 사용되는 키를 설정할 수 있다.
* MS-DOS 명령 프로세서인 에는 명령줄 완성 기능이 없었다. 탭 키를 누르면 커서만 앞으로 이동했다. 그러나 4DOS, 의 프리도스 버전 또는 향상된 DOSKEY.COM 기능과 같은 MS-DOS용의 다양한 강화된 셸은 유닉스 스타일의 탭 완성을 특징으로 한다.
* Far Manager는 파일 관리 기능 외에도 윈도우용 명령 기록 및 줄 완성을 제공한다.

## 같이 보기
* 자동 완성
* 명령줄 인터페이스
* 명령 셸 비교
* 셸

## 각주

## 외부 링크
### 유닉스 셸
* A Bash completion overview - "Working more productively with bash  2.x/3.x" by Ian Macdonald
* The zsh completion system, chapter from the Z Shell Manual
* Completion and listing from the TCSH Manual

### 윈도우 명령 인터프리터
*(각 문서의 "적용 대상" 섹션을 확인하십시오)*
* Windows Server 2003:
*#Directory name completion
*#Filename completion
* Windows XP
* Windows 2000/NT 4

분류:사용자 인터페이스 기술