
Ich möchte den folgenden Befehl einfügen (entnommen ausHier) in einer Makefile
. Eine einfache Version meines Makefile
Skripts mit dem Befehl lautet:
copy_files:
sed 's/^/\./' ./input_file | \
rev | \
LC_ALL=C sort -u | \
awk 'p == "" || substr($0,1,length(p)) != p { print $0; p = $0 }' | \
rev | \
sed 's/^\.//' > ./output_file
Mein Problem besteht darin, dass das Symbol make
nicht erkannt wird, wenn ich es mit ausführe:$0
awk: cmd. line:1: p == "" || substr(,1,length(p)) != p { print ; p = }
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: p == "" || substr(,1,length(p)) != p { print ; p = }
awk: cmd. line:1: ^ syntax error
Ich habe erfolglos versucht, der $0
Verwendung zu entkommen. Was ist die Lösung?\$0
Antwort1
Sie waren auf dem richtigen Weg. Um das Dollarzeichen in einem Makefile zu umgehen,Sie müssen verwenden$$
, nicht \$
:
copy_files:
sed 's/^/\./' ./input_file | \
rev | \
LC_ALL=C sort -u | \
awk 'p == "" || substr($$0,1,length(p)) != p { print $$0; p = $$0 }' | \
rev | \
sed 's/^\.//' > ./output_file
Da Sie eine Ausgabedatei unter Verwendung einer Eingabedatei erstellen, sollten Sie Make dies explizit mitteilen:
output_file: input_file
sed 's/^/\./' $< | \
rev | \
LC_ALL=C sort -u | \
awk 'p == "" || substr($$0,1,length(p)) != p { print $$0; p = $$0 }' | \
rev | \
sed 's/^\.//' > $@
Mit dieser Definition wird Make „neu erstellt“, output_file
wenn es fehlt oder input_file
neuer ist. $<
verweist auf die Eingabe(n) (bekannt als Voraussetzungen), $@
verweist auf die Ausgabe (bekannt als Ziel).
Wenn Sie ein copy_files
Ziel möchten, deklarieren Sie es als abhängig von output_file
:
copy_files: output_file
Wenn Ihr Make von falschen Zielen weiß, erwähnen Sie das ebenfalls:
.PHONY: copy_files
copy_files: output_file