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
.