Esse foi um bug (regressão) introduzido em 1999 por essa mudança e agora corrigida (por essa mudança ( confirmar ))
Basicamente, em:
(cmd1; cmd2)
zsh bifurca um processo filho para o subshell e, em seguida, outro processo para cmd1 . Mas para cmd2 , dado que é o último comando no subshell, zsh otimiza o fork. É como se tivéssemos feito:
(cmd1; exec cmd2)
Ou, em outras palavras, zsh faz um implícito / fake exec aqui.
Agora, o erro era que, nesse caso, zsh esqueceu que estávamos em uma subshell e assumimos que implícito exec estava realmente terminando o shell (substituindo-o por cmd2 ) e, em seguida, decrementando $SHLVL , pois o pai de cmd2 não seria mais zsh .
Aqui, no entanto, estamos em um subshell, portanto, implícito exec não está finalizando o shell.
Obrigado por mencionar isso. Isso permitiu corrigi-lo e encontrar bugs relacionados em bash e tcsh .