sh -c:終了していない引用文字列エラー[重複]

sh -c:終了していない引用文字列エラー[重複]

私は次のエラーを理解しようとして数時間を費やしました。

私のスクリプト

CMD="sh -c 'echo \"a\"'"
$CMD

間違い:

"a"': 1: "a"': Syntax error: Unterminated quoted string

もちろん、このようにしてecho $CMD結果を貼り付けると、期待どおりに機能します。

エラーが発生したのはなぜですか?

編集する:

回避策ではなく説明を要求します。だから、次のリンクが私の質問に答えないと思います。 関数内で参照するとエラーが発生します。

答え1

これはうまくいきません。シェルが単語分割を実行すると、次のようになります。4つ議論:

sh
-c
'echo
"a"'

これを行うには、bash配列を使用する必要があります。

cmd=( sh -c 'echo "a"' )
"${cmd[@]}"

答え2

ここで最大の間違いは、周囲の一重引用符がシェル実行'echo \"a\"'の「単語の分離」を停止し、echo "a"それを単一の引数としてshに渡すと考えることです。

この場合、一重引用符は外側の二重引用符で囲まれているので、実際には「文法」ではなく「文字」と見なされます。

次のリンクが私にとって最大の役に立ちました。http://mywiki.wooledge.org/Arguments

関連情報