
POSIXシェルでは、一重引用符は「ハード」引用符にしてはいけませんか?
Bashとは異なり、Dashが内部的にエスケープ文字を処理しているように見えるのはなぜですか?
$ bash --posix -c "echo ['[\\n]']"
[[\n]]
$ dash -c "echo ['[\\n]']"
[[
]]
答え1
一重引用符は同じように動作しますが、echo
異なる方法で実装されます。
sh -c "echo ['[\\n]']"
(何でも)実行時に最初に行われることは、sh
対話型シェルが二重引用符で囲まれた文字列を処理することによって単一のもの\\
です\
。実行のためにシェルに渡される文字列はですecho ['[\n]']
。
この内部シェルecho
(おそらく組み込み)で実行されたコマンドは単一の引数を見ることができ、[[\n]]
改行などのプロセスのCスタイルバックスラッシュエスケープ実装のいくつかの実装がありますが、他のコマンドはそうではありません。echo
\n
それを試してsh -c "printf '%s\\n' ['[\\n]']"
みてくださいなぜprintfがechoより優れているのですか?