`test`와`[`-다른 바이너리, 차이점이 있습니까?


13

또 다른 질문에 대답하면서 나는 발견 test하고 [다른 바이너리됩니다,하지만 [맨 위로 끌어 test'들. 결말에 대한 요구 사항 외에 ]차이점이 있습니까? 그렇지 않다면 왜 심볼릭 링크가 아닌 별도의 바이너리가 있습니까? (또한 bash내장되어 있으며 bash차이점도 표시되지 않습니다.)

답변:


4

소스 코드 가 처리하는 방법 인 것으로 차이에 대해 설명 --help옵션을 선택합니다.

  /* Recognize --help or --version, but only when invoked in the
     "[" form, when the last argument is not "]".  Use direct
     parsing, rather than parse_long_options, to avoid accepting
     abbreviations.  POSIX allows "[ --help" and "[ --version" to
     have the usual GNU behavior, but it requires "test --help"
     and "test --version" to exit silently with status 0.  */

시연

$ /usr/bin/test --help
$
$ /usr/bin/[ --help
Usage: test EXPRESSION
  or:  test
  or:  [ EXPRESSION ]
  or:  [ ]
  or:  [ OPTION
Exit with the status determined by EXPRESSION.
[...]

에서 bash내장 버전, 유일한 차이점은입니다 [필요 ]당신이 말한대로, 마지막에.


1
흥미롭지 만 대부분의 프로그램은 심볼릭 링크를 사용하여 동일한 동작을 수행합니다.
케빈

1
그들은 내 시스템에서 동일한 inode에 대한 하드 링크입니다. 심볼릭 링크에 대한 이점은 심볼릭 링크 대상이 제거되거나 이동되면 심볼릭 링크가 더 이상 작동하지 않는다는 것입니다. inode에 대한 하드 링크 중 하나가 이동되거나 제거되면 모든 하드 링크가 계속 작동합니다.
앤드류 메디 코

5

일반적으로 하드 링크가있는 동일한 바이너리입니다. 쉘에 따라 바이너리 대신 내부 구현을 사용 test하고 [테스트 할 수 있습니다 . 이는 프로세스 생성 측면에서 더 효율적이며 이진 프로그램이 test제공 하는 옵션과 다른 옵션을 제공 할 수 있습니다 .

통화 형식의 차이점 외에도 둘 다 동일한 기능을 제공합니다.


7
놀랍게도 데비안의 coreutils에서 그들은 같은 바이너리가 아닙니다. 동일한 소스는 PROGRAM_NAME을 "test"로 정의하고 다른 소스를 "["로 정의하고 추가 코드를 사용하여 표현식이 "]"로 끝나는지를 테스트하는 두 번 컴파일됩니다. o_O
angus

3
@angus 이것의 또 다른 예는 ls / dir / vdir입니다. Coreutils는 런타임에 argv [0]을 테스트하는 대신 다른 하드 코딩 된 바이너리를 빌드하는 것 같습니다.
Random832
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.