`]`의 토큰 식별자는 무엇입니까?


9

배쉬 매뉴얼은 말한다 :

[형식을 사용하는 경우 명령의 마지막 인수는]이어야합니다.

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found

따라서 ]예약어도 아니며 연산자도 아니며 내장 명령도 아닙니다.

토큰으로서 토큰 식별자는 ]무엇입니까? 단어 또는 이름?


4
실제로 [는 다음과 같이 자체 유지 명령입니다. -rwxr-xr-x 1 root root 39552 12 월 3 일 18:14 / usr / bin / [ "병렬"내장도 가능하지만 예를 들어 kill. 일부 시스템 test에서이 명령은 심볼릭 링크 [이거나 그 반대입니다. AFAIK ]는 그 자체로는 아무 의미가 없지만 "닫는"것으로 받아 들여지지 [만 "미적"이유 때문입니다.
Baard Kopperud

5
쉘 언어는 지난 46 년 동안 계층 적으로 성장해 왔으며 내부 일관성은 우선 순위가 아닙니다. 이론적 형식의 언어 프레임 워크에 강제 맞추려고하면 나쁜 시간을 보낼 것입니다.
zwol

이후 [자체에 포함 된 명령 (도), 그것은 보통 그래서 시도 ... 사람 페이지를 가지고 man [및 / 또는 man test( [test같은 명령 할 수있다).
Baard Kopperud

을 고집 시도 ]따옴표 또는 큰 따옴표와 당신은 차이가 없습니다 볼 수 있습니다; 그것은 단지 문자열입니다.
와일드 카드

답변:


21

]보완 [, 그것은 [명령 의 마지막 신호입니다 .

는 AS man페이지는 지적이 사실에 대한 인수입니다 [, 그러나 [끝으로, 특히 그것을 치료하기 위해 발생합니다.

당신은 예를 들어, 다른 명령 폐쇄 패턴과 유사 할 수 있습니다 ;에서 find .. exec.


감사. 의 토큰 유형 / 식별자는 ]무엇입니까?
Tim

8
@Tim ]은이 문맥에서 다른 일반 문자와 다르지 않습니다 (명령에 대한 인수). 이 test명령은 특수하게 처리하지만 명령에 달려 있습니다.
muru

6
문자열 일 뿐이며 [최종 인수가 정확히 같지 않으면 오류가 발생합니다 ].
chepner

19

Bash는 알파벳 문자와는 다른 문자 ( [또는 ]자체)를 취급하지 않습니다 .

이 경우 bash는 "word"를 [보고 해당 이름의 명령을 찾습니다. 파일 시스템을 살펴보면 /bin/[(또는 /usr/bin/[)이 실행 파일로 존재 한다는 것을 알게 될 것입니다 . bash는 또한 효율성을 위해 내장 버전을 제공하지만 구현 세부 사항입니다.

[(에서와 같이, 그 이름을 가진 실행) 명령은 당신이 그것에 통과 마지막 매개 변수가되어야한다는 규칙을 가지고 ]그렇지 않으면 오류가 발생합니다. 이것은 미적으로 기쁘기 때문에 일부일 수 있지만 실수로 잘린 명령으로부터 보호하는 역할도합니다.

이것들이 특별하지 않다는 사실 은 [or 전후에 공백을 생략 할 수없는 이유 ]입니다.


예외 :

  • []같은 단어 내에서 올바른 형식에서 발생하는, 예를 들면 [a-z], 그 다음은 입니다 특별하고 떠들썩한 파티의 글 로빙 규칙이 적용됩니다.
  • [[명령 특별하며 [불가능한 많은 작업을 수행 할 수 있습니다 (그리고 일부 매개 변수 [[ .. ]]는 줄 바꿈과 같이 다르게 처리됨). 대응은 ]]이 명령 이름이 될 수 없습니다 쉘 예약어이며, 다음 특수 처리 종료로도 특별한 [[키워드를.

1
@JacobKrall이 같은 특수 문자가 아닙니다 ;또는 >그냥 내장 명령처럼, cd. 특히, 사용자가 입력하는 경우 [x는이 [특별한 의미가 없습니다.
Barmar

2
@JacobKrall 모든 내장 명령에 적용됩니다. [특별한 명령 이며 특별한 캐릭터 가 아닙니다 .
Barmar

@Barmar : 충분히 공정한; 내 의견을 철회합니다.
Jacob Krall

실제로 ]]보다 더 특별합니다 ]. 사용하는 경우 [그리고 ]그들은 단지 단어입니다. 생략 ]하거나 다른 단어로 바꾸면 bash는 여전히 실행 [되지만 [오류가 발생합니다. 그러나 [[]]시간을 구문 분석에 특별한 처리됩니다. 당신이 교체 한 경우 ]]다른 뭔가, bash는 구문 오류를보고합니다. 그리고 ]]bash 를 생략 하면 다음 줄을 계속 파싱하여 ]].
kasperd

@kasperd 답변이 조정되었습니다.
ams

3

이전 두 답변보다 더 간단히 말하면 실행 해야하는 ]문자열입니다 [.


1
이것은 약간의 코멘트처럼 보입니다 ...
wizzwizz4

@ wizzwizz4, 의견에서 OP의 후속 질문을 고려할 때이 단순성이 그가 필요한 것 같아요.
와일드 카드

@Wildcard 나는 실제로 동의합니다. 이 답변을지지하는 유혹이 있었지만 품질이 낮다고 생각했습니다. (하지만 투표하지 않았습니다!) 마크 업을 개선하기 위해 편집하겠습니다.
wizzwizz4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.