!["/bin/["은 정확히 어떻게 작동하나요?](https://linux55.com/image/102863/%22%2Fbin%2F%5B%22%EC%9D%80%20%EC%A0%95%ED%99%95%ED%9E%88%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%9E%91%EB%8F%99%ED%95%98%EB%82%98%EC%9A%94%3F.png)
폴더에 프로그램이 /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 {} ] \; -print
perl
순서 [
는 이름으로도 알려져 있습니다 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 --help
true
[
-f file
-n string
옵션하지만피연산자.
모든 최신 Bourne 스타일 쉘 인터프리터(예: bash
, ksh
, dash
및 zsh
등) 는 내부적으로 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이 지적했듯이 구문 오류가 발생합니다 .0
1
2
그 위치는 시스템에 따라 다르며, 매뉴얼 페이지를 볼 때 왜 보이지 않는지도 설명합니다 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/test
enable -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
[
--help
test
a=--help; test "$a"
[ --help
]