チケット #21817

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

登録: 2010-05-20 17:11 最終更新: 2020-09-24 22:11

報告者:
担当者:
チケットの種類:
状況:
オープン [担当者決定済み]
コンポーネント:
マイルストーン:
(未割り当て)
優先度:
3
重要度:
3
解決法:
なし
ファイル:
なし
投票
点数: 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 の動作は現状でよいか?

チケットの履歴 (8 件中 3 件表示)

2010-05-20 17:11 更新者: magicant
  • 新しいチケット "二重引用符で囲んだパラメータ展開の中身の扱い" が作成されました
2010-06-14 14:15 更新者: magicant
  • 重要度5 - 中 から 3 に更新されました
  • 優先度5 - 中 から 3 に更新されました
  • 詳細が更新されました
コメント

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

2016-03-16 23:51 更新者: magicant
  • 重要度3 から 5 - 中 に更新されました
  • 優先度3 から 5 - 中 に更新されました
コメント

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

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

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

2016-03-18 22:54 更新者: 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 更新者: magicant
コメント

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

2018-11-26 00:40 更新者: magicant
  • 優先度5 - 中 から 3 に更新されました
  • 詳細が更新されました
2019-06-02 18:09 更新者: magicant
  • 優先度3 から 5 - 中 に更新されました
2020-09-24 22:11 更新者: magicant
  • 優先度5 - 中 から 3 に更新されました
  • 重要度5 - 中 から 3 に更新されました
コメント

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

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

添付ファイルリスト

添付ファイルはありません

編集

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする