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


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.