매개변수 구문 분석 및 확장을 추적하는 방법은 무엇입니까?

매개변수 구문 분석 및 확장을 추적하는 방법은 무엇입니까?

zsh아래 예는 제가 스크립트를 "일상적인 WTF"라고 생각하는 것을 보여줍니다. 나는 zsh이러한 혼란스러운 사례를 스스로 해결할 수 있을 만큼 방대한 양의 규칙을 잘 이해하려는 희망을 거의 포기했지만 여전히 이를 파악하는 데 도움이 될 몇 가지 설정, 기술, 도구 또는 요령을 찾고 싶습니다. . 적어도 무슨 일이 일어났는지 분석할 수 있게 도와주세요. 일부 코드를 단계별로 실행하거나 실행 추적을 확인하기 위해 디버거를 사용하는 것과 본질적으로 유사합니다.


나는 이것이 현재 환경에서 정의되지 않은 식별자 에 대한 ${(%):-%x}귀여운 약칭이라고 생각합니다. 실제로 다음이 사실인 것 같습니다.${(%)NONEXISTENT:-%x}NONEXISTENT

# /tmp/test
echo "${(%)NONEXISTENT:-%x}"
echo "${(%):-%x}"

결과:

% zsh /tmp/test
/tmp/test
/tmp/test

그래서 같은 토큰으로, 나는 그것이 ${(%)-%x}단지 의 귀여운 약칭이라고 생각합니다 ${(%)NONEXISTENT-%x}.

지금쯤 예상하셨겠지만, 제가 틀렸습니다. 이는 이전에 표시된 스크립트를 몇 줄로 확장한 다음 스크립트에 나와 있습니다.

# /tmp/test
echo "${(%)NONEXISTENT:-%x}"
echo "${(%):-%x}"
echo "${(%)NONEXISTENT-%x}"
echo "${(%)-%x}"

결과:

% zsh /tmp/test
/tmp/test
/tmp/test
/tmp/test
569X

더 이상하게도 세부 사항은 스크립트가 실행되는지 또는 스크립트의 출처에 따라 달라집니다.

% source /tmp/test
/tmp/test
/tmp/test
/tmp/test
5679BJTVXgim

답변1

zsh문서에는규칙 섹션매개변수 확장을 적용하는 방법에 대해 설명합니다. 쉘이 무엇을 할 것인지 알아내기 위해 그것을 고수할 수 있습니다(내가 아는 어떤 디버거도 이것을 할 수 없습니다).


당신이 생각하는 것이 옳지만 공식적으로는 그렇지 않습니다 ${(%)-%x}.$-쉘 특수 변수, 이는 쉘 옵션으로 확장됩니다.

따라서 에서 쉘은 결과 ${(%)-%x}%플래그를 적용 하고 후행 $-리터럴 문자를 제거합니다.x

관련 정보