답변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
변경해야 합니까?