upvote
I'm just too used to how parsing works in Zsh. For bash and sh, there is indeed should be a semicolon.
reply
In this specific case, echo can't fail to there's no need for any of that:

  [ -z "$1" ] && echo "fail" >&2 && exit 1
reply
Echo will fail here when stderr is closed. For example when the caller of the script pipes stderr to another command and that command exits.
reply