"/bin/["은 정확히 어떻게 작동하나요?

"/bin/["은 정확히 어떻게 작동하나요?

폴더에 프로그램이 /bin있다는 사실에 늘 놀랍니다 .[

if [ something ]이와 같은 작업을 수행할 때 이를 다음과 같이 부릅니다.

[셸에서 프로그램을 명시적으로 호출하면 적절한 프로그램을 요청하고 ]닫는 괄호를 제공하면 괄호 사이에 무엇을 삽입하더라도 아무 작업도 수행하지 않는 것 같습니다.

말할 필요도 없이, 프로그램에 대한 도움을 받는 일반적인 방법은 작동하지 않습니다. 즉, 일도 아니고 man [일도 아닙니다 [ --help.

답변1

[명령의 목적은 테스트 표현식을 평가하는 것입니다. 0 종료 상태로 반환됩니다(즉,진짜) 표현식이 true 및 기타 값으로 해석될 때(이는잘못된) 그렇지 않으면.

아무것도 하지 않는 것은 아니지만 종료 상태에서 결과를 찾을 수 있습니다. 쉘에서는 $?Bourne 쉘이나 대부분의 다른 쉘(fish/rc/es/csh/tcsh...)에서처럼 $status마지막 명령의 종료 상태를 찾을 수 있습니다.

$ [ a = a ]
$ echo "$?"
0
$ [ a = b ]
$ echo "$?"
1

예를 들어 다른 언어에서는 perl종료 상태가 다음 반환 값으로 반환됩니다 system().

$ perl -le 'print system("[", "a", "=", "a", "]")'
0

모든 최신 Bourne 유사 쉘(및 fish)에는 내장 [명령이 있습니다. 일반적으로 여기에 포함된 명령은 다른 쉘을 사용하거나 위의 명령과 같은 작업을 수행하는 경우에만 실행됩니다 /bin.env [ foo = bar ]find . -exec [ -f {} ] \; -printperl

순서 [는 이름으로도 알려져 있습니다 test. as 가 호출되면 인수를 test종료할 필요가 없습니다 .]

귀하의 시스템에 매뉴얼 페이지가 없을 수도 있지만 [아마도 그럴 것입니다 . 그러나 다시 한 번 말씀드리지만, 문서화 되거나 구현 test될 것입니다 . 셸에 내장된 기능 에 대해 알아보려면 셸 설명서를 읽어야 합니다./bin/[/bin/test[

이 유틸리티의 기록과 [[...]]ksh 테스트 표현식과의 차이점에 대한 자세한 내용은 다음을 확인하세요.다른 질문과 답변은 여기를 참조하세요.

답변2

폴더에 프로그램이 /bin있다는 사실에 늘 놀랍니다 .[

당신이 놀란 것이 옳습니다. 이는 :명령 파일(이식 가능한 파일 이름 문자 집합)에 허용되는 문자 규칙을 따르지 않는 널 유틸리티( )가 있는 드문 POSIX 명령 중 하나입니다 .

if [ something ]이와 같은 작업을 수행할 때 이를 다음과 같이 부릅니다.

정확하지만 없어도 사용할 수 있습니다 if.

[셸에서 프로그램을 명시적으로 호출하면 적절한 프로그램을 요청하고 ]닫는 괄호를 제공하면 괄호 사이에 무엇을 삽입하더라도 아무 작업도 수행하지 않는 것 같습니다.

if눈에 보이는 어떤 작업도 수행하지 않지만 실제로는 Content 와 함께 사용할 때 test명령과 동일하게 작동합니다. 유일한 차이점은 엔딩을 찾는다는 것입니다 ]. 바라보다man test더 알아보기.

말할 필요도 없이, 프로그램에 대한 도움을 받는 일반적인 방법은 작동하지 않습니다. 즉, 일도 아니고 man [일도 아닙니다 [ --help.

이는 운영 체제에 따라 다릅니다. man [여러 주류 Gnu/Linux 배포판에서는 확실히 작동하지만 Solaris에서는 작동하지 않습니다.

[ --help구현에 따라 작동할 수도 있고 작동하지 않을 수도 있습니다. 어쨌든 구문이 깨지고 끝이 누락되기 때문입니다 ]. 또한,test/ [명령 에 대한 POSIX 표준--종료 옵션을 포함한 모든 옵션을 명시적으로 제외하므로 및 둘 다 반환 하고 설계상 침묵 [ --help ]해야 합니다 . 괄호 안이나 뒤에 있는 내용 과 옵션처럼 보이는 것(예: , 등)은 그렇지 않습니다.test --helptrue[-f file-n string옵션하지만피연산자.

모든 최신 Bourne 스타일 쉘 인터프리터(예: bash, ksh, dashzsh등) 는 내부적으로 test/ [utils를 내장으로 구현하므로 이를 사용할 때 참조할 올바른 매뉴얼 페이지는 아마도 쉘의 매뉴얼 페이지가 아니라 쉘의 매뉴얼 페이지일 것입니다. test.

Unix System III(1981) 이전에는 Bourne 쉘이 test이 유틸리티를 내장 프로그램으로 구현하지 않았으므로 외부 바이너리 명령을 통해서만 구현할 수 있었습니다. Unix System III 이전에는 [명령(내부 또는 내장)이 없었으므로 예를 들어 Unix 버전 7에서는 다음을 입력해야 했습니다.

if test something ; then

바꾸다:

if [ something ] ; then

답변3

[실제로 더 일반적인 것은 test명령입니다. 이 명령의 일반적인 용도는 단순히 표현식을 평가하고 해당 조건(참 또는 거짓)을 반환하는 것입니다. 아래와 같이 명령문 외부에서 쉘 이나 연산자를 통해 다른 명령을 조건부로 실행 if-then-else-fi하기 위해 명령문 외부에서 사용할 수도 있지만 명령문 내에서 자주 사용됩니다 .if&&||

$ [ -e /etc/passwd  ] && echo "File exists"
File exists

$ test -e /etc/passwd && echo "File exists"
File exists

보다 구체적으로 평가는 종료 상태를 통해 다른 명령으로 전달됩니다. 일부 프로그램은 프로그램이 성공적으로 완료되었거나 실행 중에 특정 유형의 오류가 발생했거나 구문 오류 등 다양한 유형의 이벤트를 나타내기 위해 종료 상태를 출력하도록 선택할 수 있습니다. 명령의 경우 true 또는 false를 의미하는 경우 test가 있습니다 . Stephan이 지적했듯이 구문 오류가 발생합니다 .012

그 위치는 시스템에 따라 다르며, 매뉴얼 페이지를 볼 때 왜 보이지 않는지도 설명합니다 man [. 예를 들어 FreeBSD에서는 입니다 /bin. Linux(또는 특정 경우 Ubuntu 16.04)에서는 입니다 /usr/bin/. Linux 시스템에서 이 작업을 수행하면 man [동일한 문서가 열리는 것을 볼 수 있습니다. man test또한 쉘에 자체적인 test.

또한 이 명령에는질문, 여기서 Korn 쉘(일반적으로"조건식"이중 괄호 [[ "$USER" = "root" ]]( )가 있는 참조는 해상도를 찾습니다. 이 기능은 bash및 와 같은 다른 셸에서도 사용됩니다 zsh.

답변4

[인수에 포함된 표현식이 true로 간주되면 명령은 종료 상태 0을 반환하고, 인수에 포함된 표현식이 false로 간주되면 명령은 0이 아닌 종료 상태를 반환합니다. 마지막 매개변수가 그렇지 않은 경우에도 오류 메시지와 함께 실패합니다 ](순전히 미학적 이유 때문입니다).

예를 들어:

[ hello ]
echo "Exit-status of [ hello ] is:" $?
[ abc = abc ]
echo "Exit-status of [ abc = abc ] is:" $?
[ ]
echo "Exit-status of [ ] is:" $?
[ abc = def ]
echo "Exit-status of [ abc = def ] is:" $?

...출력됩니다:

[ hello ]의 종료 상태는 0입니다.      — 비어 있지 않은 문자열은 참으로 간주되기 때문입니다.
[ abc = abc ]의 종료 상태: 0  — 'abc'는 실제로 'abc'와 동일하기 때문입니다.
[ ]의 종료 상태는 1입니다.            — 빈 문자열은 거짓으로 간주되기 때문입니다.
[ abc = def ]의 종료 상태는 1입니다.  - "abc"는 실제로 "def"와 다르기 때문입니다.

하지만,세게 때리다이러한 경우, 다른 많은 쉘은 일반적으로 /bin/[(또는 /usr/bin/[)를 호출하지 않고 대신 (순전히 성능상의 이유로) 정확히 동일한 동작으로 내장 명령을 호출합니다. /bin/[셸 내장 프록시가 아닌 프록시를 호출하려면 경로를 명시적으로 지정하거나(예: dirname 앞에 ☺ 접두사를 붙일 /bin/[ hello ]필요는 없음] ) 내장 프록시를 사용하지 않도록 셸을 구성해야 합니다( 예를 들어 enable -n [bash에서).

추신: 다른 답변에서 말했듯 [test. 와 달리 test마지막 매개변수로 [필요하지 않으며 전혀 필요하지 않습니다. 매개변수 . 동일한 파일로 구문 분석 있습니다(예: 하나는]]test/bin/test/bin/[심볼릭 링크;이 경우 행동 전달은 다음을 통해 수행될 수 있습니다.현재 호출된 명령을 분석합니다.test/ 코드 자체 내 [) 또는 다른 파일. 쉘 의 경우 경로가 명시적으로 지정되거나( ) 그렇게 하지 않도록 구성되지 않는 한( ) test쉘은 일반적으로 내장 프록시도 호출합니다./bin/testenable -n test

PPS: test및 와 달리 [현대는 if실제로 문서가 아니었습니다. 이는 쉘 구문의 일부입니다(예: bash): ( if commandA; then commandB; fi세미콜론 대신 줄 바꿈을 사용할 수 있습니다) 상태가 0인 상태로 종료된 commandB경우에만 실행됩니다. commandA이는 test또는 의 동작 과 완벽하게 일치하며 [이를 결합할 수 있습니다 if [ "$a" = foo ]; then …; fi (또는 if test "$a" = foo; then …; fi읽기가 덜 가독성이 높음) . 그러나 최신 스크립트에서는 [[실제로는 파일이 아니지만 항상 셸 구문의 일부인 or를 대신 사용하는 경우가 많습니다.test[if

PPPS: 말하자면 man- man파일 시스템의 모든 명령을 다루는 기사를 기대하지 마세요. 일부(심지어 "실제", 파일 기반) 명령에 대한 정보가 누락될 수 있으며, 일부 쉘 내장 명령에 대한 정보는 특정 쉘 전용 문서에만 나타나지 않을 수도 있습니다(여기서 test, [, if, 에 대한 정보를 확실히 찾을 수 있음 [[). 그럼에도 불구하고 많은 배포판에는 명시적 및 man기사가 있습니다. (분명한 이유로 인식되지 않습니다. 비슷한 상황을 조용히 처리해야 합니다. 일부 배포판에서는 (닫지 않고) 여전히 도움이 표시되지만 일부 배포판에서는 그렇지 않습니다.)test[--helptesta=--help; test "$a"[ --help]

관련 정보