| является оператором межпроцессного взаимодействия . Таким образом, неявно, существует подпроцесс, который должен быть создан для анализа и оценки выражения на одной его стороне или другой. Bash и более старые оболочки Bourne создают подпроцесс справа от оператора (чтение из канала), что означает, что любые установленные в нем переменные находятся только в области действия до тех пор, пока этот процесс не завершится (что в данном примере кода является точкой с запятой.
zsh и более новые версии оболочки Korn (по крайней мере, начиная с 93 года, но, возможно, даже до ksh '88) создадут подпроцесс на другой стороне канала (запись в него). ). Таким образом, они будут работать так, как задумал автор этого вопроса. («Как и ожидалось», конечно, очень субъективно. Понимание природы канала должно привести к тому, что он будет вести себя в зависимости от реализации).
Я не знаю, существует ли какое-либо конкретное положение в Posix, Spec 1170 или SuS или любом другом опубликованном стандарте, который требует одну или другую семантику. Однако на практике ясно, что вы не должны зависеть от поведения; хотя вы можете легко проверить это в своих скриптах.