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

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

아마 당신도 그걸 알고 있을 거예요포크 폭탄:

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

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

답변1

{}

          { list; }

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

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

//원천

답변2

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

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

관련 정보