echo $(FOO=bar foobar) POSIX 쉘에 결과가 지정되지 않았습니까?

echo $(FOO=bar foobar) POSIX 쉘에 결과가 지정되지 않았습니까?

POSIX 쉘 표준을 이해하려고 합니다.여기

그것을 읽으면서 나는 다음 쉘 명령에서 다음을 발견했습니다.

echo $(FOO=bar foobar)

두 가지 플래그가 있습니다(하위 쉘이 아닌 최상위 쉘용) echo.$(FOO=bar foobar)

이는 유용한 명령 유형이며 전혀 인위적이지 않으므로 결과가 무엇인지 정의해야 합니다. 그러나 표준에 제공된 구문을 사용하여 구문 분석하려고 하면 구문 규칙 7b는 두 번째 토큰을 지정하지 않습니다. 왜냐하면 그 토큰에는 =유효한 이름이 포함되어 있지만 그 이전에는 없기 때문입니다.

그러한 "정상적인" 명령의 결과가 실제로 지정되지 않았습니까? 아직도 이해가 안 되시나요? ?

답변1

예, echo $(FOO=bar foobar)두 개의 마커가 있습니다: echo$(FOO=bar foobar).

첫 번째 태그는 명령이고 두 번째 태그는 확장명입니다 $(…).

명령은 다음과 같이 인식됩니다.1 단계

확장자는 다음과 같이 인식됩니다.5단계

현재 문자가 인용되지 않은 "$" 또는 "`"인 경우 쉘은 매개변수 확장, 명령 대체...에 대한 후보의 시작을 인식해야 합니다.

"ㅏ"명령 대체"더 정확하게:

...명령에 다음이 포함된 경우 명령 대체가 발생해야 합니다.

$(command)

쉘은 다음을 실행하여 명령 대체를 확장해야 합니다.주문하다서브쉘 환경에서바꾸기 명령 바꾸기(텍스트주문하다"$()" 또는 역따옴표 포함) 및 표준 출력주문하다

$(주문하다) 형식, 왼쪽 대괄호부터 일치하는 오른쪽 대괄호까지의 모든 문자로 구성됨주문하다.

그러므로 그것은 명백하다주문하다서브쉘에서 실행되는 것은 다음과 같습니다:

FOO=bar foobar

FOO=bar변수 할당( )과 명령( foobar) 이라는 두 가지 태그도 있습니다 .

이를 실행한 결과주문하다전체가 교체됩니다 $(…).

이것은 모두 유효한 POSIX 구문이며 아무런 문제도 없습니다.

관련 정보