쉘 함수 정의 : 여는 중괄호 뒤에 공백이있는 이유는 무엇입니까?


18

아마도 그 포크 폭탄에 대해 알고있을 것입니다 .

 :(){ :|:&};: #WARNING: harmful code

구문 분석을 위해 여는 중괄호 뒤에 공백을 포함시키는 것이 왜 필요한지 궁금합니다.

답변:


13

{}

          { list; }

중괄호 사이에 명령 목록을 배치하면 현재 쉘 컨텍스트에서 목록이 실행됩니다. 서브 쉘이 작성되지 않습니다. 세미콜론 (또는 줄 바꿈) 다음 목록이 필요합니다.

서브 쉘을 작성하는 것 외에도, 역사적 이유 때문에이 두 구조 사이에는 미묘한 차이가 있습니다. 중괄호는 예약어이므로 공백 또는 다른 쉘 메타 문자로 목록에서 분리해야합니다. 괄호는 연산자이며 공백으로 목록에서 분리되지 않더라도 셸에서 별도의 토큰으로 인식됩니다.

// 소스


1
이 페이지의 내 게시물에서 답을 구했습니다. 명령 그룹화가 아닌 함수입니다.
donothingsuccessfully

3
@donothingsuccessfully 함수 본문 명령 그룹입니다.
Gilles 'SO- 악한 중지'

3

@rush가 오해의 소지가 있다면 여기에 올바른 답변을 줄 수 있다고 생각합니다. 포크 폭탄은 " " 라는 함수를 정의합니다 :. 중괄호 안의 코드는 함수가 최종 " :"에 의해 호출 될 때까지 실행되지 않습니다 . 따라서 명령 그룹화로 중괄호와 함수 본문 으로 중괄호 는 구문 적으로 동일하지만 의미가 다릅니다. @rush 인용
과 동일한 문서 에서 :

역사적 이유로 가장 일반적인 사용법에서 함수 본문을 둘러싼 중괄호는 공백 또는 개행 문자로 본문과 분리해야합니다. 중괄호는 예약어이며 공백이나 다른 쉘 메타 문자로 명령 목록에서 분리 될 때만 인식되기 때문입니다. 또한 중괄호를 사용할 때 목록은 세미콜론, '&'또는 줄 바꿈으로 끝나야합니다.


3
아니요, 러쉬의 대답은 맞습니다. 함수 본문 주위의 중괄호는 함수 본문을 제한하지 않을 때와 동일한 구문 요소입니다. 참고 항목 쉘 문법 규칙을 : A는 function_bodyA는 compound_command(플러스 옵션 redirect_list). 공백은 {특수 문자가 아닌 예약어 이므로 필요 합니다.
Gilles 'SO- 악한 중지'

예, 내가 말했듯이 돌진의 대답은 정확합니다. 예, 내가 말했듯이 구문 적으로 동일합니다. 그러나 brace_group함수의 일부와 그렇지 않은 경우 다르게 동작합니다. 나는 후자의 경우를 설명하기 위해 명령 그룹화 를 사용 했으며 이것이 서두의 링크에 설명되어 있습니다.
donothingsuccessfully

2
파서에 중요한 구문이기 때문에 여기서 의미 론적 구별이 중요하지 않다. 실제 답변은 {연산자가 아니라 예약어이며, 단어를 구별하기 위해 다른 단어와 분리해야합니다.
jw013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.