Это была ошибка (регрессия), введенная в 1999 г. , которая изменила и теперь исправлена ( это изменение ( commit ))
В основном, в:
(cmd1; cmd2)
zsh
разветвляет дочерний процесс для подоболочки, затем другой процесс для cmd1
. Но для cmd2
, учитывая, что это последняя команда в подоболочке, zsh
оптимизирует вилку. Это как если бы мы сделали:
(cmd1; exec cmd2)
Или, другими словами, zsh
выполняет здесь неявный / fake exec
.
Теперь ошибка заключалась в том, что в этом случае zsh
забыл , что мы были в подоболочке, и предположил, что неявный exec
на самом деле завершал оболочку (заменяя ее на cmd2
), а затем уменьшал $ SHLVL
, поскольку родительский элемент cmd2
не был zsh
больше.
Однако здесь мы находимся в подоболочке, так что неявный exec
не завершает оболочку.
Спасибо, что подняли этот вопрос. Это позволило исправить это и найти связанные ошибки в bash
и tcsh
.