Every $(...), pipeline, and external command in shell init forks a child. On macOS, fork+exec costs tens of milliseconds; a typical .zshrc that runs 50+ substitutions adds hundreds of milliseconds to every new terminal. This latency argument is the explicit design pillar of Roman Perepelitsa’s powerlevel10k and zsh4humans: both projects are engineered to defer or eliminate forks during startup.
The fragility argument is older. Every fork creates a parent that must then wait for SIGCHLD to reap the child. The classic signal() + pause() pattern is a textbook race: if the child exits and SIGCHLD is delivered before the parent enters pause(), the parent can block forever (Stevens, Advanced Programming in the UNIX Environment, ch. 10; Kerrisk, The Linux Programming Interface, ch. 22). The fixes are atomic primitives: sigsuspend(), or Bernstein’s self-pipe trick. Modern shells aren’t immune. A sample of a hung zsh-5.9 process in this codebase (2026-04-30) caught getoutput → waitforpid → signal_suspend → pause while the substitution child had already exited, hanging at SHORT_HOST=$(scutil --get LocalHostName) deep in oh-my-zsh init.
The same engineering rule arrives from two directions. Slow init wastes latency on every terminal open. Fragile init can deadlock when the child is fast enough to win the race. Treat $(...) in shell init as a hazard, not an idiom. The specific call that triggered the deadlock here is one of the layers covered in macOS Hostname Layers.