私は次のエラーを理解しようとして数時間を費やしました。
私のスクリプト
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