次のコマンドがあります。
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では可能ですが、通常はシェルでは不可能です)。
最初にやるべきこと$
はに置き換えることです$$
。