待辦事項 #21817

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

啟用日期: 2010-05-20 17:11 最後更新: 2020-09-24 22:11

回報者:
負責人:
類型:
狀態:
開啟 [Owner assigned]
元件:
里程碑:
(無)
優先權:
3
嚴重程度:
3
處理結果:
檔案:
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

細節

現在の 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
  • 嚴重程度 Update from 5 - 中 to 3
  • 優先權 Update from 5 - 中 to 3
  • Details Updated
評語

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

2016-03-16 23:51 Updated by: magicant
  • 嚴重程度 Update from 3 to 5 - 中
  • 優先權 Update from 3 to 5 - 中
評語

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

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

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

2016-03-18 22:54 Updated by: magicant
評語

これ "${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
評語

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

2018-11-26 00:40 Updated by: magicant
  • 優先權 Update from 5 - 中 to 3
  • Details Updated
2019-06-02 18:09 Updated by: magicant
  • 優先權 Update from 3 to 5 - 中
2020-09-24 22:11 Updated by: magicant
  • 優先權 Update from 5 - 中 to 3
  • 嚴重程度 Update from 5 - 中 to 3
評語

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

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

Attachment File List

No attachments

編輯

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