二重引用符で囲んだパラメータ展開の中身の扱い
とりあえず、現状の動作が POSIX に反しているわけではないので、優先度下げ。
6 年前には「POSIX では未規定」と書いたが具体的な根拠となる箇所が見当たらない。
二重引用符の中のパラメータ展開では、単一引用符は効かずバックスラッシュの効果も一部の文字に限定されるというのが他の多くのシェルの挙動であり、POSIX の規定も単純に読めばそういう意味にとれる。
ただ、 "${a-'foo'}" などの置換系と "${a#'foo'}" などのパターンマッチング系ではまた挙動を変える必要がある。(パターンマッチングでは常に引用符を考慮すべき)
これ "${unset-\a"\a"}" をどうするか。(\a の部分はそれぞれ二重引用符の中なのか外なのか)
bash, ksh は \aa と、mksh, zsh, dash は \a\a と、yash は a\a と、出力する。ここは POSIX の解釈が難しい。
しかも "${unset-\}"\}"}" に関しては、bash, ksh は }} と、mksh, zsh, yash は }\} と、dash は \}\} と出力する。これも、\a と \} でバックスラッシュの解釈が違う点を POSIX 的にどう正当化するのか悩ましい。XSH 2.2.3 には、バックスラッシュで { と } をエスケープできるとあるので、\}\} を出す dash の挙動は認められない。XSH 2.2.3 は { または } の直前でのみバックスラッシュの意味を変えていると解釈すべきものだろうか。
次の POSIX でここら辺が明確になる。 http://austingroupbugs.net/view.php?id=221
"${unset-'$(echo unset)'}" の結果は #40751 で他のシェルと同様になった。
"${unset-"a b"}" の方はまだ POSIX 的には未規定動作で、yash の動作は元のまま。(ksh とは異なる方)
現在の yash は "${unset-'$(echo unset)'}" と ${unset-'$(echo unset)'} に対し同じ結果を返す。Bash, zsh, dash, ksh, mksh ではパラメータ展開が二重引用符内にある場合の展開結果が違う。
また ksh は二重引用符の中で二重引用符を使うと引用が解除され、単語分割の対象となる。
Posh は現在の yash と同じ結果を返す。
これに関する動作は POSIX では未規定となっている。Yash の動作は現状でよいか?