Certifique-se de que a opção promptvars esteja ativada (por padrão). Em seguida, insira o código desejado em PROMPT_COMMAND para definir uma variável contendo exatamente o que você deseja no prompt.
PROMPT_COMMAND='prompt_status="$? "; if [[ $prompt_status == "0 " ]]; then prompt_status=; fi'
PS1='$prompt_status\h \w \$ '
No zsh, você pode usar sua construção condicional em PS1 (bash não tem equivalente).
PS1='%(?,,%? )%m %~ %# '