Zsh、%~の展開を分割する

Zsh、%~の展開を分割する

私はこれに困惑しています。zsh を使用して、文字の展開を単純に分割しようとしています%3~。これは、および/の展開では問題なく機能します。どちらもパスのような文字列です。$(pwd)$PWD

次のコードを使用して文字列を分割しようとしています("${(@s./.)a}")。ここで、 a は またはa=$(pwd)ですa=%3~。このコードも では機能しますpwdが、 では機能しません%3~

私はまだシェル スクリプトに慣れていないのですが、私が理解している限りでは、矛盾はないはずです。何をしても、 の展開を%~適切に分割できません。試したこと:

# Ran from /home/me/code
a=%3~
b=$(pwd)
c=$PWD
d="/test/1/2"

e=$(echo "$a")
f="/$a"

echo $a # ~/code
echo $b # /home/me/code
echo $c # /home/me/code
echo $d # /test/1/2
echo $e # ~/code
echo $f # /~/code

("${(@s./.)a}") # ~/code
("${(@s./.)b}") # home me code
("${(@s./.)c}") # home me code
("${(@s./.)d}") # test 1 2
("${(@s./.)e}") # ~/code
("${(@s./.)f}") # /~/code

実際、zsh は意図的に一貫性を欠いているだけなのではないかと思い始めています。でも、私が何かを見落としているだけなのは確かです。 も試してみました。("${(ps./.)a}")私が読んだところによると、 でも同じ結果になるはずです。 を設定する IFS ベースの分割も試してみましたIFS="/"。繰り返しますが、 は通常の文字列では機能しますが、 では機能しません%~???

編集: 完全を期すために、これは .zsh-theme ファイル内にあります。これはおそらく重要なことだと思います。技術的には私がそれを実行しているのではないので (oh-my-zsh によって実行されています)、そのレベルで何か奇妙なことが起こっているのかもしれません。

答え1

プロンプト エスケープが通常評価されるコンテキストの外でプロンプト エスケープを使用しようとしています。変数には文字列 が含まれており%3~、文字列を分割して を試行します。これは後で/に割り当てられ、zsh によって が展開される%3~%3~想定しています。PS1PROMPT%3~

パラメータ展開を実行し、文字列をプロンプトエスケープのように扱いたい場合は、次のように%3~パラメータ展開フラグを使用できます。%${(%)a}

関連情報