bash에서 대괄호와 테스트 명령의 차이점은 무엇입니까?

bash에서 대괄호와 테스트 명령의 차이점은 무엇입니까?

단일 대괄호 [test명령은 bash 쉘에 내장되어 있습니다.

대괄호 [test명령이 동일한 기능을 갖는다면 왜 두 개의 별도 명령이 있습니까?

답변1

[그리고 test같은 명령입니다. 단지, [마지막 매개변수가 될 것으로 예상하세요 ](그렇지 않으면 무시됩니다).

[명령은 test일반적으로 동일한 바이너리로 구현됩니다. Bourne과 같은 대부분의 쉘 fish에는 . C 쉘이나 그 파생물은 그렇지 않습니다. C 셸에는 일반적으로 /utils에서 수행되는 일부 작업을 수행하기 위한 특수 구조가 있습니다 .[testrctest[

test명령은 당시 새로운 Bourne 셸과 함께 1970년대 후반 Unix V7에 등장했습니다. 이전 버전에는 명령이 없었고 test해당 쉘이 구성되지 않았습니다 if. 하지만 하나 있어요독립 if명령동일한 테스트 중 일부를 수행 test하고 결과에 따라 명령을 실행할 수 있습니다.

Bourne 쉘에는 몇 가지 제어문( if// )이 도입되었기 때문에 while이러한 명령문의 조건부 부분에 사용하여 다양한 테스트를 수행할 수 있는 명령이 있도록 이를 보완하기 위해 도입되었습니다.untiltest

V7에는 명령이 없지만 [몇 가지 명령을 찾을 수 있습니다.다듬지 않은 코드를 주석 처리하세요.거기에는 내장되어 있는데 [, 이는 그들이 그것을 구상했지만 sh아마도 당시에는 코드를 망치지 않기로 결정했을 것임을 암시합니다.

[testBourne 쉘에 내장 기능을 추가합니다 .1981년 시스템 III에 진입.

그 이후의 모든 Bourne 유사 쉘에는 / 내장 기능이 bash있지만 [Almquist 쉘에는 처음부터 / 내장 기능이 있었지만(실제로 병합됨) 완전히 비활성화될 때까지 초기 BSD에서 원래 비활성화되었습니다(컴파일되지 않음). 다소 늦었습니다.test[testexpr

[와 둘 test표준 POSIX 명령. 내장될 필요는 없지만 , , 등에서 실행 가능해야 하므로 env독립 실행형 실행 파일로 사용할 수 있습니다 find -exec.execvp()

독립 실행형 유틸리티를 제공하는 시스템도 있지만 하나도 제공 test되지 않습니다 [. 이는 다음을 더 자주 보게 되는 이유를 설명합니다.

find . -exec test -f {} ';'

(GNU 와 동일 find) -xtype f, 비교:

find . -exec [ -f {} ] ';'

[독립 실행형 유틸리티를 제공하지 않는 시스템에서는 이 작업이 실패합니다.

[test과 사이 의 또 다른 일화적인 차이점 test <any-string>( 과 동일 ) 은 비어 있지 않거나 반환 할 수 없는 버전 또는 그 사용법 [ <any-string> ]에 대한 유효한 테스트입니다 . 그러나 이것은 유효한 테스트가 아니므로 GNU 독립 실행형 유틸리티는 일반적인 오류 메시지 대신 버전 및 사용 정보를 별도로 받아들이고 반환 하지만 GNU는 그렇지 않습니다(참조<any-string>test --versiontest --helptest[ --version[--version--helpmissing ‘]’test2003년에 해당 제출(오해의 소지가 있는 댓글2005년에 복원됨)).

$ '/usr/bin/[' --version
[ (GNU coreutils) 8.30
[...]
$ /usr/bin/test --version && echo "--version is non-empty"
--version is non-empty
$ '/usr/bin/[' --something-else
/usr/bin/[: missing ‘]’

관련 정보