Zsh 중첩 명령 매개변수 $SLVL이 잘못되었나요?

Zsh 중첩 명령 매개변수 $SLVL이 잘못되었나요?

Zsh 버전 5.2에서 내가 관찰한 동작 중 일부가 내가 우연히 발견하고 문의한 또 다른 가능한 버그와 관련이 있는지 궁금합니다.이전 질문.

아래 코드:

zsh -c "zsh -c 'zsh -c \"echo \$SHLVL\"'"

에코가 2나왔습니다 $SHLVL. 이것을 다음과 비교해보세요:

sh -c "zsh -c 'zsh -c \"echo \$SHLVL\"'"

3어딘가에서 메아리가 들립니다 $SHLVL.

이것은 내가 하고 있는 일과 비슷한 버그일 가능성이 있나요?이전 질문?

답변1

조금 단순화해 보겠습니다.

$ SHLVL=1 zsh -c 'echo $SHLVL; zsh -c "echo \$SHLVL"'
2
2
$ SHLVL=1 zsh -c 'echo $SHLVL; zsh -c "echo \$SHLVL"; true'
2
3

마지막 명령이 외부 명령인 경우 zsh는 분기 없이 이를 실행합니다(테일 호출 최적화). $$다음 사항 외에 에코를 통해 이를 관찰할 수 있습니다 SHLVL. 첫 번째 경우에는 zsh에 대한 중첩된 호출이 동일한 PID를 갖습니다. 두 번째 경우에는 상위 프로세스가 뒤에 남아 실행되기 때문에 중첩된 호출이 하위 프로세스로 실행됩니다 true.

sh다르게 동작하기 때문에 다른 동작을 보게 될 것입니다 . 어쩌면 귀하의 것이 sh테일 콜 최적화를 수행하지 않는 bash일 수도 있습니다. 아니면 tail call 최적화를 수행하는 ksh93일 수도 있지만 SHLVL이 경우에도 증가합니다.

SHLVL꼬리 호출 시 zsh를 증가시켜야 합니까 ? 이에 대한 공식적인 표준은 없지만 테일 콜이 최적화로 간주되고 프로세스 스케줄링 외에는 동작이 동일할 것으로 예상하므로 의미가 있습니다. ATT ksh가 다르게 동작한다는 사실은 zsh가 이를 수행해서는 안 된다는 것을 의미합니다. 그럼 다시,

$ SHLVL=1 ksh -c 'echo $SHLVL; exec ksh -c "echo \$SHLVL"'
2
3

SHLVL명시적인 ksh93 을 사용해도 증가하는데 exec, 이는 말이 되지 않는다고 생각합니다. 쉘이 교체되면 왜 SHLVL변경해야 합니까?

관련 정보