# "테스트, [, 그리고 [[ (2020)" - 기술명칭 유지

> Clean Markdown view of GeekNews topic #12002. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=12002](https://news.hada.io/topic?id=12002)
- GeekNews Markdown: [https://news.hada.io/topic/12002.md](https://news.hada.io/topic/12002.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2023-11-24T09:58:20+09:00
- Updated: 2023-11-24T09:58:20+09:00
- Original source: [jmmv.dev](https://jmmv.dev/2020/03/test-bracket.html)
- Points: 3
- Comments: 1

## Topic Body

### 유닉스 시스템의 흥미로운 이진 파일

- 유닉스 시스템에는 이름이 단일 기호인 이진 파일이 존재함.
- `/bin/[` 명령어를 실행하면 `[`라는 이름의 프로그램을 확인할 수 있음.
- `[`와 `test`는 같은 이진 파일을 가리키며, 두 명령어는 실제로 동일한 기능을 수행함.

### `test` 프로그램과 `[`의 사용

- `test` 프로그램은 쉘에서 표현식을 평가하는 데 사용됨.
- 문자열 비교, 숫자 비교, 파일 조건 확인 등을 위해 사용됨.
- `test`는 인자를 받아 표현식을 평가하고, 참이면 0을, 거짓이면 1을 반환함.

### 두 명령어의 존재 이유

- `test`와 `[` 두 명령어가 존재하는 이유는 명확하지 않으나, 가독성을 높이기 위한 것으로 추측됨.
- `[` 명령어를 사용하면 `test`보다 더 깔끔하게 조건문을 표현할 수 있음.
- `[`를 사용할 때는 명령어의 마지막 인자가 `]`로 끝나야 함.

### 내장 명령어와 외부 이진 파일의 차이

- `test`와 `[`는 쉘 스크립트에서 자주 사용되기 때문에 대부분의 쉘에서 내장 명령어로 구현됨.
- 내장 명령어와 외부 이진 파일을 사용할 때 다른 동작을 보일 수 있으며, 쉘에 따라서도 차이가 발생할 수 있음.

### `[[`의 사용과 차이점

- `[[`는 Bash 확장으로 `[`의 사용을 대체함.
- `[[`는 내장 명령어로서 표현식 내에서 언어의 기본 규칙을 변경할 수 있음.
- `[[`는 문자열 비교 시 글로브 패턴을 리터럴로 취급하여 다른 결과를 낼 수 있음.

### 쉘 스크립트 작성 시 선택

- 이식성 있는 쉘 스크립트를 작성할 때는 `[`를 사용하는 것이 좋음.
- Bash 전용 스크립트를 작성한다면 `[[`를 사용하는 것이 더 많은 기능을 제공함.

### 쉘 표현식과 `test` 표현식의 결합

- 쉘은 `!`, `&&`, `||` 연산자를 통해 자체 표현식을 가짐.
- `test` 표현식과 쉘 표현식을 하나의 명령어로 결합할 수 있음.

### GN⁺의 의견

이 글에서 가장 중요한 점은 유닉스 시스템에서 `[`와 `test`가 같은 기능을 수행하는 두 가지 다른 명령어로 존재한다는 것이며, 이는 쉘 스크립트의 가독성과 효율성을 높이기 위한 것으로 추측된다. 이러한 정보는 초급 소프트웨어 엔지니어들이 쉘 스크립트를 작성하거나 이해할 때 유용하게 활용될 수 있으며, 쉘 스크립트의 작동 원리와 다양한 쉘 간의 차이점을 이해하는 데 도움이 될 것이다. 이 글이 흥미로운 이유는 쉘 스크립트의 기본적인 도구들이 어떻게 다양한 형태로 사용될 수 있는지를 보여주며, 쉘 프로그래밍의 복잡성과 유연성을 잘 드러내기 때문이다.

## Comments



### Comment 20860

- Author: neo
- Created: 2023-11-24T09:58:20+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=38387464) 
- 원 저자의 감사 인사 및 제목 수정 제안
  > 원 저자가 글이 인기를 얻어서 감사하다는 인사를 전하며, 제목에 연도를 추가하고 "test" 단어의 대문자 사용을 지양할 것을 제안함. "test"가 실제 명령어를 의미하기 때문임.

- Bourne 쉘의 "test" 명령어 역사와 개인적 선호
  > Bourne 쉘이 IDE가 없던 시절에 만들어져 괄호나 대괄호 없이 "test" 명령어가 사용됐음을 설명. 개인적으로는 대괄호 형식보다 "test" 형식을 선호한다고 함.

- `if` 블록을 사용하지 않는 조건문의 예시
  > `if` 블록 없이 조건문을 간단하게 작성하는 방법을 소개하며, 디버그 출력을 조건부로 stderr에 출력하는 예시를 제시함.

- `if` 블록과 일반 명령어의 결합 사용법
  > `if` 블록이 일반 명령어를 테스트할 수 있음을 보여주며, 예를 들어 `grep` 명령어를 사용한 로그 검색의 예시를 듦.

- `test` 명령어의 논리 연산 사용에 대한 고민
  > `test` 명령어 내에서 논리 연산을 사용할지 별도의 조건문을 사용할지에 대한 고민을 표현함. 성능 문제가 없다면 양쪽 모두에 대해 타당한 이유가 있다고 함.

- "test" 명령어 사용의 이점과 "man test"의 편리함
  > 몇 년 전부터 대괄호를 사용하지 않고 "test" 명령어를 사용하는 것이 좋다고 주장함. 이는 "test"가 단순한 명령어임을 강조하고, "man test"를 사용하는 것이 "man bash"를 찾는 것보다 편리함을 설명함.

- `[`와 `test`의 단일 인자 동작에 대한 주의
  > 변수가 비어 있지 않은지 확인할 때 변수를 따옴표로 감싸지 않으면 예상치 못한 결과를 초래할 수 있음을 경고함. 변수를 따옴표로 감싸야 한다고 강조함.

- 리눅스와 NetBSD에서 `/bin/[`와 `/bin/test`의 차이점
  > 리눅스에서는 `/bin/[`와 `/bin/test`가 다르지만 NetBSD에서는 같다는 사실을 공유함.

- `test`/`[`/`[[`에 대한 더 깊은 탐구와 쉘의 이상한 점들에 대한 블로그 링크 공유
  > `test`, `[`, `[[`에 대한 더 깊은 이해를 돕는 문서와 쉘의 다양한 특징을 설명하는 블로그 링크를 공유함.

- `[[`가 bash 전용임을 지적하고, bash 사용이 확실하다면 `[[`를 사용할 것을 권장
  > `[[`가 bash 전용 명령어임을 언급하며, bash를 사용할 때는 `[[`를 사용하는 것이 좋다고 조언함.

- `[`가 bash 스크립팅 언어의 일부가 아니라는 인식에 대한 혼란
  > `[`가 bash 스크립팅 언어의 일부가 아니라 단순한 프로그램임을 이해하는 데 혼란이 있었음을 표현하고, 이에 대한 설명을 요청함.

- 쉘에 대한 강한 의견과 `[` 사용에 대한 반대
  > `[`를 사용하지 말고 "test"만 사용해야 한다는 강한 의견을 표현함. `[`가 언어의 문법처럼 보이지만 실제로는 프로그램이라는 점을 강조하며, 문자열 평가에는 `case` 문을 사용해야 한다고 주장함.
