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

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

당신은 아마도 이것을 알고있을 것입니다포크 폭탄:

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

구문 분석을 위해 여는 중괄호 뒤에 공백을 포함해야 하는 이유가 궁금합니다.

답변1

{}

          { list; }

중괄호 사이에 명령 목록을 배치하면 해당 목록이 현재 셸의 컨텍스트에서 실행됩니다. 하위 쉘이 생성되지 않습니다. 목록 뒤에는 세미콜론(또는 개행)이 필요합니다.

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

//원천

답변2

@rush가 여기에 정확하지만 오해의 소지가 있는 답변을 제공했을 수도 있다고 생각합니다. 포크 폭탄 정의기능라고 불리는 " :". 중괄호 안의 코드는 :함수가 마지막 " "로 호출될 때까지 실행되지 않습니다. 따라서 중괄호는 다음과 같습니다.명령 그룹화그리고 중괄호는기능 본문구문은 동일하지만 의미가 다릅니다.
같은 것에서문서@rush가 인용한 대로:

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

관련 정보