Im sauberen Bereich von Makefile
versuche ich zu überprüfen, ob die Datei vorhanden ist, bevor ich sie dauerhaft lösche. Ich benutze diesen Code, erhalte aber Fehler.
Was stimmt damit nicht?
if [ -a myApp ]
then
rm myApp
fi
Ich erhalte diese Fehlermeldung
if [ -a myApp ]
/bin/sh: Syntax error: end of file unexpected (expecting "then")
make: *** [clean] Error 2
rm -rf myApp
könnte dies eine Alternative sein. Oder stellen Sie dem Befehl einen Bindestrich (-rm myApp
) voran , damit make den Fehler von rm ignoriert (es wird jedoch eine hässliche Nachricht ausgegeben).Antworten:
In der zweiten Top-Antwort
ifeq
wird jedoch nicht erwähnt, dass diese auf derselben Ebene wie der Name des Ziels liegen müssen. Um beispielsweise eine Datei nur dann herunterzuladen, wenn sie derzeit nicht vorhanden ist, kann der folgende Code verwendet werden:quelle
Es ist seltsam zu sehen, dass so viele Leute dafür Shell-Scripting verwenden. Ich habe nach einer Möglichkeit gesucht, die native Makefile-Syntax zu verwenden, da ich diese außerhalb eines Ziels schreibe. Mit der
wildcard
Funktion können Sie überprüfen, ob eine Datei vorhanden ist:Aktualisieren:
Ich habe einen Weg gefunden, der wirklich für mich funktioniert:
quelle
Makefile:133: *** unterminated call to function `wildcard': missing `)'. Stop.
$(wildcard pattern)
tatsächlich tut. Siehe Link .FILE_EXISTS := $(or $(and $(wildcard $(PATH_TO_FILE)),1),0)
Das Problem ist, wenn Sie Ihren Befehl auf mehrere Zeilen aufteilen. Sie können also entweder das
\
am Zeilenende für die Fortsetzung wie oben verwenden oder alles in einer Zeile mit dem&&
Operator in bash abrufen.Anschließend können Sie mit einem
test
Befehl testen, ob die Datei vorhanden ist, z.oder nicht:
Das
test
entspricht dem[
Befehl.und es würde wie in Ihrem ursprünglichen Beispiel funktionieren.
Siehe:
help [
oderhelp test
für weitere Syntax.quelle
-s
ein Sonderfall für istexists and has a size greater than zero
. Die geschriebene Frage ist größenunabhängig, daher sollte die Existenz anhandtest -e
einer Datei oder-d
eines Verzeichnisses überprüft werden . Leere Dateien können besonders nützlich sein (aus Mangel an einem besseren Begriff) Indikatoren / Sentinels, die für sehr relevant sein könnenmake
.-f
Standardmäßig geändert , da es häufiger verwendet wird.test
unter Windows?|| true
am Ende hinzufügen, damit der Befehl true zurückgibt, wenn die Datei nicht vorhanden ist.test -f myApp || CMD
, beachten Sie die||
, also wenn-f
fehlschlägt - nicht existiert (||
), dann führen Sie den Befehl aus. Macht das Sinn?Für die Fortsetzung ist möglicherweise ein Backslash am Ende der Zeile erforderlich (obwohl dies möglicherweise von der Version von make abhängt):
quelle
make
einer neuen Zeile ein neuer Bash-Befehl. Die größte Einschränkung davon, abgesehen von dem Ärger, viele\
am Ende der Zeilen zu haben, ist, dass jeder Befehl mit dem beendet werden muss,;
was sonst in bash impliziert wäre.Oder setzen Sie es einfach in eine Zeile,
make
wie es Ihnen gefällt:quelle
Ein Semikolon fehlt
Ich gehe jedoch davon aus, dass Sie vor dem Löschen auf Existenz prüfen, um eine Fehlermeldung zu vermeiden. Wenn ja, können Sie einfach verwenden,
rm -f myApp
welche "erzwingt" das Löschen, dh kein Fehler, wenn die Datei nicht vorhanden ist.quelle
Ausführungsergebnisse:
quelle
echo -n yes
den Erfolgtest
der Zeichenfolgeyes
ohne NL. Derifeq
kann es dann mit dem fest codierten vergleichenyes
. Alles nur, weilifeq
eine Zeichenfolge verglichen werden soll, nicht der Erfolgsstatus eines Shell-Befehls.Einzeilige Lösung:
Einzeilige Lösung mit Fehleraktion:
Beispiel in meinen
make clean
Anweisungen verwendet:Und
make clean
funktioniert immer ohne Fehlermeldungen!quelle
-rm myfile
der Lead Dash sagt, dass Fehler ignoriert werden sollen.@[ -f 'myfile' ] && rm myfile
"Wenn README.md nicht vorhanden ist, tun Sie nichts (und beenden Sie es erfolgreich). Andernfalls fügen Sie Text an das Ende an."
Wenn Sie
&&
stattdessen verwenden||
, wird ein Fehler generiert, wenn die Datei nicht vorhanden ist:quelle
Ich habe es versucht:
Und der positive Fall hat funktioniert, aber meine Ubuntu-Bash-Shell nennt dies WAHR und bricht auf der Kopie ab:
Nachdem ich diesen Fehler erhalten habe, google ich, wie ich überprüfe, ob eine Datei in make vorhanden ist, und dies ist die Antwort ...
quelle
Diese oben beschriebene Lösung funktioniert am besten. Stellen Sie jedoch sicher, dass Sie die Zuweisung PATH_TO_FILE nicht stringifizieren.
Es muss sein
quelle
Die Antworten wie die von @ mark-wilkins mit \, um die Zeilen fortzusetzen und; Sie in der Shell zu beenden oder wie die von @kenorb, dies in eine Zeile zu ändern, ist gut und wird dieses Problem beheben.
Es gibt eine einfachere Antwort auf das ursprüngliche Problem (wie @ alexey-polonsky hervorhob). Verwenden Sie das Flag -f für rm, damit kein Fehler ausgelöst wird
Dies ist einfacher, schneller und zuverlässiger. Achten Sie nur darauf, dass Sie keinen Schrägstrich und keine leere Variable erhalten
rm -f / $ (myAppPath)# TUN SIE DAS NIEMöglicherweise löschen Sie Ihr System.
quelle
rm
; Übrigens bin ich mir ziemlich sicher, dassrm -f /$(myAppPath)
das auch keinen Schaden anrichtet, da/
es sich um ein Verzeichnis handelt und das-r
fehlt.rm -f
, z. B.rm
eine Variable.