Ticket #21817

二重引用符で囲んだパラメータ展開の中身の扱い

Open Date: 2010-05-20 17:11 Last Update: 2020-09-24 22:11

Reporter:
Owner:
Type:
Status:
Open [Owner assigned]
Component:
MileStone:
(None)
Priority:
3
Severity:
3
Resolution:
None
File:
None
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

Details

現在の yash は "${unset-'$(echo unset)'}" と ${unset-'$(echo unset)'} に対し同じ結果を返す。Bash, zsh, dash, ksh, mksh ではパラメータ展開が二重引用符内にある場合の展開結果が違う。

"${unset-'$(echo unset)'}" -> "'$(echo unset)'" -> "'unset'"
${unset-'$(echo unset)'} -> '$(echo unset)'

また ksh は二重引用符の中で二重引用符を使うと引用が解除され、単語分割の対象となる。

"${unset-"a   b"}" -> a b

Posh は現在の yash と同じ結果を返す。

これに関する動作は POSIX では未規定となっている。Yash の動作は現状でよいか?

Ticket History (3/8 Histories)

2010-05-20 17:11 Updated by: magicant
  • New Ticket "二重引用符で囲んだパラメータ展開の中身の扱い" created
2010-06-14 14:15 Updated by: magicant
  • Severity Update from 5 - Medium to 3
  • Priority Update from 5 - Medium to 3
  • Details Updated
Comment

とりあえず、現状の動作が POSIX に反しているわけではないので、優先度下げ。

2016-03-16 23:51 Updated by: magicant
  • Severity Update from 3 to 5 - Medium
  • Priority Update from 3 to 5 - Medium
Comment

6 年前には「POSIX では未規定」と書いたが具体的な根拠となる箇所が見当たらない。

二重引用符の中のパラメータ展開では、単一引用符は効かずバックスラッシュの効果も一部の文字に限定されるというのが他の多くのシェルの挙動であり、POSIX の規定も単純に読めばそういう意味にとれる。

ただ、 "${a-'foo'}" などの置換系と "${a#'foo'}" などのパターンマッチング系ではまた挙動を変える必要がある。(パターンマッチングでは常に引用符を考慮すべき)

2016-03-18 22:54 Updated by: magicant
Comment

これ "${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 は { または } の直前でのみバックスラッシュの意味を変えていると解釈すべきものだろうか。

2016-03-19 15:54 Updated by: magicant
Comment

次の POSIX でここら辺が明確になる。 http://austingroupbugs.net/view.php?id=221

2018-11-26 00:40 Updated by: magicant
  • Priority Update from 5 - Medium to 3
  • Details Updated
2019-06-02 18:09 Updated by: magicant
  • Priority Update from 3 to 5 - Medium
2020-09-24 22:11 Updated by: magicant
  • Priority Update from 5 - Medium to 3
  • Severity Update from 5 - Medium to 3
Comment

"${unset-'$(echo unset)'}" の結果は #40751 で他のシェルと同様になった。

"${unset-"a b"}" の方はまだ POSIX 的には未規定動作で、yash の動作は元のまま。(ksh とは異なる方)

Attachment File List

No attachments

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login