私の find(+sed) コマンドが端末では動作しますが、makefile では動作しないのはなぜですか?

私の find(+sed) コマンドが端末では動作しますが、makefile では動作しないのはなぜですか?

次のコマンドがあります。

find stdlib/main -type f -exec sh -c "echo {} | sed -e 's/stdlib\/main\///g' -e 's/\.q//g' -e 's/\//\./g' -e 's~^~/resource:\"{},~g' -e 's/$/\"/g'" \;

目的は、stdlib/main(およびサブディレクトリ)ですべてのファイルを見つけ、次のようにフォーマットすることです。{filename},{filename-with-stdlibmain-removed-and-extension-removed-and-slashes-changed-to-dots}

直接コマンドを実行すると、コマンドは完全に実行されます。しかし、私はメイクファイルで使用しようとしています。

STDLIB_RESOURCES=$(shell find stdlib/main -type f -exec sh -c "echo {} | sed -e 's/stdlib\/main\///g' -e 's/\.neo//g' -e 's/\//\./g' -e 's~^~/resource:\"{},~g' -e 's/$/\"/g'" \;)

makefileを実行すると、見つかったすべてのファイルに対して次のいずれかのエラーが発生します。

sed: -e expression #5, char 5: unterminated `s' command

私がここで何を見逃しているのでしょうか?

ベストアンサー1

あなたが見逃している最も重要なのは$特殊文字を作ることであり、MakeとShellの引用が異なります。

例えば

's/$/\"/g'

``内部のすべてをシェルで保護しますが(\しかし不要な作業も実行します)、そうではないので、次のように見えます。

 's/\"/g' 

名前付き変数がないと仮定します/(makeでは可能ですが、通常はシェルでは不可能です)。

最初にやるべきこと$はに置き換えることです$$

おすすめ記事