主流のPOSIX互換シェルで二重引用符内の特殊文字をエスケープする動作がPOSIXと一致しませんか?

主流のPOSIX互換シェルで二重引用符内の特殊文字をエスケープする動作がPOSIXと一致しませんか?

~によるとPOSIX シェルコマンド言語ページ:

\

<backslash>エスケープ文字としての特別な意味は、次のいずれかの文字が続く場合にのみ保持する必要があります(エスケープ文字(バックスラッシュ)を参照)。特別だと思うとき:

$ ` " \ <newline>

私はこれを5つの特殊文字のうちの1つだけエスケープする必要があるという意味で解釈します\(与えられたコンテキストで特殊文字の場合)。

ash、dash、bash、kshのマニュアルページには、「特別と見なされる場合」の節は含まれていません。これは、\5つの文字のうちの1つが特定の文脈で特別でない場合でも、この5つの文字を無条件にエスケープする効果があるという意味(そして基本的な実験によって確認された)だと思います。

考慮された出力$ printf '%s\n' "\abcde"\abcdeつまりこれはaこの場合(またはその問題に対するすべての場合)、特別ではないために期待されるものであるため、\特別ではなく文字通り処理されます。

ここで出力を考えてみ$ printf '%s\n' "\\abcde"ましょう\abcde。これは私が期待する動作ではありません。私の例では、文字列の最初のバックスラッシュ\\abcdeも文字通り処理する必要があるようです。それに続く\文脈上\特別ではないからです。私が望む出力は\\abcde

予期しない動作が表示される別のシナリオは、出力です$ printf '%s\n' "ab\$"。つまり、ab$私の考えでは$、この場合、パラメータ拡張、コマンド置換、または算術拡張の導入に役立つので、特別な意味があります。したがって、私の考えには、それが続く文脈が特別ではない\ので、文字通り受け入れなければならないと思う。私が望む出力は。$$ab\$

記録のために、私はここで完全に外れたことを願っています。これにより、特定の状況でのみこの5文字を​​脱出できるかどうか心配する必要がありました。私はできるだけ正確にしようとしていますが、主流のPOSIX\互換シェルでは、この(個人的に望む)動作がPOSIXと互換性がない場合は、この5つの特殊文字のエスケープ処理に無条件に依存したくありません。

ベストアンサー1

このメモテキスト削除の提案特別だと思うとき

注:提案された修正セットは0000998に提供されています。

また、このメモには、変更が2012年8月30日に承認されたことが報告されています。

なぜまだそんなのか分からない現在の表現に使用

この文章は忘れてもいいと思います。

おすすめ記事