Zsh の [prompt expansion](http://zsh.sourceforge.net/Doc/Release/Prompt-
Expansion.html) はどのタイミングで行われますか？ 特に、他の通常の
[expansion](http://zsh.sourceforge.net/Doc/Release/Expansion.html)
と比較してどの順番で行われますか？

たとえば Bash 3.2.57
では、次のように長さを調べる関数に[プロンプト用のエスケープ](https://www.gnu.org/software/bash/manual/html_node/Controlling-
the-Prompt.html#Controlling-the-Prompt)が渡すと、エスケープが展開された後の長さが返ってきます。

```

    bash-3.2$ pwd
    /tmp/prompt
    bash-3.2$ cat set_prompt.bash
    length ()
    {
        echo "${#1}"
    }
    
    PS1='$(length \w) \w$ '
    bash-3.2$ source ./set_prompt.bash 
    11 /tmp/prompt$ 
    
```

しかし Zsh 5.7.1 で同様のことをすると、prompt expansion を展開する前に長さを調べているような挙動をします。

```

    prompt % pwd
    /tmp/prompt
    prompt % cat ./set_prompt.zsh
    set -o PROMPT_SUBST
    
    length ()
    {
        echo "${#1}"
    }
    
    PS1='$(length "%d") %d$ '
    prompt % source ./set_prompt.zsh 
    2 /tmp/prompt$ 
    
```

つまり、Bash と Zsh でプロンプト用の expansion の展開タイミングが違うような気がしています。

Zsh の prompt expansion はどのタイミングで行われるのでしょうか？ 上のように Bash と差異があるようなのですが、Bash 同様
command expansion より先に prompt expansion を行うにはどうすれば良いのでしょうか。
CC BY-SA 4.0
2020-04-07T02:30:18.760
65424
2020-04-07T02:30:18.760
19110
question
shellscript zsh
Zsh の prompt expansion を Bash 同様の順番で行うには？
Zsh のドキュメントには以下のように書かれています。

> If the `PROMPT_SUBST` option is set, the prompt string is first subjected to
> _parameter expansion_ , _command substitution_ and _arithmetic expansion_.

したがって、これら 3 つの expansion が行われた後 prompt expansion が行われるようです。

prompt expansion を先に行いたい場合、 `print -P` が使えます。

```

    prompt % pwd 
    /tmp/prompt
    prompt % cat ./set_prompt.zsh
    set -o PROMPT_SUBST
    
    length ()
    {
        echo "${#1}"
    }
    
    PS1='$(length "$(print -P %d)") %d$ '
    prompt % source ./set_prompt.zsh
    11 /tmp/prompt$ 
    
```
CC BY-SA 4.0
2020-04-07T02:30:18.760
65425
2020-04-07T02:30:18.760
19110
65424
answer