3P by neo 7달전 | favorite | 댓글 1개

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

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

test 프로그램과 [의 사용

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

두 명령어의 존재 이유

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

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

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

[[의 사용과 차이점

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

쉘 스크립트 작성 시 선택

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

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

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

GN⁺의 의견

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

Hacker News 의견
  • 원 저자의 감사 인사 및 제목 수정 제안

    원 저자가 글이 인기를 얻어서 감사하다는 인사를 전하며, 제목에 연도를 추가하고 "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 문을 사용해야 한다고 주장함.