Hier passiert einiges. Die erste ist, dass, wenn Sie haben:
MyTarget: $(MySources)
LINE='$(shell cat $< | grep GIMME_THE_LINE_I_WANT)'
Sie sind ein LINE
, kein make
Variable namens Shell variable Einstellung. Die Build-Anweisungen für ein Ziel sind Shell-Befehle. Nach der ersten Zeile enthält die Shell-Variable $LINE
GIMME_THE_LINE_I_WANT
. Allerdings ...
... jeder Zeile in den Build-Anweisungen für ein Ziel läuft in einem separaten Shell-Prozess. Also, wenn Sie haben:
mytarget:
MYVAR=foo
echo $$MYVAR
Sie keine Ausgabe sehen werden, weil $MYVAR
wird im Rahmen des zweiten Befehls nicht gesetzt. Beachten Sie auch die Verwendung von $$
hier, denn sonst würde die $
von Make interpretiert werden (das heißt, Schreiben $MYVAR
wäre eigentlich der Make-Ausdruck $M
gefolgt von dem Text YVAR
). Sie können dies beheben, indem logisch Ihre Linien zu einem einzigen Shell-Skript verbinden, wie folgt aus:
mytarget:
MYVAR=foo; \
echo $$MYVAR
Die \
ist Makefile-Syntax, die eine einzelne logische Zeile über mehrere physikalische Leitungen erstreckt, und natürlich ;
einfach Shell ist Syntax für Kombinieren mehrerer Befehle in einer Zeile.
Mit all diesem Hintergrund konnten wir Ihr Ziel wie folgt umschreiben:
MyTarget: $(MySources)
LINE=$$(cat $< | grep GIMME_THE_LINE_I_WANT); \
CH9=$$(echo $$LINE | cut -b9); \
echo $$CH9
Beachten Sie, dass da wir bereits ein Shell-Skript ausgeführt Ich bin nicht $(shell ...)
Konstrukts ist verwenden und dass ich m Stellen Sie sicher, alle $
Zeichen zu entkommen, um sicherzustellen, dass die Shell, nicht Make, die variable Expansion behandelt.
Wenn Sie nur ein wenig weiter gehen, müssen Sie cat
in diesem Skript nicht verwenden; schreiben Sie könnten einfach:
MyTarget: $(MySources)
LINE=$$(grep GIMME_THE_LINE_I_WANT $<); \
CH9=$$(echo $$LINE | cut -b9); \
echo $$CH9
Oder:
MyTarget: $(MySources)
CH9=$$(grep GIMME_THE_LINE_I_WANT $< | cut -b9); \
echo $$CH9
(NB: Während nicht relevant zu dieser Lösung, es ist zwar bemerkenswert, dass jeder Aufruf von $(shell ...)
auch in einem separaten Prozess ausgeführt wird, so dass ein Variable in einem gesetzt wird nicht in einem anderen verfügbar sein.)
Gibt es irgendwelche Sonderzeichen in '$ (LINE)'? Sie sollten es z. 'Shell Echo '$ (LINE)' ' – Barmar
Nebenbei bemerkt, dass [' cat' ist nutzlos] (http://www.iki.fi/era/unix/award.html) – tripleee