2017-07-14 3 views
0

Dies gibt mir einen Fehler, der, obwohl es aufgrund der .IGNORE-Anweisung ignoriert wird, es ärgerlich ist. Der Fehler wird angezeigt, wenn $ (Basisname $ <) .err nicht vorhanden ist. Die Linie im Rezept sieht wie folgt aus:Makefile doppelt Ampersand (&&) gibt einen Fehler

[ -r "$(basename $<).err" ] && mv -f $(basename $<).err anotherName.err 

Ich denke, die eckige Klammer Test ist falsch und dies wird durch make als Fehler interpretiert.

Antwort

1

Sicher. Der Test schlägt fehl, wodurch der Ausdruck mit einem Exit-Code ungleich 0 (false) beendet wird, wodurch Interpreter zu einem Fehler werden.

können Sie entweder invertieren den Test:

[ ! -r "$(basename $<).err" ] || mv -f $(basename $<).err anotherName.err 

oder eine "else true" hinzufügen:

[ -r "$(basename $<).err" ] && mv -f $(basename $<).err anotherName.err || true 
+0

Great !!. Das hat funktioniert. Ich habe das ** || benutzt true ** am Ende, um die Lesbarkeit zu erhalten. –

+0

Übrigens habe ich zuvor versucht, den ganzen Befehl in eine Shell wie diese ** $ (Shell ...) ** zu schreiben, und das Ergebnis war, dass das ** mv -f ** nicht passiert, wenn die Datei das tut existiert. Das ist komisch, ich habe dafür keine Erklärung. –

+0

Ich müsste die tatsächliche Änderung sehen, die Sie vorgenommen haben. Aber im Allgemeinen ist es immer eine schlechte Idee, '$ (shell ...)' in einem Rezept zu verwenden. Es ist bereits verwirrend genug, dass es einige Dinge gibt, die von make und einige von der Shell ausgewertet werden ... das Hinzufügen einer neuen Ebene, die von make ausgewertet wird und die Shell, bevor der Rest von der Shell ausgewertet wird, ist nur Wahnsinn. – MadScientist